一.什么是皮肤? 为什么要定义皮肤?
皮肤是用于控制组件的外观的组件,就是说控制组件的所有可视化部分。
将组件的外观和行为分开,通过皮肤可以对可视化部分进行独立的修改,而不影响到组件的底层核心部分。
二.皮肤和css的区别
皮肤与css都是设计样式的,但是却有本质的不同。
Skin就好比一件衣服,有一个默认的款式与外观,同时也包含了一些参数,可以改变skin的默认样式。具体的应用样式,用CSS帮你细化,如:给这件衣服设置不同的颜色,不同的尺码。
三.皮肤的使用
1.FLEX默认的皮肤
1)Flash Builder 4.5 新增的主题 C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\4.5.0\frameworks\themes目录下面的内容就是Flash Builder 4.5 新增的主题(theme)样式所在的位置。 包括:AeonGraphical、Halo、Mobile、Spark、Wireframe主题。SDK4.5默认的主题:Spark
2)Spark和Halo中重要的三套皮肤所在的位置
Spark组件默认皮肤的位置:C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\4.5.0\frameworks\projects\spark\src\spark\skins\spark
Halo组件默认皮肤的位置: C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\4.5.0\frameworks\projects\mx\src\mx\skins\halo
Spark skin for Halo皮肤的位置:C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks\4.5.0\frameworks\projects\sparkskins\src\mx\skins\spark
2.SparkSkin介绍
1)SparkSkin:是全部Spark Class的基础类,大部分可视化控件的皮肤都是SparkSkin的子类。我们通过这个SparkSkin来实现自定义控件的皮肤。
2)Skin:是SparkSkin的父类,例如:ButtonBarSkin就是Skin的子类,如果想要自定义这部分组件的皮肤,则需要使用Skin。 综上所述,也就是可以使用SparkSkin的地方,我们使用Skin一样可以达到同样的
3.皮肤的使用
1)s|CheckBox { skinClass:ClassReference("components.skins.checkBox.CheckBoxSkin"); }
2)<s:Button skinClass="components.skins.button.CreativeDeleteButtonSkin" />
3)myButton.setStyle( "skinClass", CustomEnterButtonSkin);
应用实例:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:view="com.view.*"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <fx:Style> @namespace s "library://ns.adobe.com/flex/spark"; .testSparkButtonSkin { skinClass:ClassReference("com.skin.CustomComboBoxSkin") } s|ComboBox { skinClass:ClassReference("com.skin.CustomComboBoxSkin") } </fx:Style> <fx:Script> <![CDATA[ import com.skin.CustomComboBoxSkin; import mx.collections.ArrayCollection; import mx.collections.ArrayList; import spark.components.ComboBox; import spark.events.IndexChangeEvent; import spark.skins.spark.ApplicationSkin; [Bindable]public var dataProvider:ArrayList = new ArrayList([{name:"kenny",phone:123,email:"dd"}, {name:"kenny1",phone:123,email:"dd"}, {name:"kenny2",phone:123,email:"dd"}, {name:"kenny3",phone:123,email:"dd"}]); protected function button1_clickHandler(event:MouseEvent):void { test.setStyle("skinClass",Class(CustomComboBoxSkin)); } ]]> </fx:Script> <s:layout> <s:VerticalLayout/> </s:layout> <s:ComboBox dataProvider="{dataProvider}" labelField="name" styleName="testSparkButtonSkin"/> <s:ComboBox dataProvider="{dataProvider}" labelField="name" skinClass="com.skin.CustomComboBoxSkin"/> <s:ComboBox dataProvider="{dataProvider}" labelField="name" id="test"/> <s:ComboBox dataProvider="{dataProvider}" labelField="name"/> <s:Button click="button1_clickHandler(event)"/> </s:Application>Skin 实例:
<?xml version="1.0" encoding="utf-8"?> <s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled=".5" xmlns:mx="library://ns.adobe.com/flex/mx"> <!-- host component --> <fx:Metadata> <![CDATA[ /** * @copy spark.skins.spark.ApplicationSkin#hostComponent */ [HostComponent("spark.components.ComboBox")] ]]> </fx:Metadata> <fx:Script fb:purpose="styling"> <![CDATA[ private var paddingChanged:Boolean; private var cornerRadiusChanged:Boolean; private var cornerRadius:Number = 0; /* Define the content fill items that should be colored by the "contentBackgroundColor" style. */ static private const contentFill:Array = ["bgFill"]; /** * @private */ override public function get contentItems():Array {return contentFill}; /** * @private */ override protected function commitProperties():void { super.commitProperties(); if (paddingChanged && textInput) { // Push padding styles into the textDisplay var padding:Number; padding = getStyle("paddingLeft"); if (textInput.getStyle("paddingLeft") != padding) textInput.setStyle("paddingLeft", padding); padding = getStyle("paddingTop"); if (textInput.getStyle("paddingTop") != padding) textInput.setStyle("paddingTop", padding); padding = getStyle("paddingRight"); if (textInput.getStyle("paddingRight") != padding) textInput.setStyle("paddingRight", padding); padding = getStyle("paddingBottom"); if (textInput.getStyle("paddingBottom") != padding) textInput.setStyle("paddingBottom", padding); paddingChanged = false; } if (cornerRadiusChanged) { cornerRadiusChanged = false; var cr:Number = getStyle("cornerRadius"); if (openButton) openButton.setStyle("cornerRadius", cr); if (textInput) textInput.setStyle("cornerRadius", cr); } } /** * @private */ override public function styleChanged(styleProp:String):void { var allStyles:Boolean = !styleProp || styleProp == "styleName"; super.styleChanged(styleProp); if (allStyles || styleProp.indexOf("padding") == 0) { paddingChanged = true; invalidateProperties(); } if (allStyles || styleProp == "cornerRadius") { cornerRadiusChanged = true; invalidateProperties(); } } ]]> </fx:Script> <s:states> <s:State name="normal" /> <s:State name="open" /> <s:State name="disabled" /> </s:states> <!--- The PopUpAnchor control that opens the drop-down list. <p>In a custom skin class that uses transitions, set the <code>itemDestructionPolicy</code> property to <code>none</code>.</p> --> <s:PopUpAnchor id="popUp" displayPopUp.normal="false" displayPopUp.open="true" includeIn="open" left="0" right="0" top="0" bottom="0" itemDestructionPolicy="auto" popUpPosition="below" popUpWidthMatchesAnchorWidth="true"> <!--- This includes borders, background colors, scrollers, and filters. @copy spark.components.supportClasses.DropDownListBase#dropDown --> <s:Group id="dropDown" maxHeight="134" minHeight="22" > <!-- drop shadow --> <!--- @private --> <s:RectangularDropShadow id="dropShadow" blurX="20" blurY="20" alpha="0.45" distance="7" angle="90" color="#ff0000" left="0" top="0" right="0" bottom="0"/> <!-- border --> <!--- @private --> <s:Rect id="border" left="0" right="0" top="0" bottom="0"> <s:stroke> <!--- @private --> <s:SolidColorStroke id="borderStroke" weight="1"/> </s:stroke> </s:Rect> <!-- fill --> <!--- Defines the appearance of drop-down list's background fill. --> <s:Rect id="background" left="1" right="1" top="1" bottom="1" > <s:fill> <!--- @private The color of the drop down's background fill. The default color is 0xFFFFFF. --> <s:SolidColor id="bgFill" color="0xff0000" /> </s:fill> </s:Rect> <mx:DataGrid id="dataGrid" rowCount="6" left="0" top="0" bottom="0" right="0" hasFocusableChildren="true"> <mx:columns> <mx:DataGridColumn dataField="name" headerText="Name"/> <mx:DataGridColumn dataField="phone" headerText="Phone"/> <mx:DataGridColumn dataField="email" headerText="Email"/> </mx:columns> </mx:DataGrid> </s:Group> </s:PopUpAnchor> <!--- The default skin is ComboBoxButtonSkin. @copy spark.components.supportClasses.DropDownListBase#openButton @see spark.skins.spark.ComboBoxButtonSkin --> <s:Button id="openButton" width="19" right="0" top="0" bottom="0" focusEnabled="false" skinClass="spark.skins.spark.ComboBoxButtonSkin" /> <!--- @copy spark.components.ComboBox#textInput --> <s:TextInput id="textInput" left="0" right="18" top="0" bottom="0" skinClass="spark.skins.spark.ComboBoxTextInputSkin"/> </s:SparkSkin>Skin 讲解:
<fx:Metadata>
<![CDATA[
[HostComponent("spark.components.ComboBox")]
]]>
</fx:Metadata>
HostComponent 元数据指向您要设计外观的组件。
<s:states>
<s:State name="normal" />
<s:State name="open" />
<s:State name="disabled" />
</s:states>
定义RadioButton的一组外观状态
<s:Ellipse x="0" y="0" width="20" height="20">
<s:fill>
<s:LinearGradient x="10" y="20" rotation="270" scaleX="20">
<s:GradientEntry color="#333333" ratio="0"/>
<s:GradientEntry color="#737373" ratio="1"/>
</s:LinearGradient>
</s:fill>
</s:Ellipse>
Ellipse: 画一个椭圆形
fill: 设置填充方式
LinearGradient: 设置渐变颜色
rotation:设置过滤方向,这里是从下到上
GradientEntry:设置渐变颜色
4.定义皮肤时的常用类
Flex中基本形状有三种:
Rect矩形(圆角矩形)
Ellipse椭圆(圆形)
Line直线
Flex的复杂图形使用Path来绘制
Flex
使用fill对图形本体进行上色,
使用stroke对图形边框进行上色,
而fill(填充)和stroke(画笔)有三种上色方法:
fill — SolidColor(色块),RadialGradient(径向渐变),LinearGradient(线性渐变)。
stroke — SolidColorStroke(实线),RadialGradientStroke(径向渐变),LinearGradientStroke(线性渐变)。 Flex中常用的效果滤镜有7个: GlowFilter(单色发光滤镜) BlurFilter(模糊滤镜) DropShadowFilter(阴影滤镜) BevelFilter(斜角滤镜) GradientGlowFilter(彩色发光滤镜) GradientBevelFilter(彩色斜角滤镜) ColorMatrixFilter(色彩响应矩阵滤镜)
四.halo包使用定义的皮肤
看以下的代码:
<fx:Style>
.sparkButtonStyle {
skin: ClassReference("com.rianote.flex.skin.KButton");
}
</fx:Style>
<mx:Button label="我是halo组件" styleName="sparkButtonStyle"/>
KButton继承是spark for halo皮肤下的皮肤。
再让我们对比一下spark组件的写法:
<fx:Style>
Button {
skinClass: ClassReference("com.rianote.flex.skin.KButton");
}
</fx:Style>
<s:Button label="我是spark组件" skinClass="com.rianote.flex.skin.KButton" />
相关推荐
本篇文章将详细介绍如何利用Flex4中的Spark Skin进行控件样式的自定义。 #### 二、Spark Skin与Skin类的关系 在Flex4中,`spark.skins` 包含了一个核心类 `SparkSkin`。`SparkSkin` 是一个继承自 `Group` 类型的...
在Flex 4中,皮肤(Skin)是一种强大的机制,用于改变和定制UI组件的外观和交互体验。本文将深入探讨FLEX4中的皮肤系统,特别是SparkSkin类,并通过实例展示如何创建和应用自定义皮肤。 1. SparkSkin的介绍: ...
1. 使用Spark Skin机制:Spark组件支持动态更换皮肤,只需为组件设置新的SkinClass即可。 ```actionscript myComponent.skinClass = MyNewSkinClass; ``` 2. 利用URLLoader加载皮肤资源:通过加载SWF或CSS格式的...
本主题主要围绕`SparkSkin`类和`Skin`类展开,这两类在Flex4的皮肤定制中扮演着核心角色。 **SparkSkin介绍** `SparkSkin`是Flex4中用于创建Spark组件皮肤的主要类,位于`spark.skins`包下。它是一个`Group`类型的...
根据提供的信息,本文将深入解析Flex4中皮肤(skin)的概念、SparkSkin的使用方法以及如何通过自定义Skin来改变Flex应用界面的外观。 ### Flex4中的皮肤概念 在Flex4中,皮肤(skin)是一种用于控制UI组件外观的...
- Flex4引入了Spark组件模型,相对于MX组件,Spark组件更加强调可定制性,允许开发者更自由地设计组件外观。 2. **创建自定义皮肤** - 使用Flex SDK中的Skin类或MXML来创建自定义皮肤。皮肤通常包含一组显式状态...
- `xmlns:s="library://ns.adobe.com/flex/spark"`:指向Flex Spark组件库。 - `xmlns:mx="library://ns.adobe.com/flex/halo"`:指向Flex Halo组件库。 2. **样式定义**:通过`<fx:Style>`标签来定义样式。这里...
4. **Skinning与Theming**:Spark组件的一大亮点就是皮肤(Skin)和主题(Theme)机制。通过皮肤,开发者可以改变组件的外观;通过主题,可以在全局范围内统一应用的视觉风格。 5. **格栅布局(Grid Layout)**:...
Flex4.5 skins学习主要关注的是Adobe Flex...通过学习和实践SkinTest项目,你可以深入理解Flex4.5 Spark Skins的工作原理,提升你的Flex应用界面设计能力。记得动手尝试,不断试验和调试,这是掌握任何技术的最佳途径。
在Flex4中,Accordion组件属于`spark.components`包。 #### 栢心知识点二:自定义Accordion头部样式 在Flex4中,可以通过多种方式来自定义Accordion头部的样式。其中一种方法是使用`headerStyleName`属性结合...
在AdvancedDataGrid中,我们可以创建一个继承自spark.skins.spark.ApplicationSkin的自定义表头皮肤类,然后在XML中定义各个元素的布局和样式。 2. **表头元素**:AdvancedDataGrid的表头由多个元素组成,包括...
同时,Flex4引入了皮肤类(Skin Classes),允许开发者为组件创建完全自定义的外观。布局管理器也是Flex4的重要部分,如VGroup、HGroup、FormLayout等,它们负责控制组件在容器中的排列和大小。 3. 报表: Flex4...
Flex4的Skin类和States机制使得创建复杂的交互式皮肤变得可能。 5. **动画效果**:为了增加用户体验,电视墙通常会包含平滑的滚动、淡入淡出或缩放动画。Flex4的Tween类和Effect框架可以轻松实现这些效果。 6. **...
2. **Skinning和Styling**:在Flex4中,皮肤(Skin)和样式(Style)系统得到了大幅度增强。开发者可以独立于组件逻辑来定义组件外观,这极大地提高了界面设计的灵活性。 3. **图形渲染引擎(Gumbo)**:Flex4引入了新的...
2. **Skinning和Styling**:在Flex 4.5中,皮肤(Skin)和样式(Style)的管理得到了显著提升。开发者可以为组件定义不同状态下的外观,以实现丰富的视觉效果。Skinning允许自定义组件的每一个细节,而Styling则通过...
与Flex 3的 Halo组件相比,Flex 4引入了全新的Spark组件体系。Spark组件更加灵活,支持皮肤化和组件分离,使界面设计更富表现力。每个Spark组件都包含视觉元素和行为,可以独立定制。 3. **皮肤和外观**: Flex 4...
- **内置皮肤**:Flex框架提供了一些预定义的皮肤,如 Halo 和 Spark,可以直接使用。 - **自定义皮肤**:开发者可以根据需求创建自己的皮肤,以实现更个性化的界面设计。 3. **皮肤的层次结构** Flex皮肤由多个...
在Flex中,主题(Theme)和皮肤(Skin)是实现用户界面UI设计的重要组成部分,它们允许开发者轻松地改变应用程序的整体外观和感觉,以满足不同用户需求或品牌要求。本文将深入探讨Flex中更换主题和皮肤控件的相关...
在Flex中,我们可以使用Spark Skin机制来创建自定义按钮皮肤。Spark Skin允许开发者创建XML文件来描述组件的各个部分,包括形状、颜色、大小等。这些皮肤文件通常会以.mxml为扩展名,通过设置不同状态(如normal、...
1. 创建皮肤类:继承自Flex提供的基类,如mx.skins.Halo.Skin或spark.skins.spark.ApplicationSkin。 2. 设计外观:在皮肤类中定义图形元素,如Rectangles、BitmapImages或Graphics实例,来构造组件的外观。 3. 关联...