设为首页 收藏本站
查看: 1289|回复: 0

[经验分享] FLEX4 在Spark皮肤中定义与使用新的皮肤机制2-RIA700

[复制链接]

尚未签到

发表于 2019-1-31 07:33:04 | 显示全部楼层 |阅读模式
  声明一个新的skin part
  如果你希望你的自定义组件具有换皮肤能力,可以直接在组件中声明。在组件的脚本部分用SkinPart元数据标签来声明。例如,PowerWindow组件允许用户定制关闭与最小化按钮的皮肤。SkinPart元数据标签需要一个参数,这个参数是必须的,它决定紧跟之后的skin part是否为编译器必须项。例如,PowerWindow组件中的关闭按钮:

  • [SkinPart(required="true")]
  • public var closeIcon:Button;
复制代码  上面的代码将创建一个名为closeIcon的skin part,在稍后的皮肤中你要实现它(事实上你必须要这样做),正如上述示例。
  配合skin state皮肤状态使用skin part
  如组件一样,皮肤部件也有状态。一个按钮:在没有交互时它处于常态(名为UP弹起状态),若你的鼠标经过它,它会更改外观,同样当你按下按钮和禁用按钮时也会更改外观。在API文件中你可以找到Spark组件这些状态。图4显示了按钮组件的皮肤状态:disabled, down, over, 和 up。要显示一个组件有哪些状态,可以点击Skin States链接来查看(见图4)。
  图4 按钮皮肤状态:diabled, down, over, 和 up
  在皮肤中使用这些状态,你可以根据皮肤自身的状态在同一皮肤之内会有不同外观。宿主组件以及在皮肤中的组件都可以定义状态。
  在组件中,用SkinState元数据标签声明状态,只需要传递一个表示状态名称的参数。

  • [SkinState("up")]
  • [SkinState("over")]
  • [SkinState("down")]
  • [SkinState("disabled")]
复制代码  在皮肤中,使用状态标签,用State对象的数组填充其中,就像在组件中声明视图状态一样。这些状态将被放置到皮肤里边,为宿主组件中声明的每个状态。例如:

  • states>
  •   State name="up" />
  •   State name="over" />
  •   State name="down" />
  •   State name="disabled" />
  • states>
复制代码  关联部件与状态
  一旦你在皮肤中已经声明了所有状态,你可以使用点符号或includeIn和excludeFrom属性来指定当皮肤状态更改时你的皮肤部件将如何表现。
  例如,在down状态时改变按钮文本的颜色,你可以这样写:

复制代码  这样皮肤自身就能完成这个动作。在按钮中若你想要设置透明度为0.5,可标记皮肤元素的根标签:


复制代码  在你的皮肤中使用的任何GraphicElement组件(包括文本组件如Label),可用includeIn 和 excludeFrom属性来指定自身被用于哪些状态中。当按钮处于over和down状态时添加一个背景(你可以按你喜欢指定),将需要添加一个新图形元素再接着用includeIn属性来指定用于哪些状态。


  •   
  •    
  •   

