Flex中的皮肤(二)
?Flex中的皮肤(二)完
?1?
package
?com.jiangzone
?2? { ?3? ???? import ?mx.skins.Border ?4? ?mx.core.EdgeMetrics; ?5? ?mx.core.Container; ?6? ?mx.graphics.RectangularDropShadow; ?7? ??? ?8? public ? class ?MyPanelBorderSkin? extends ?Border?{ ?9? ??????? 10? ???????? ?function?MyPanelBorderSkin(): void ?{ 11? ????????} 12? 13? /** 14? ?????????*?该方法必需要覆盖,如果你要自定义自已的皮肤的话, 15? ?????????*?该方法当在控件更新外观时将会被自动调用 16? ?????????*?会传入两个参数数,第一个是Width,第二个是Height,即是该控件的宽与高 17? ?????????*? */ 18? ????????override? protected ?function?updateDisplayList(w:Number,h:Number): 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: 32? 标题栏圆度??? 33? ????????????????var?radiusTitle:Object? };??????? 34? 画一个圆角矩形,整个背景 35? this .drawRoundRect( 36? 画一个圆角矩形,标题栏??? 37? 0xff0000 7 ); 38? 画一个圆角矩形,标题栏的那个高光水晶条 39? / 2 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,? 54? ????????????} 55? 56? ????} 57? } 上面的代码就是皮肤的代码,之后你还要做的,就是将该皮肤应用到Panel这个容器里: <
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的源码,会得到很多知识!
?2? ???? xmlns:mx ="http://www.adobe.com/2006/mxml" ?creationComplete ="init()" ?3? ????layout ="absolute" > mx:Style ????????.myPanelSkin?{ ????????????borderSkin:?ClassReference(?"com.jiangzone.MyPanelBorderSkin"?); </ mx:Panel? borderSkin ="com.jiangzone.MyPanelBorderSkin" 12? ??????????????width ="200" ?height ="150" ??x ="24" ?y ="23" /> mx:Application > (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |