Flex4强大的Skin——以RadioButton为例

Flex4弱化了css样式的功能,使得复杂界面效果必须通过Skin来完成,Skin几乎能实现所有你希望设计界面显示的效果。

SparkSkin是一个Group类型的容器(继承自Group);全部的mx.spark的可视化控件的外观全部都是SparkSkin的子类;

可以用几种方式使用Skin:

(1)在css中直接定义

s|Button{

        skinClass:ClassReference("com.skin.ButtonSkin");

}

(2)在组件定义时设置

<s:Button skinClass="com.skin.ButtonSkin"/>

Skin实例详解:

所有skin的修改方式大都相同,根据详细的注释,可以清楚的了解控件的样式实现方法,知道哪些是用来设计边框的,哪些是用来设计填充颜色的,以及哪些是现实文本的颜色。可以通过<s:stroke>来修改边框,<s:fill>来修改填充等。

下面讲解如何通过皮肤将如左图的普通radioButton,设计如右图中的效果。

   

1)首先新建一个MXML Skin类型的文件,组件选择RadioButton.

2)初始生成的文件,为系统默认的皮肤效果。首先你会看到

<s:states>

        <s:State name="up" />

        <s:State name="over" stateGroups="overStates" />

        <s:State name="down" stateGroups="downStates" />

        <s:State name="disabled" stateGroups="disabledStates" />

......

 </s:states>

定义了RadioButton的视图状态,包括鼠标滑过、选中等状态,在皮肤定义里会经常看到例如color.downStates="0xFFFFFF";alpha. over="1"意在定义不同状态时组件呈现的颜色。

3)接着会有一个Group容器,里面放了很多用于效果设计的组件,RadioButton原始皮肤是由很多个Ellipse组件组成的,包括它的边框,阴影,高光等效果。因为效果图的显示效果比原来的效果要大,因此将Group大小由长宽13改为长宽都为14。

首先找到注释为<!-- drop shadow -->的椭圆控件,该内容定义了RadioButton的阴影效果。

默认情况下的阴影效果为:

<!-- drop shadow -->

        <s:Ellipse left="-1" top="-1" right="-1" bottom="-1">

            <s:stroke>

                <s:LinearGradientStroke rotation="90" weight="1">

                    <s:GradientEntry color="0x000000"  color.downStates="0xFFFFFF" alpha="0.011" alpha.downStates="0" />

                    <s:GradientEntry color="0x000000" color.downStates="0xFFFFFF" alpha="0.121" alpha.downStates="0.57" />

                </s:LinearGradientStroke>

            </s:stroke>

    </s:Ellipse>

即边框线性渐变,宽度为1,旋转角度90度,即正中切割一般有阴影,根据效果图,阴影效果在右上,因此旋转角度改为45度;

阴影颜色也不是纯黑色颜色

另外为了增加渐变的效果性,改为四色线性渐变,色彩之间通过透明度不同来实现缓冲效果;

阴影的宽度增加到3增强立体效果。

<!-- drop shadow -->

        <s:Ellipse left="-1" top="-1" right="-1" bottom="-1">

            <s:stroke>

                <s:LinearGradientStroke rotation="45" weight="3">

                  <s:GradientEntry color="0x7ca39b" color.downStates="0xFFFFFF" alpha="0.8" alpha.downStates="0.8" />        

                  <s:GradientEntry color="0x7ca39b" color.downStates="0xFFFFFF" alpha="1" alpha.downStates="1" />

                  <s:GradientEntry color="0xf5f8f7" color.downStates="0xFFFFFF" alpha="0.8" alpha.downStates="0.8" />

                  <s:GradientEntry  color="0xf5f8f7" color.downStates="0xFFFFFF" alpha="1" alpha.downStates="1" />          

                </s:LinearGradientStroke>

            </s:stroke>

      </s:Ellipse>

再看边框,比较原图和效果图会发现,效果图没有边框,只靠阴影形成来形成圆形形状,因此找到注释为<!—border的组件,将其删掉,或者设置alpha值为0,使其不显示边框。

选中点:dot

找到注释为<!-- dot -->的组件,可以发现,中心选中点,是一个由path绘制而成的原点,填充而成的,现在需要加大这个原点。

path指令很难记的,绘制了半天最终偶放弃了,用了一个简单的Ellipse绘制而成的。

但是注意:可以用其他组件代替已有组件,但是id="dotFill"的定义要仍然保留给新定义组件的填充器,否则报错,代码如下。

<s:Ellipse right="3" bottom="3" left="3" top="3" includeIn = "selectedStates" id="dot" itemCreationPolicy="immediate">

           <s:fill>

              <s:SolidColor id="dotFill" color="#e67f25" />

           </s:fill>

    </s:Ellipse>

4)使用已定义的皮肤。

.chartRadioButton{

        skinClass:ClassReference("com.skin.radioButtonSkin");

        symbolColor:#1cb49b;

}

效果:

.levelRadioButton{

        skinClass:ClassReference("com.skin.radioButtonSkin");

        symbolColor:#e67f25;

}

效果:

使用同一个Skin,设置了不同的symbolColor(元件的颜色),使得选中效果有不同展示效果。

原文地址:https://www.cnblogs.com/gaozhen-Dream/p/flex_radioButtonSkin.html