zoukankan      html  css  js  c++  java
  • 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(元件的颜色),使得选中效果有不同展示效果。

  • 相关阅读:
    采用GRE隧道连接不同虚拟机上的mininet网络
    ubuntu下安装Pycharm
    Update to openvswitch 2.3.0
    安装Openvswich 2.3.0
    ubuntu安装git
    解决Vmware Vsphere中虚拟机与本地机复制粘贴问题
    windows下安装python的xlrd和xlwd安装包
    ubuntu 下NetworkX的安装和使用
    大整数乘法 python实现
    推特(Twitter)的Snowflake算法——用于生成唯一ID
  • 原文地址:https://www.cnblogs.com/gaozhen-Dream/p/flex_radioButtonSkin.html
Copyright © 2011-2022 走看看