`
luhantu
  • 浏览: 204005 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Flex Skin (Spark)

阅读更多

一.什么是皮肤? 为什么要定义皮肤?

皮肤是用于控制组件的外观的组件,就是说控制组件的所有可视化部分。

将组件的外观和行为分开,通过皮肤可以对可视化部分进行独立的修改,而不影响到组件的底层核心部分。

二.皮肤和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" />

分享到:
评论
1 楼 aosnowit 2015-07-31  
这里有一套非常不错的 SparkSkin 主题皮肤,更新很频繁!有许多不错的实用组件和组件皮肤,而且是开源的,地址:https://git.oschina.net/starfire/StarSparkSkin

相关推荐

    Flex4 Spark皮肤

    本篇文章将详细介绍如何利用Flex4中的Spark Skin进行控件样式的自定义。 #### 二、Spark Skin与Skin类的关系 在Flex4中,`spark.skins` 包含了一个核心类 `SparkSkin`。`SparkSkin` 是一个继承自 `Group` 类型的...

    FLEX4的皮肤skin

    在Flex 4中,皮肤(Skin)是一种强大的机制,用于改变和定制UI组件的外观和交互体验。本文将深入探讨FLEX4中的皮肤系统,特别是SparkSkin类,并通过实例展示如何创建和应用自定义皮肤。 1. SparkSkin的介绍: ...

    Flex实时加载Skin

    1. 使用Spark Skin机制:Spark组件支持动态更换皮肤,只需为组件设置新的SkinClass即可。 ```actionscript myComponent.skinClass = MyNewSkinClass; ``` 2. 利用URLLoader加载皮肤资源:通过加载SWF或CSS格式的...

    Flex4的皮肤文档及demo

    本主题主要围绕`SparkSkin`类和`Skin`类展开,这两类在Flex4的皮肤定制中扮演着核心角色。 **SparkSkin介绍** `SparkSkin`是Flex4中用于创建Spark组件皮肤的主要类,位于`spark.skins`包下。它是一个`Group`类型的...

    Flex4皮肤资料

    根据提供的信息,本文将深入解析Flex4中皮肤(skin)的概念、SparkSkin的使用方法以及如何通过自定义Skin来改变Flex应用界面的外观。 ### Flex4中的皮肤概念 在Flex4中,皮肤(skin)是一种用于控制UI组件外观的...

    flex4自定义组件皮肤

    - Flex4引入了Spark组件模型,相对于MX组件,Spark组件更加强调可定制性,允许开发者更自由地设计组件外观。 2. **创建自定义皮肤** - 使用Flex SDK中的Skin类或MXML来创建自定义皮肤。皮肤通常包含一组显式状态...

    Flex各种超酷实例代码大全

    - `xmlns:s="library://ns.adobe.com/flex/spark"`:指向Flex Spark组件库。 - `xmlns:mx="library://ns.adobe.com/flex/halo"`:指向Flex Halo组件库。 2. **样式定义**:通过`&lt;fx:Style&gt;`标签来定义样式。这里...

    flex4.0快速入门

    4. **Skinning与Theming**:Spark组件的一大亮点就是皮肤(Skin)和主题(Theme)机制。通过皮肤,开发者可以改变组件的外观;通过主题,可以在全局范围内统一应用的视觉风格。 5. **格栅布局(Grid Layout)**:...

    Flex4.5 skins学习

    Flex4.5 skins学习主要关注的是Adobe Flex...通过学习和实践SkinTest项目,你可以深入理解Flex4.5 Spark Skins的工作原理,提升你的Flex应用界面设计能力。记得动手尝试,不断试验和调试,这是掌握任何技术的最佳途径。

    Flex4中头部背景图片的Accordion

    在Flex4中,Accordion组件属于`spark.components`包。 #### 栢心知识点二:自定义Accordion头部样式 在Flex4中,可以通过多种方式来自定义Accordion头部的样式。其中一种方法是使用`headerStyleName`属性结合...

    Flex应用AdvancedDataGrid表头皮肤

    在AdvancedDataGrid中,我们可以创建一个继承自spark.skins.spark.ApplicationSkin的自定义表头皮肤类,然后在XML中定义各个元素的布局和样式。 2. **表头元素**:AdvancedDataGrid的表头由多个元素组成,包括...

    flex4组建以及DEMO实例.安装序列号

    同时,Flex4引入了皮肤类(Skin Classes),允许开发者为组件创建完全自定义的外观。布局管理器也是Flex4的重要部分,如VGroup、HGroup、FormLayout等,它们负责控制组件在容器中的排列和大小。 3. 报表: Flex4...

    Flex4 电视墙效果

    Flex4的Skin类和States机制使得创建复杂的交互式皮肤变得可能。 5. **动画效果**:为了增加用户体验,电视墙通常会包含平滑的滚动、淡入淡出或缩放动画。Flex4的Tween类和Effect框架可以轻松实现这些效果。 6. **...

    Flex4实战源代码

    2. **Skinning和Styling**:在Flex4中,皮肤(Skin)和样式(Style)系统得到了大幅度增强。开发者可以独立于组件逻辑来定义组件外观,这极大地提高了界面设计的灵活性。 3. **图形渲染引擎(Gumbo)**:Flex4引入了新的...

    Flex 4.5 API

    2. **Skinning和Styling**:在Flex 4.5中,皮肤(Skin)和样式(Style)的管理得到了显著提升。开发者可以为组件定义不同状态下的外观,以实现丰富的视觉效果。Skinning允许自定义组件的每一个细节,而Styling则通过...

    flex4权威指南教程+全代码 flex flex

    与Flex 3的 Halo组件相比,Flex 4引入了全新的Spark组件体系。Spark组件更加灵活,支持皮肤化和组件分离,使界面设计更富表现力。每个Spark组件都包含视觉元素和行为,可以独立定制。 3. **皮肤和外观**: Flex 4...

    flex皮肤flex皮肤

    - **内置皮肤**:Flex框架提供了一些预定义的皮肤,如 Halo 和 Spark,可以直接使用。 - **自定义皮肤**:开发者可以根据需求创建自己的皮肤,以实现更个性化的界面设计。 3. **皮肤的层次结构** Flex皮肤由多个...

    Flex更换主题 更换皮肤控件

    在Flex中,主题(Theme)和皮肤(Skin)是实现用户界面UI设计的重要组成部分,它们允许开发者轻松地改变应用程序的整体外观和感觉,以满足不同用户需求或品牌要求。本文将深入探讨Flex中更换主题和皮肤控件的相关...

    flex 6款按钮皮肤

    在Flex中,我们可以使用Spark Skin机制来创建自定义按钮皮肤。Spark Skin允许开发者创建XML文件来描述组件的各个部分,包括形状、颜色、大小等。这些皮肤文件通常会以.mxml为扩展名,通过设置不同状态(如normal、...

    经典收藏 Flex 皮肤

    1. 创建皮肤类:继承自Flex提供的基类,如mx.skins.Halo.Skin或spark.skins.spark.ApplicationSkin。 2. 设计外观:在皮肤类中定义图形元素,如Rectangles、BitmapImages或Graphics实例,来构造组件的外观。 3. 关联...

Global site tag (gtag.js) - Google Analytics