复制代码  而excludeFrom属性工作方式一样,只是具有相反效果。它让对象在指定状态不能使用。
  在PowerWindow组件中揉合所有和皮肤
  PowerWindow具有自定义皮肤组件(PowerWindow.as)其默认皮肤(PowerWindowSkin.mxml)如图5所示。
  图5 PowerWindow组件最大化后
  PowerWindow组件继承自Spark Panel类,并声明其事件与功能。为了实现指定皮肤和皮肤功能,该皮肤类将在skinClass属性里声明,所有skin parts在类中用SkinPart元数据标签声明。注意只有关闭图标是必须的,这样就允许在没有最小化与重新调整尺寸的情况下皮肤在窗口上仍能使用。

  • package com.adobe.examples.sparkskinparts
  • {
  •   import spark.components.Panel;
  •   import mx.events.ResizeEvent;
  •   import spark.components.Button;

  •   public>
  •   {
  •     // declare the skin parts - only close is required
  •     [SkinPart(required="true")]
  •     public var closeIcon:Button;
  •     [SkinPart(required="false")]
  •     public var minimizeIcon:Button;
  •     [SkinPart(required="false")]
  •     public var resizeGripper:Button;

  •     public function PowerWindow()
  •     {
  •       super();
  •     }
  •     // add event listeners by overriding partAdded method
  •     override protected function partAdded(partName:String,instance:Object):void
  •     {
  •       // call super method
  •       super.partAdded(partName,instance);

  •       // now add listeners
  •       if ( instance == closeIcon )
  •       {
  •         closeIcon.addEventListener(MouseEvent.CLICK, close);
  •       }
  •       if ( instance == resizeGripper )
  •       {
  •         resizeGripper.addEventListener(MouseEvent.MOUSE_DOWN, resize);
  •       }
  •     }
  •     // dispatch close event (parent will handle)
  •     private function close(event:MouseEvent):void
  •     {
  •       this.dispatchEvent(new Event(Event.CLOSE));
  •     }
  •     // dispatch resize event (parent will handle)
  •     private function resize(event:MouseEvent):void
  •     {
  •       var resizeEvent:ResizeEvent = new ResizeEvent(ResizeEvent.RESIZE,false,false,this.width,this.height);
  •       this.dispatchEvent(resizeEvent);
  •     }
  •   }
  • }
复制代码  你会看到每个skin parts一旦添加就是可以直接进行访问的——毕竟它们是公有变量,所以它们可以被用来添加事件监听器以处理无论什么组件广播的事件。具体来说,关闭功能将广播一个事件以告诉父级处理该功能,若移除该组件将根据父级是否已经实例化该组件(例如弹出或在组件中)。如果你愿意,重新调整大小处理方式一样,但你可能要给皮肤添加这个功能。(我已在where to go from here节包含有链接会向你说明如何处理)
  你还会注意到最小化功能缺失。这是因为你将要从皮肤本身内部执行。
  Relating parts to states
  皮肤实际上包括组件本身皮肤定义。所有按钮的皮肤由BitmapImage图元组成,以及在每个皮肤中用alpha.disabled属性定义禁用状态的透明度为0.5。虽然创建这些皮肤整个过程需要的时间超过直接使用图像对象的时间,但它提供了灵活性和控制权力,因为这些按钮都内置的有皮肤状态。若谁想要用这个面板可以为这些按钮创建新的皮肤就能够产生一种焕然一新的感觉,若你不需要这种效果也就不需要重写皮肤组件了。
  CloseButtonSkin.mxml




  •   
  •     [HostComponent("spark.components.Button")]
  •   

  •   
  •    
  •    
  •    
  •    
  •   

  •   


复制代码  在元数据标签中声明宿主组件。这将匹配skin parts并确保所有必须部件都是存在的。
  PowerWindow皮肤包括所有必须的和所有可选的部件,它们都是按钮放置在PowerWindowSkin.mxml文件底部。该皮肤声明了正常和最小化状态,以及必须的up,over,down,disabled状态。而minimizeIcon在MXML中有点击事件监听器,当点击它,它将会调用minimizeRestore函数,更改用hostComponent区域中声明的宿主组件的高度,接着设置currentState属性,更改皮肤的状态可能是normal或 minimize。尽管你可以在Spark Skins构建许多皮肤功能,但要小心的是尽量不要给稍后的使用者增加难度。
  图6 PowerWindow组件最小化后
  下面是最小化按钮的代码:


  •     right="{closeIcon.width + 10}" top="5"
  •     skinClass="com.adobe.examples.sparkskinparts.MinimizeButtonSkin"
  •     skinClass.minimized="com.adobe.examples.sparkskinparts.RestoreButtonSkin"
  •     click="minimizeRestore(event)"/>
复制代码  当处于最小化状态时skinClass.minimized属性标明使用一个不同的皮肤(会替代最小化,显示一个恢复按钮)。
  当皮肤处于最小化状态时,在resizeGripper实例上也可以用excludeFrom属性来移除最小化按钮。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-669793-1-1.html 上篇帖子: FLEX4 在Spark皮肤中定义与使用新的皮肤机制3-RIA700 下篇帖子: (版本定制)第7课:Spark Streaming源码解读之JobScheduler内幕实现和深度思考
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表