如何创建一个Spark图标按钮和皮肤

本文介绍如何在Flex4的Spark组件中创建带有图标的按钮。通过定义IconButton类及相应皮肤,实现不同状态下的图标变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Flex4中引入了全新的皮肤机制:Spark,那么在这个教程里将带领大家制作一个Spark的图标按钮,原文地址:

http://www.themorphicgroup.com/blog/2009/06/18/how-to-create-a-spark-ico...

在使用MXML2009的Spark组件的时候,你可能已经注意到,按钮并没有一个“icon”的属性可供设置。所以如果你想让这个按钮显示一个图标,应该怎么办呢?

一个解决方法是把这个图标放到你的按钮的皮肤里面,但是它要求你必须创建多个皮肤和多个图标。

另一个解决方法是把一个图片组件作为按钮。当然,这个按钮我们也要实现在不同的鼠标状态下,显示不同的图标。我们可以使用鼠标事件的侦听器来切换图片组件的源地址。遗憾的是,图片中的透明像素部分,可能是导致鼠标事件不能正常工作的原因。要避免这个问题,我们需要遵循以下的步骤来创建一个自定义的组件。

创建一个新的IconButton类,并扩展自spark.components.Button

 

  
  1. package com.tmg.components
  2. {
  3. import spark.components.Button;
  4.  
  5. //icons
  6. [Style ( name= "iconUp", type= "*" ) ]
  7. [Style ( name= "iconOver", type= "*" ) ]
  8. [Style ( name= "iconDown", type= "*" ) ]
  9. [Style ( name= "iconDisabled", type= "*" ) ]
  10. //paddings
  11. [Style ( name= "paddingLeft", type= "Number" ) ]
  12. [Style ( name= "paddingRight", type= "Number" ) ]
  13. [Style ( name= "paddingTop", type= "Number" ) ]
  14. [Style ( name= "paddingBottom", type= "Number" ) ]
  15. public class IconButton extends Button
  16. {
  17. public function IconButton ( )
  18. {
  19. super ( );
  20. }
  21. }
  22. }

 

在这个类的里面,我们定义了样式的元数据标签(Style Metadata),来让Flash Builder知道在添加到这个按钮的样式属性里面,哪些样式是可用的。针对这个组件,我们想允许开发者针对不同的按钮的状态给予不同的图片显示,同时我们也想让开发者可以定义按钮内部的元件与这个按钮的边距。

创建一个mxml的皮肤组件

 

  
  1. <s :SparkSkin
  2. xmlns :fx= "http://ns.adobe.com/mxml/2009"
  3. xmlns :s= "library://ns.adobe.com/flex/spark"
  4. xmlns :mx= "library://ns.adobe.com/flex/halo"
  5. currentStateChanging= "onCurrentStateChanging(event)"
  6. >
  7. <fx :Metadata >
  8. [HostComponent ( "com.freckle.oceania.client.view.components.IconButton" ) ]
  9. </fx :Metadata >
  10. <fx :Script >
  11. <! [CDATA [
  12. import mx.events.StateChangeEvent;
  13.  
  14. private function onCurrentStateChanging (event :StateChangeEvent ) : void {
  15. switch (event.newState ) {
  16. case "up" :
  17. setIcon ( "iconUp" );
  18. break;
  19. case "over" :
  20. setIcon ( "iconOver" );
  21. break;
  22. case "down" :
  23. setIcon ( "iconDown" );
  24. break;
  25. case "disabled" :
  26. setIcon ( "iconDisabled" );
  27. break;
  28. }
  29. }
  30. private function setIcon ( type : String ) : void {
  31. if (hostComponent. getStyle ( type ) != null ) {
  32. icon. source = hostComponent. getStyle ( type );
  33. }
  34. }
  35.  
  36. ] ] >
  37. </fx :Script >
  38. <s :layout >
  39. <s :BasicLayout />
  40. </s :layout >
  41. <s :states >
  42. <s :State name= "up" />
  43. <s :State name= "over" />
  44. <s :State name= "down" />
  45. <s :State name= "disabled" />
  46. </s :states >
  47.  
  48. <s :Rect left= "0" right= "0" top= "0" bottom= "0" width= "69" height= "20" radiusX= "2" radiusY= "2" >
  49. <s :stroke >
  50. <s :SolidColorStroke id= "outline" weight= "1" />
  51. </s :stroke >
  52. <s :fill >
  53. <mx :LinearGradient >
  54. <mx :GradientEntry color= "#ffffff" ratio= "0" />
  55. <mx :GradientEntry color= "#cccccc" ratio= "1" />
  56. </mx :LinearGradient >
  57. </s :fill >
  58. </s :Rect >
  59. <s :Group
  60. horizontalCenter= "0"
  61. verticalCenter= "0"
  62. >
  63. <s :layout >
  64. <s :HorizontalLayout
  65. paddingBottom= "{ hostComponent.getStyle('paddingBottom')}"
  66. paddingTop= "{ hostComponent.getStyle('paddingTop')}"
  67. paddingLeft= "{ hostComponent.getStyle('paddingLeft')}"
  68. paddingRight= "{ hostComponent.getStyle('paddingRight')}" />
  69. </s :layout >
  70. <mx :Image
  71. id= "icon"
  72. source= "{hostComponent.getStyle('iconUp')}"
  73. verticalCenter= "0"
  74. alpha= "{(this.currentState == 'up')?.5:1}"
  75. />
  76. <s :SimpleText
  77. text= "{hostComponent.label}"
  78. verticalCenter= "0"
  79. includeInLayout= "{( hostComponent.label != '' )}"
  80. visible= "{( hostComponent.label != '' )}" />
  81. </s :Group >
  82.  
  83. </s :SparkSkin >

 

首先,你可能已经注意到元数据标签(Metadata tag)声明了一个Hostcomponent。这是非常重要的,因为它可以让皮肤组件知道那些组件会应用这个皮肤。注意Simple Text组件的text属性设置为hostComponent的标签(label)属性。

在这个代码片段中另一个关键的元件是事件的侦听器,用来侦听状态的改变。正如你所猜想的那样,hostComponent会根据不同的鼠标状态来改变按钮的皮肤的状态。通过侦听这个事件,我们可以改变用作图标的图片组件的源地址属性。

让我们来做下一步操作...

使用这个新生成的组件

 

  
  1. <components :IconButton
  2. width= "100%"
  3. iconUp= "assets/images/icons/toolbar/arrow_out.png"
  4. iconDisabled= "assets/images/icons/toolbar/arrow_out_disabled.png"
  5. fontFamily= "Times"
  6. fontWeight= "bold"
  7. skinClass= "com.tmg.skins.IconButtonSkin"
  8. paddingLeft= "5"
  9. paddingTop= "5"
  10. paddingRight= "5"
  11. paddingBottom= "5"
  12. />

 

在使用你创建的这个皮肤的时候,请确保你设置了skinClass属性。在这个示例中我们只是设置了iconUP和iconDisabled属性。因为在之前的代码中我们已经明确了这个皮肤的icon属性,所以这个皮肤只能使用我们已经声明的图标。同样对Label来说,我们同样可以设置皮肤来让label的文本是空的时候不显示文本组件,但是在这个示例里面我们还是让它显示了。

你可以从下面的地址观看这个实例的视频教程:

https://xd.adobe.com/#/videos/video/165

 

本文转自:http://www.riameeting.com/node/310

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值