`
nianshi
  • 浏览: 416314 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

flex3更换皮肤

    博客分类:
  • Flex
阅读更多

 

Flex中的皮肤(一)
   
      这里是第一篇,将讲述一下Flex中如何应用UI的皮肤,其实应用UI皮肤不难,你们在使用Flex的过程中是否觉得Flex中自带的皮肤样式不太好看? 或者是想自已做个比较有特色的?下面就我们来说说皮肤吧,先来个简单的,你们在做网页时,做导航按钮什么的很多人都是用一个图片来作为一个按钮吧?之后做 几个不同的颜色,之后就在CSS或者JS里设置一下当鼠标Over和Down和Out等等动作时,就切换不同颜色的图片,这样实现动态效果。在Flex里 也可以如此简单的做皮肤。你可以先画好一个UI的皮肤,之就就将该图片应用到Flex里面。
先来看看效果:


之后我们来看看代码:

1 <?xml version="1.0" encoding="utf-8"?>
2 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml " layout="absolute" creationComplete="init()" width="257" height="182" backgroundGradientColors="[#ffffff, #ffffff]">
3   
4     <mx:Script>
5         <![CDATA[
6           
7             //Embed标签是用于将一些外部资源加入到Flex中,随Flex的编译成SWF文件,
8             //这里是加入一张PNG图片,即是做好的Skin图片
9             [Embed(source="images/buttonskin.png",
10                    scaleGridTop="26",
11                    scaleGridBottom="64",
12                    scaleGridLeft="30",
13                    scaleGridRight="106")]
14             //上面的Embed标签下面要紧跟着这个Class,意思就是将上面的资源加入到Flex
15             //后变为这个Class的内容,即调用这个Class时,就是调用那些资源
16             private var MyBtnSkin:Class;
17           
18             //在程序创建完成时会调用该函数,在函数里面设置Button的样式(Style)
19             //这里就是设置按钮的up,over,down三个鼠标状态时的皮肤,就是上面加入的图片资源
20             private function init():void{
21                 btn.setStyle("upSkin",MyBtnSkin);
22                 btn.setStyle("overSkin",MyBtnSkin);
23                 btn.setStyle("downSkin",MyBtnSkin);
24             }
25         ]]>
26     </mx:Script>
27     <mx:Button id="btn" label="Hello World" width="190" height="90"/>
28 </mx:Application>


      怎么样?很简单吧?大家需要注意一下的是在Embed标签里,我定义了一些scaleGridTop之类的属性,这是跟皮肤的缩放有关的,如果不定义那些 属性的话,那么图片是多大的,就按多大来进行缩放,当你的按钮很大时,那些皮肤图片就会被拉大,出现马赛克与变形等,这都是不好看的。加入了9格缩放模式 后,当你缩放按钮时,九个格中的四个角的区域不会被缩放,保持原样,中间格会宽高同时缩放,中间上下格会仅是宽度缩放,中间左右格只会高度缩放,这样,那 个皮肤的边框无论你如何缩放,都是原来的大小比例,而不会将整个图片一起拉申。
      现在的按钮太单调了,只有一个外观,现在大家可以再加多两个不同颜色或者其它图案的图片作为不同状态的皮肤就可以了,比如将overSkin改成红色边框的图片等。

      其实大家有没有发现,上面代码的写法感觉比较麻烦的。我们可以用CSS来实现,我们可以直接点,将皮肤直接写在Button上,如下:

1 <mx:Button label="Hello World"
2         upSkin="@Embed('images/buttonskin.png')"
3         overSkin="@Embed('images/buttonskin.png')"
4         downSkin="@Embed('images/buttonskin.png')"
5     />

这样也是同样的效果。省事好多了吧。或者我们用CSS来写:

1 <?xml version="1.0" encoding="utf-8"?>
2 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml " layout="absolute" width="257" height="182" backgroundGradientColors="[#ffffff, #ffffff]">
3     <mx:Style>
4         Button{
5             up-skin:Embed(source="images/buttonskin.png",
6                           scaleGridTop="26",
7                           scaleGridBottom="64",
8                           scaleGridLeft="30",
9                           scaleGridRight="106");
10             over-skin:Embed(source="images/buttonskin.png",
11                           scaleGridTop="26",
12                           scaleGridBottom="64",
13                           scaleGridLeft="30",
14                           scaleGridRight="106");
15         }
16     </mx:Style>
17     <mx:Button id="btn" label="Hello World" width="190" height="90"/>
18 </mx:Application>

如果觉得加上CSS代码会令程序代码混乱的话,就将CSS代码写在CSS文件里去,在程序里导入CSS文件就可以了。(至于CSS的用法,我就不说了,反正Flex里的CSS方式与Html里的用法用样。只是要注意一下CSS里面设置的属性的名字就可以了)

<mx:Style source="styles/styles.css" />

      但有人可能会问,这样做的话,如果一个程序有很多不同的UI,并有不同的皮肤,那不就是要生成很多的图片?这个问得好,确实,如果以这种方式的话,就像一 个网站里的images文件夹一样,有很多的小图片,这样太麻烦了,而且也不好维护。既然有这样的问题,我们就将皮肤干脆做成在一个文件里面算了,方便快 捷,维护又方便,而这个文件,就是SWF文件。我们如果有Flash基础的话,基本对MC都不会陌生,对,这次我们的主角就是SWF里面的MC,我们可以 将一个皮肤做成一个MC,在Flash里将所有用到的皮肤都做在一个SWF里,一个图片就像是一个MC,之后发布该SWF文件,在Flex里加载这个 SWF文件,再在需要的皮肤里调用SWF里面相应皮肤的MC的名字就可以了。如下:
这个是在Flash里做好的皮肤SWF文件,里面有三个不同颜色的皮肤模式
[swf]attachments/month_0805/p2008518233635.swf[/swf]
这里要注意一下,在Flash里做这些皮肤时,要将MC加上链接,链接的名称,就是你在Flex里调用该皮肤的名称,图片如下:

 


在做好皮肤的SWF后,让我们回到Flex 里面,在Flex里写如下代码:

1 <?xml version="1.0" encoding="utf-8"?>
2 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml " layout="absolute" width="257" height="182" backgroundGradientColors="[#ffffff, #ffffff]">
3     <mx:Style>
4         Button{
5             up-skin:Embed(source="images/btnSkin.swf",symbol="btnUP");
6             over-skin:Embed(source="images/btnSkin.swf",symbol="btnOVER");
7             down-skin:Embed(source="images/btnSkin.swf",symbol="btnDOWN");
8         }
9     </mx:Style>
10     <mx:Button id="btn" label="Hello World" width="100" height="60"/>
11 </mx:Application>


注意一下的就是,在Embed标签里,要导入的资源文件不是PNG了,而是一个SWF,就是我们刚才在Flash里做好的皮肤文件,注意看,后面还跟着一 个symbol属性,该属性就是指明你要调用哪一个MC,就是SWF里面的MC,记得,都要为每个MC做链接,并链接名字要与symbol里的名字致。至 此,我们的皮肤就完成了。一个SWF文件就搞掂。这里是最终效果:

 

好了,这篇教程就到些结束,上面介绍的都是Skin的比较简单快捷的用法,不过灵活性就不是很大,但也是皮肤技术的最基础的,大家也可以再扩展一下 其它用法等等的,在下篇文章,也就是Flex皮肤系列文章的(二)中,我会介绍一下用程序代码来编写皮肤,这就是不依赖于外部的资源文件,直接用AS3代 码用Graphics来自已画皮肤。下篇将会用到AS3的Draw API方面的知识,请大家做好准备。


Flex中的皮肤(二)

在上一篇文章中,为大家介绍了Flex中皮肤的简单且基本也是最常用的用法,就是先在外部程序中做好皮肤样式,之后再在Flex中加载这些皮肤资 源,比如 是PNG图片,或者是SWF文件等,这些方法都是比较直接且方便简单的。不过灵活性还是不太好,而现在这篇文章中要讲的,就是从程序里AS编写的皮肤,你 可以更灵活自由地控制皮肤的样式与表达方式等,而不用依赖于外部的图片或SWF资源,不过这样还是有些缺点的,就是扩展或是改变时就比较不灵活,像图片资 源的皮肤的话,可以很轻易的改变不同的图片的路径资源等就可以修改了不同的皮肤模式,而用AS Graphics写的皮肤的话,要修改一下那些代码,当然,你也可以在AS代码里写上动态加载其它图片资源又或者作一些更高级的效果等等。

      先在这里解析一下,要以代码方式自定义一个皮肤的话,需要自已编写一个皮肤子类,继承ProgrammaticSkin这个类,这个是所有编写自定义皮肤 的基类,该类也派生了另外两个类:RectangularBorder 与 Border 类,都是差不多的,如果你是写Icon之类的小皮肤的话,比如CheckBox或者RadioButton这类皮肤不需要太复杂的画图逻辑,而且大小固 定,就像是一个小Icon吧,只是有几个状态而已,这类小皮肤的话,继承ProgrammaticSkin就可以了,而写一些复合的控件,背景大小可以调 节之类的皮肤(其实就是大部分皮肤)就用Border或者RectangularBorder类。但都有一个相同点,就是继承了那些类之后,都必需覆盖 updateDisplayList 这个方法,这个方法是由程序自动调用,当需要用到控件时,需要控件的皮肤进行表现时,就会调用那个方法,所以你必需覆盖它,并将你的画图逻辑代码写在那个 方法里面。还有要注意的是,这个皮肤类会与你应用这皮肤的控件的Style设置共享,也就是说你可以在编写这个皮肤类代码里面,使用getStyle() 等等方法获得设置在目标控件中的风格属性,比如说是<mx:Panel backgroundColor="0xffffff" borderSkin="MySkin"> 那么你可以在MySkin代码里获取这个颜色值来进行画出该颜色的图片或其它操作,而直接将颜色值写死在代码里是不规范的,就如我下面贴出来的的代码,不 过出于自已懒,快速代个示例代码,所以犯这个错了。说多了,下面看看代码先。

好了,我们先看看看代码,这份代码是写了一个Panel的皮肤:

1 package com.jiangzone
2 {
3     import mx.skins.Border
4     import mx.core.EdgeMetrics;
5     import mx.core.Container;
6     import mx.graphics.RectangularDropShadow;
7   
8     public class MyPanelBorderSkin extends Border {
9       
10         public function MyPanelBorderSkin():void {
11          }
12       
13         /**
14           * 该方法必需要覆盖,如果你要自定义自已的皮肤的话,
15           * 该方法当在控件更新外观时将会被自动调用
16           * 会传入两个参数数,第一个是Width,第二个是Height,即是该控件的宽与高
17           * */
18          override protected function updateDisplayList(w:Number,h:Number):void {
19             super.updateDisplayList(w,h);
20           
21              var ba:uint = 1;                //backgroundAlpha     背景透明度
22              var bg:uint = 0xffffff;            //backgroundColor     背景颜色
23              graphics.clear();                //graphics这个属性是父类里已经提供了的
24              var p:Container = parent as Container;        //获取该皮肤所应用在的父容器,这里为Panel
25           
26             //这里需要注意,一定要判断父容器是否已被设置,在文章里作解释
27             if(p){
28                 //获取容器定义的区域边界信息对象          
29                  var vm:EdgeMetrics = p.viewMetrics;      
30                 //设置四个角的圆度
31                  var radiusContent:Object = {tl:vm.top,tr:0,bl:0,br:vm.top};  
32                 //标题栏圆度  
33                  var radiusTitle:Object = {tl:vm.top,tr:0,bl:0,br:0};      
34                 //画一个圆角矩形,整个背景
35                 this.drawRoundRect(0,0,w,h,radiusContent,bg,ba);
36                 //画一个圆角矩形,标题栏  
37                 this.drawRoundRect(0,0,w,vm.top,radiusTitle,0xff0000,.7);
38                 //画一个圆角矩形,标题栏的那个高光水晶条
39                 this.drawRoundRect(0,0,w,vm.top / 2,radiusTitle,0xffffff,.3);
40               
41                 //下面是画阴影的。
42                  var dropShadow:RectangularDropShadow = new RectangularDropShadow();
43                  dropShadow.distance = 8;
44                  dropShadow.angle = 60;
45                  dropShadow.color = 0x000000;
46                  dropShadow.alpha = 0.4;
47       
48                  dropShadow.tlRadius = radiusContent.tl;
49                  dropShadow.trRadius = radiusContent.tr;
50                  dropShadow.blRadius = radiusContent.bl;
51                  dropShadow.brRadius = radiusContent.br;
52       
53                  dropShadow.drawShadow(graphics, 0, 0, w, h);
54              }
55          }
56      }
57 }


上面的代码就是皮肤的代码,之后你还要做的,就是将该皮肤应用到Panel这个容器里:

1 <mx:Application
2     xmlns:mx="http://www.adobe.com/2006/mxml " creationComplete="init()"
3      layout="absolute">
4
5     <mx:Style>
6          .myPanelSkin {
7              borderSkin: ClassReference( "com.jiangzone.MyPanelBorderSkin" );
8          }
9     </mx:Style>
10   
11     <mx:Panel borderSkin="com.jiangzone.MyPanelBorderSkin"
12                width="200" height="150"   x="24" y="23"/>
13   
14 </mx:Application>


      代码很简单,这里要说一下,viewMetrics 这个属性是Container控件所独有的属性,是一个只读属性,编写Container子类的时候都要覆盖它,是用于定义这个容器正文区与边界值的,比 如Canvas的四周都是0,所以没有标题栏与边条,而Panel就有四周的边界,而Top边界比较大,用作显示title的,所以如果你要做容器的皮肤 的话,注意一下这个值。还有就是,为什么获取了皮肤应用的控件引用(parent)后还要判断它是否为空?因为当程序加载到这个控件时,是先加载那个皮肤 的,所以parent的值未被设置,是空的,如果你不作判断的话,将会出现空引用的错误(parent.viewMetrics),当加载完皮肤后,再加 载控件并设置控件的属性和设置皮肤,这时将会再次调用updateDisplayList的方法,这时parent才有值,就是那个控件的引用。当改变了 style或一些属性后,又会自动触发调用updateDisplayList方法。

我们来看看最终运行效果:

 

补充一下:
在第一篇文章里,说了将皮肤做在SWF文件里再加载,想一下,可以将该皮肤做成动画MC的,而不单单只是一个画面,可以做成一些动画作为皮肤,之后在Flex引用该SWF的Symbol,这样皮肤就有了动画效果了,不只只是单纯的不动的平面图!

      Flex中的皮肤教程就说到这里,皮肤还有很多可探索的,只要大家有求知欲,多点看看英文文档,看看别人的例子程序代码,现在Flex也开源了,也可以多看看Flex的源码,会得到很多知识!

//其它

http://www.blogjava.net/cph8066/archive/2009/08/09/218419.html
http://blog.csdn.net/dream8062/archive/2009/08/06/4417583.aspx
http://waitingsnow.iteye.com/blog/443156
http://blog.flexexamples.com/2007/07/25/embedding-assets-from-swf-files/

在flash中画好皮肤,转换成symbol给一个name如bulletCheck,用command->convert symbol to component,file->publish导出后,将生成的a.swf文件拷贝到flex与css file同路径下,创建css file,写如:
Button
{
upSkin: Embed('a.swf',symbol='bulletCheck');
}
右键点css file,compile css to swf, 会生成与css同名的swf文件,之前的swf也会编在其中。
<mx:Style source="abc.css"/>
每次改css时都要重新编译生成swf!!!

分享到:
评论

相关推荐

    Flex更换主题 更换皮肤控件

    通过更换皮肤,可以改变组件的形状、颜色、大小等属性,从而实现个性化设计。 更换Flex主题的步骤通常如下: 1. **创建或选择主题**:你可以从Adobe提供的预设主题中选择,如 Halo、Spark 或者自定义创建。自定义...

    FLEX3程序的皮肤集合

    通过更换皮肤,开发者可以轻松实现应用程序UI的一致性和个性化,同时保持代码的可维护性。Flex3支持多种类型的皮肤,包括组件皮肤、主题皮肤和自定义皮肤。 1. **组件皮肤**:Flex3中的每个UI组件,如Button、...

    三个Flex的皮肤

    通过更换皮肤,开发者可以调整应用程序的视觉样式,使其符合品牌要求或提升用户体验。Flex提供了多种内置皮肤,同时也支持自定义皮肤,以便对组件进行深度定制。 "三个Flex的皮肤"标题表明我们有三款不同的皮肤主题...

    flex皮肤flex皮肤

    通过更换皮肤,开发者可以创建独特且一致的用户界面,符合品牌风格或者提高用户体验。 2. **Flex皮肤的类型** - **内置皮肤**:Flex框架提供了一些预定义的皮肤,如 Halo 和 Spark,可以直接使用。 - **自定义...

    Flex 皮肤大全,各种样式的Flex控件皮肤大全

    3. **Flex-vista样式**和**Flex-W7样式**:这些是指模仿Windows Vista和Windows 7操作系统风格的Flex皮肤。Vista风格通常采用玻璃透明效果和柔和的色彩,而Windows 7风格可能更注重简洁和扁平化设计。使用这些皮肤...

    FLEX+Flash动态更换皮肤演示

    通过这个“FLEX+Flash动态更换皮肤演示”,开发者不仅可以学习到如何在Flex应用中实现动态皮肤更换,还能深入了解Flex和Flash之间的协同工作,以及如何通过ActionScript和MXML结合来增强用户体验。这种技术在创建...

    很炫经典的flex 皮肤主题

    通过更换皮肤,开发者可以轻松地改变应用程序的整体风格,使得应用更具个性化和品牌特色。 描述中的"很经典很炫的皮肤大出血了啊至于什么样的,自已下来看吧"可能暗示这个压缩包包含了多种不同风格的Flex皮肤,每种...

    skin_Flex_程序皮肤

    Flex支持动态更换皮肤,这意味着用户可以根据需求在运行时改变应用的外观。这对于创建主题化或个性化的应用非常有用。同时,由于Flex的开放源码特性,开发者可以从社区获取大量预设皮肤,或者参考他人作品进行二次...

    flex蓝色经典皮肤

    3. 应用皮肤:编译并运行项目,Flex应用会自动使用指定的皮肤。 总的来说,"flex蓝色经典皮肤"为Flex开发者提供了一种预设的UI风格,通过调整和应用,可以让Flex应用拥有统一而专业的蓝色调界面。同时,开发者也...

    Flex五款漂亮皮肤

    在Flex应用中,皮肤是界面组件外观的重要组成部分,通过更换皮肤,可以改变组件的视觉样式,满足不同设计需求。 本资源提供了五款漂亮的Flex皮肤,含源码,这为开发者提供了灵活的设计选择。以下是这五款皮肤的可能...

    flex3权威指南配套资源

    - **皮肤系统**:Flex支持皮肤更换机制,可以通过修改组件外观实现不同的视觉效果,而无需更改组件的内部逻辑。 - **动画与过渡效果**:利用Flex提供的动画API可以轻松创建各种动态效果,如淡入淡出、平滑滚动等,...

    经典收藏 Flex 皮肤

    通过更换或定制皮肤,开发者可以改变组件的样式,包括颜色、形状、大小、动画效果等,以达到独特的视觉风格。在Flex中,每个组件都可以有多个皮肤,这使得UI设计具有高度的灵活性和可扩展性。 在Flex中,皮肤可以...

    Flex运行时加载皮肤

    通过上述方法,可以在不重新编译程序的情况下实现实时更换皮肤的功能,有效解决了皮肤加载过程中用户等待的问题。这种方法不仅可以提高程序的灵活性,还能增强用户体验。对于需要频繁更换皮肤的应用场景而言,这种...

    flex 皮肤样式css+style

    这些皮肤可以通过MXML或CSS来定义,并且可以轻松地进行更换,以实现不同主题的切换。 接下来,我们来看看核心知识点——CSS。CSS是控制网页元素样式和布局的语言,它可以用来定义字体、颜色、大小、位置等属性。在...

    WindowsClassic flex 皮肤 css

    3. **皮肤(Skinning)**:在Flex中,皮肤是组件外观的表示,通过更换皮肤,可以改变组件的视觉效果。WindowsClassic皮肤模仿了Windows操作系统经典的界面样式,提供了一种熟悉的用户体验。 4. **...

    Flex4 自定义组件皮肤小结

    在Flex4中,自定义组件皮肤是提升应用界面美观度和用户体验的重要手段。Flex4引入了全新的皮肤架构,使得开发者可以更加灵活地控制组件的外观和交互效果。本篇文章将围绕Flex4自定义组件皮肤进行深入讲解,并结合...

    FLEX简单应用工程

    通过更换皮肤,可以快速改变应用程序的整体风格。 **FLEX与AIR** Adobe AIR允许FLEX应用程序以桌面应用的形式运行,具备本地系统的访问权限,如文件系统、网络和硬件设备。这使得FLEX不仅可以用于Web,还能开发...

    flex主题(skin)

    在Flex中,皮肤定义了UI组件的视觉样式,包括颜色、字体、边框、阴影、动画等元素。通过更换不同的皮肤,开发者可以快速改变应用的整体风格,以适应不同用户的需求或者品牌标识。 1. 苹果主题:此主题可能参照了...

    flex 皮肤切换

    在Flex 3中,我们可以使用MXML皮肤或者CSS皮肤;而在Flex 4(Spark组件库)中,更推荐使用ActionScript皮肤。例如,我们可能会有两个皮肤文件,`defaultSkin.css`和`customSkin.css`,分别定义了默认皮肤和自定义...

Global site tag (gtag.js) - Google Analytics