<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[WalterShe's blog]]></title>
<link>http://www.flashshe.com/articles/</link>
<description><![CDATA[flex,flash]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[walt&#101;rshe@126.com()]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>Walt&#101;rShe&#39;s blog</title>
	<url>http://www.flashshe.com/articles/images/logos.gif</url>
	<link>http://www.flashshe.com/articles/</link>
	<description>Walt&#101;rShe&#39;s blog</description>
</image>

			<item>
			<link>http://www.flashshe.com/articles/article.asp?id=13</link>
			<title><![CDATA[图片变换编辑器]]></title>
			<author>walt&#101;rshe@126.com(Admin)</author>
			<category><![CDATA[作品]]></category>
			<pubDate>Tue,14 Oct 2008 16:38:17 +0800</pubDate>
			<guid>http://www.flashshe.com/articles/default.asp?id=13</guid>
		<description><![CDATA[一直想做一个变换图片的组件，这段时间终于有了空闲，于是做出了<a target="_blank" href="http://www.flashshe.com/lab/imageTransformer/imageTransformer-10-14/main.html" rel="external">这么一个东东</a>。<br/><a target="_blank" href="http://www.flashshe.com/lab/imageTransformer/imageTransformer-10-14/main.html" rel="external"><img src="http://www.flashshe.com/lab/imageTransformer//transforer.jpg" border="0" alt=""/></a><br/>目前实现了移动，缩放，旋转，改变旋转中心点功能。<br/><br/>下一步的实现内容：<br/><br/>1，支持还原，前进，后退（相当于photoshop里面的撤销，反撤销操作）。<br/>2，斜切（skew）功能。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.flashshe.com/articles/article.asp?id=12</link>
			<title><![CDATA[frames.frame label class_name [...]  编译器指令]]></title>
			<author>walt&#101;rshe@126.com(Admin)</author>
			<category><![CDATA[原创教程]]></category>
			<pubDate>Mon,22 Sep 2008 15:40:10 +0800</pubDate>
			<guid>http://www.flashshe.com/articles/default.asp?id=12</guid>
		<description><![CDATA[以下分析都从flex3源代码推出，不一定正确！希望能和有兴趣的朋友一起探讨。<br/><br/>Flex 3有一个编译器指令是：frames.frame label class_name [...]&nbsp;&nbsp; &#160;&#160;&#160;&#160;<br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent"><br/>Specifies a SWF file frame label with a sequence of class names that are linked onto the frame.<br/><br/>This option lets you add asset factories that stream in after the application that then publish their interfaces with the ModuleManager class. The advantage to doing this is that the application starts faster than it would have if the assets had been included in the code, but does not require moving the assets to an external SWF file.<br/><br/>This is an advanced option.<br/></div></div><br/>上面的文本摘自flex builder 3 帮助文档的&nbsp;&nbsp;Application Development / Using the Flex Compilers / Using mxmlc, the application compiler 一节。<br/><br/>下面介绍一下这个指令的用法：<br/>建立一个工程，主文件名是 FrameTest.mxml，具体代码如下：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&gt;<br/>&lt;mx:Application xmlns:mx=&#34;<a href="http://www.adobe.com/2006/mxml" target="_blank" rel="external">http://www.adobe.com/2006/mxml</a>&#34; layout=&#34;absolute&#34;&gt;<br/>&#160;&#160;&#160;&#160;&lt;mx:Script&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;![CDATA[<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;import flash.system.ApplicationDomain;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private function loadImageHandler():void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var c:Class;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (ApplicationDomain.currentDomain.hasDefinition(&#34;SunnyImage&#34;))<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c = Class(ApplicationDomain.currentDomain.getDefinition(&#34;SunnyImage&#34;));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sunny.source = c;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// ...............<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (ApplicationDomain.currentDomain.hasDefinition(&#34;RainyImage&#34;))<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c = Class(ApplicationDomain.currentDomain.getDefinition(&#34;RainyImage&#34;));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rainy.source = c;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// ...............<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;]]&gt;<br/>&#160;&#160;&#160;&#160;&lt;/mx:Script&gt;<br/>&#160;&#160;&#160;&#160;&lt;mx:Image id=&#34;sunny&#34; x=&#34;28&#34; y=&#34;28&#34;/&gt;<br/>&#160;&#160;&#160;&#160;&lt;mx:Image id=&#34;rainy&#34; x=&#34;130&#34; y=&#34;28&#34;/&gt;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&lt;mx:Button x=&#34;67&#34; y=&#34;99&#34; label=&#34;Load Images&#34; click=&#34;loadImageHandler()&#34;/&gt;<br/>&#160;&#160;&#160;&#160;<br/>&lt;/mx:Application&gt;<br/></div></div><br/><br/>建立一个文件夹assets（与FrameTest.mxml文件在同一个文件夹里），在assets目录里面放两张图片rainy.png和sunny.png。另外建立两个类（这两个类与FrameTest.mxml文件在同一个文件夹里）<br/>1，SunnyImage.as<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>package <br/>{<br/>&#160;&#160;&#160;&#160;import flash.display.DisplayObject;<br/>&#160;&#160;&#160;&#160;import flash.display.MovieClip;<br/>&#160;&#160;&#160;&#160;import mx.core.BitmapAsset;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;[Embed(source=&#34;assets/sunny.png&#34;)]<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;// this calss is linked onto the 3nd frame of systemManager.<br/>&#160;&#160;&#160;&#160;public class SunnyImage extends mx.core.BitmapAsset <br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;//this method called by systemManager when systemManager&#39;s currentFrame == 3<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;public static function frame(root:DisplayObject):void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (root is MovieClip)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;currentFrame: &#34; + MovieClip(root).currentFrame);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;public function SunnyImage() <br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;super(); <br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;}<br/><br/>}<br/></div></div><br/>2，RainyImage.as<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>package <br/>{<br/>&#160;&#160;&#160;&#160;import flash.display.DisplayObject;<br/>&#160;&#160;&#160;&#160;import flash.display.MovieClip;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;import mx.core.BitmapAsset;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;[Embed(source=&#34;assets/rainy.png&#34;)]<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;// this calss is linked onto the 4th frame of systemManager.<br/>&#160;&#160;&#160;&#160;public class RainyImage extends mx.core.BitmapAsset <br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;//this method called by systemManager when systemManager&#39;s currentFrame == 4<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;public static function frame(root:DisplayObject):void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (root is MovieClip)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;currentFrame: &#34; + MovieClip(root).currentFrame);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;public function RainyImage() <br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;super(); <br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;}<br/><br/>}<br/></div></div><br/>建立一个配置文件FrameTest-config.xml（与FrameTest.mxml文件在同一个文件夹里），内容如下：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;?xml version=&#34;1.0&#34;?&gt;&nbsp;&nbsp; <br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp; &lt;flex-config&gt;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp; &lt;frames&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;frame&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;label&gt;Three&lt;/label&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;classname&gt;SunnyImage&lt;/classname&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/frame&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;frame&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;label&gt;Four&lt;/label&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;classname&gt;RainyImage&lt;/classname&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/frame&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/frames&gt;<br/>&#160;&#160;&#160;&#160;&lt;/flex-config&gt;<br/></div></div><br/>编译，你会发现在控制台输出 <br/>currentFrame: 3<br/>currentFrame: 4<br/><br/>在输出的swf上点击 &#34;Load Images&#34;按钮，图片出现。<br/><br/><strong>发散思维1：</strong><br/>如果你的程序里面嵌入了其他的资源，可以把资源编译进一个类，然后让这个类链接到systemManager的第二桢之后，这样你的程序的启动时间会变快。这是这个指令的一个用法，还不错吧:)<br/><br/><img src="http://www.flashshe.com/articles/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.flashshe.com/articles/attachments/month_0809/FrameTest.zip" target="_blank">下载这篇文章的工程源代码</a><br/><br/>此文禁止转载，但是您可以以超级链接的方式链接到这篇文章。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.flashshe.com/articles/article.asp?id=11</link>
			<title><![CDATA[Canvas不能接收 rollOver和roolOut事件的解决方案]]></title>
			<author>walt&#101;rshe@126.com(Admin)</author>
			<category><![CDATA[原创教程]]></category>
			<pubDate>Thu,18 Sep 2008 17:35:16 +0800</pubDate>
			<guid>http://www.flashshe.com/articles/default.asp?id=11</guid>
		<description><![CDATA[一个没有任何内容的透明 Canvas 不能触发rollOver和roolOut事件的侦听器函数，比如下面这个程序<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&gt;<br/>&lt;mx:Application xmlns:mx=&#34;<a href="http://www.adobe.com/2006/mxml" target="_blank" rel="external">http://www.adobe.com/2006/mxml</a>&#34; layout=&#34;absolute&#34;&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&lt;mx:Canvas id=&#34;canvas&#34; x=&#34;10&#34; y=&#34;10&#34; width=&#34;200&#34; height=&#34;200&#34; <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rollOver=&#34;trace(&#39;in&#39;)&#34; rollOut=&#34;trace(&#39;out&#39;)&#34; /&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&lt;/mx:Application&gt;<br/></div></div><br/>编译后，你把鼠标移上去，会发现没有任何输出，<br/><br/><strong>解决方法：</strong><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">1，&lt;mx:Canvas id=&#34;canvas&#34; x=&#34;10&#34; y=&#34;10&#34; width=&#34;200&#34; height=&#34;200&#34; <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rollOver=&#34;trace(&#39;in&#39;)&#34; rollOut=&#34;trace(&#39;out&#39;)&#34; backgroundAlpha=&#34;0&#34; backgroundColor=&#34;#ff000&#34;/&gt;</div></div><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">2，&lt;mx:Canvas id=&#34;canvas&#34; x=&#34;10&#34; y=&#34;10&#34; width=&#34;200&#34; height=&#34;200&#34; <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rollOver=&#34;trace(&#39;in&#39;)&#34; rollOut=&#34;trace(&#39;out&#39;)&#34; <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;preinitialize=&#34;canvas.setStyle(&#39;mouseShield&#39;, true);&#34;/&gt;<br/></div></div><br/>前提是你的 canvas 的 borderSkin 是 mx.skins.halo::HaloBorder.<br/><br/><strong>原理：</strong><br/>没有任何内容的透明Canvas ，鼠标放上去，空无一物，当然不能触发鼠标事件。<br/>所以我们要<br/>1，backgroundAlpha=&#34;0&#34; backgroundColor=&#34;#ff000&#34;。<br/>或者<br/>2，将canvas的 mouseShield 样式设为 true，容器会自动给自己绘制一个alpha=0，白色的背景 <br/>backgroundAlpha=&#34;0&#34; backgroundColor=&#34;#ffffff&#34;（可以参考mx.skins.halo::HaloBorder类的drawBackground函数）<br/><br/>为什么MouseEvent.CLICK，MouseEvent.DOUBLE_CLICK，MouseEvent.MOUSE_DOWN，MouseEvent.MOUSE_MOVE，<br/>MouseEvent.MOUSE_OVER，MouseEvent.MOUSE_OUT，MouseEvent.MOUSE_UP，<br/>MouseEvent.MOUSE_WHEEL事件不需要这样做，因为当设置这些事件的时候，flex自动的给canvas设置了setStyle(&#39;mouseShield&#39;, true) 样式（可以参考mx.core::Container 类的addEventListener 函数）。<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.flashshe.com/articles/article.asp?id=10</link>
			<title><![CDATA[Flex 3框架中容器的边框，背景色和背景图片是如何实现的？]]></title>
			<author>walt&#101;rshe@126.com(Admin)</author>
			<category><![CDATA[原创教程]]></category>
			<pubDate>Wed,17 Sep 2008 14:03:27 +0800</pubDate>
			<guid>http://www.flashshe.com/articles/default.asp?id=10</guid>
		<description><![CDATA[以下分析都从flex 3源代码推出，不一定正确！希望能和有兴趣的朋友一起探讨。<br/><br/>Flex 3 框架中，容器的边框，背景色和背景图片是由容器的borderSkin 类（为了叙述方便，假设我们为容器定义了一个样式borderSkin: ClassReference(&#34;mx.skins.halo.HaloBorder&#34;)）来负责的，容器类如果检测到需要边框，背景色或者背景图片，容器会在自己内部建立一个HaloBorder类型的对象（<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">border = new mx.skins.halo.HaloBorder();<br/>// Add the border behind all the children.<br/>rawChildren.addChildAt(DisplayObject(border), 0);<br/></div></div>）border,在渲染过程中border负责建立边框，背景色或者背景图片。<br/><br/><strong>原理如下：</strong><br/>每个容器的cr&#101;ateChildren()方法中会调用cr&#101;ateBorder()方法来判断是否需要建立border，只有符合下面两个条件我们的容器才会建立边框：<br/> [1]容器没有边框（border == null）；<br/> [2]我们定义了容器的borderSkin样式 ，并且该样式类不是 mx.skins.halo::HaloBorder <strong>或者</strong> 我们定义了容器的borderSkin样式 ，并且该样式类是 mx.skins.halo::HaloBorder那么<br/> [2.1]borderStyle 样式不是 none <strong>或者</strong> borderStyle 样式是 none 并且定义了 mouseShield 样式 <strong>或者</strong> borderStyle 样式是 none 并且没有定义 mouseShield 样式 那么<br/> [2.1.1]如果定义了 backgroundColor 并且 backgroundColor != &#34;&#34; <strong>或者</strong> 定义了backgroundImage 并且 backgroundImage != &#34;&#34; <br/><br/>flex3 框架中 mx.skin::RectangularBorder 类支持backgroundImage, backgroundSize,backgroundAttachment 样式。mx.skin::HaloBorder 类实现了 backgroundColor 和 边框的绘制。<br/>类的继承链如下：HaloBorder - RectangularBorder - Border - ProgrammaticSkin - FlexShape - Shape - DisplayObject - EventDispatcher - Object<br/><br/>设置了 borderSkin: ClassReference(&#34;mx.skins.halo.HaloBorder&#34;)的容器，最底层是背景色和边框（因为背景色和边框用的是graphics绘制的），背景色上面是背景图片，背景图片上面是容器的子孙。<br/><br/><strong>此文禁止转载，但是您可以以超级链接的方式链接到这篇文章。 </strong><br/><br/><br/><strong>附录 方便我自己查阅而放在这里</strong><br/><br/>默认主题(framework.swc 中包含的 default.css文件)中有关边框，背景色和背景图片的定义<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>global<br/>{<br/>&#160;&#160;&#160;&#160;backgroundAlpha: 1.0; /* this runs the opacity of nearly every square piece of the components */<br/>&#160;&#160;&#160;&#160;/* backgroundDisabledColor: #DDDDDD; */<br/>&#160;&#160;&#160;&#160;backgroundSize: &#34;auto&#34;;<br/>&#160;&#160;&#160;&#160;bevel: true;<br/>&#160;&#160;&#160;&#160;borderAlpha: 1.0;<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;borderCapColor: #919999;<br/>&#160;&#160;&#160;&#160;borderColor: #B7BABC;<br/>&#160;&#160;&#160;&#160;borderSides: &#34;left top right bottom&#34;;<br/>&#160;&#160;&#160;&#160;borderSkin: ClassReference(&#34;mx.skins.halo.HaloBorder&#34;);<br/>&#160;&#160;&#160;&#160;borderStyle: &#34;inset&#34;;<br/>&#160;&#160;&#160;&#160;borderThickness: 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...........<br/>}<br/><br/>Container<br/>{<br/>&#160;&#160;&#160;&#160;borderStyle: &#34;none&#34;;<br/>}<br/></div></div><br/>mx.core::Container 类中的和本文有关的一些定义：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;@private<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;Cr&#101;ate components that are children of this Container.<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;override protected function cr&#101;ateChildren():void<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.cr&#101;ateChildren();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Cr&#101;ate the border/background object.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr&#101;ateBorder();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// To save ourselves an extra layout pass, check to see<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// if the scrollbars will definitely be needed.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// If so, cr&#101;ate them now.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr&#101;ateOrDestroyScrollbars(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;horizontalScrollPolicy == ScrollPolicy.ON,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;verticalScrollPolicy == ScrollPolicy.ON,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;horizontalScrollPolicy == ScrollPolicy.ON ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;verticalScrollPolicy == ScrollPolicy.ON);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Determine the child-creation policy (ContainerCreationPolicy.AUTO,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ContainerCreationPolicy.ALL, o&#114; ContainerCreationPolicy.NONE).<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// If the author has specified a policy, use it.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Otherwise, use the parent&#39;s policy.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// This must be set before cr&#101;ateChildren() gets called.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (creationPolicy != null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actualCreationPolicy = creationPolicy;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (parent is Container)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (Container(parent).actualCreationPolicy ==<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContainerCreationPolicy.QUEUED)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actualCreationPolicy = ContainerCreationPolicy.AUTO;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actualCreationPolicy = Container(parent).actualCreationPolicy;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// It is ok for actualCreationPolicy to be null. Popups require it.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (actualCreationPolicy == ContainerCreationPolicy.NONE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actualCreationPolicy = ContainerCreationPolicy.AUTO;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (actualCreationPolicy == ContainerCreationPolicy.QUEUED)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var mainApp:Application = parentApplication ?<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application(parentApplication) :<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application(Application.application);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainApp.addToCreationQueue(this, creationIndex, null, this);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (recursionFlag)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Cr&#101;ate whatever children are appropriate. If any were<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// previously cr&#101;ated, they don&#39;t get re-cr&#101;ated.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr&#101;ateComponentsFromDescriptors();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// If autoLayout is initially false, we still want to do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// measurement once (even if we don&#39;t have any children)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (autoLayout == false)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forceLayout = true;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// weak references<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIComponentGlobals.layoutManager.addEventListener(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FlexEvent.Up&#100;ate_COMPLETE, layoutCompleteHandler, false, 0, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;Cr&#101;ates the container&#39;s border skin <br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;if it is needed and does not already exist.<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected function cr&#101;ateBorder():void<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!border &amp;&amp; isBorderNeeded())<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var borderClass:Class = getStyle(&#34;borderSkin&#34;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (borderClass != null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border = new borderClass();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border.name = &#34;border&#34;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (border is IUIComponent)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IUIComponent(border).enabled = enabled;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (border is ISimpleStyleClient)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISimpleStyleClient(border).styleName = this;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Add the border behind all the children.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rawChildren.addChildAt(DisplayObject(border), 0);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidateDisplayList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;@private<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;private function isBorderNeeded():Boolean<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//trace(&#34;isBorderNeeded&#34;,this,&#34;ms&#34;,getStyle(&#34;mouseShield&#34;),&#34;borderStyle&#34;,getStyle(&#34;borderStyle&#34;));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// If the borderSkin is a custom class, always assume the border is needed.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var c:Class = getStyle(&#34;borderSkin&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Lookup the HaloBorder class by name to avoid a linkage dependency.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Note: this code assumes HaloBorder is the default border skin. If this is changed<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// in defaults.css, it must also be changed here.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (c != getDefinitionByName(&#34;mx.skins.halo::HaloBorder&#34;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(e:Error)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var v:Object = getStyle(&#34;borderStyle&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (v)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// If borderStyle is &#34;none&#34;, then only cr&#101;ate a border if the mouseShield style is true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// (meaning that there is a mouse event listener on this view). We don&#39;t cr&#101;ate a border<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// if our parent&#39;s mouseShieldChildren style is true.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((v != &#34;none&#34;) || (v == &#34;none&#34; &amp;&amp; getStyle(&#34;mouseShield&#34;)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v = getStyle(&#34;backgroundColor&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (v !== null &amp;&amp; v !== &#34;&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v = getStyle(&#34;backgroundImage&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return v != null &amp;&amp; v != &#34;&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>override public function styleChanged(styleProp:String):void<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var allStyles:Boolean = styleProp == null || styleProp == &#34;styleName&#34;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Check to see if this is one of the style properties that is known<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// to affect page layout.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (allStyles || StyleManager.isSizeInvalidatingStyle(styleProp))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Some styles, such as horizontalAlign and verticalAlign,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// affect the layout of this object&#39;s children without changing the<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// view&#39;s size.&nbsp;&nbsp;This function forces the view to be remeasured<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// and layed out.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidateDisplayList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Replace the borderSkin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (allStyles || styleProp == &#34;borderSkin&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (border)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rawChildren.removeChild(DisplayObject(border));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr&#101;ateBorder();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Cr&#101;ate a border object, if none previously existed and<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// one is needed now.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (allStyles ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleProp == &#34;borderStyle&#34; ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleProp == &#34;backgroundColor&#34; ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleProp == &#34;backgroundImage&#34; ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleProp == &#34;mouseShield&#34; ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleProp == &#34;mouseShieldChildren&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cr&#101;ateBorder();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.styleChanged(styleProp);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Check to see if this is one of the style properties that is known.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// to affect page layout.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (allStyles ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StyleManager.isSizeInvalidatingStyle(styleProp))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidateViewMetricsAndPadding();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (allStyles || styleProp == &#34;horizontalScrollBarStyleName&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (horizontalScrollBar &amp;&amp; horizontalScrollBar is ISimpleStyleClient)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var horizontalScrollBarStyleName:String =<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getStyle(&#34;horizontalScrollBarStyleName&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISimpleStyleClient(horizontalScrollBar).styleName =<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;horizontalScrollBarStyleName;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (allStyles || styleProp == &#34;verticalScrollBarStyleName&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (verticalScrollBar &amp;&amp; verticalScrollBar is ISimpleStyleClient)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var verticalScrollBarStyleName:String =<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getStyle(&#34;verticalScrollBarStyleName&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISimpleStyleClient(verticalScrollBar).styleName =<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;verticalScrollBarStyleName;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/></div></div><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.flashshe.com/articles/article.asp?id=9</link>
			<title><![CDATA[ActionScript 3中如何深拷贝(deep copy)一个对象]]></title>
			<author>walt&#101;rshe@126.com(Admin)</author>
			<category><![CDATA[心得体会]]></category>
			<pubDate>Fri,12 Sep 2008 13:52:02 +0800</pubDate>
			<guid>http://www.flashshe.com/articles/default.asp?id=9</guid>
		<description><![CDATA[记得flash帮助文档 Programming ActionScript 3.0 / Core ActionScript 3.0 Data Types and Classes / Working with arrays /Cloning arrays 一节讲了如何深克隆(deep copy)一个数组的方法，以前一直以为这个方法只对数组有用，其实这个方法适用于所有的对象。<br/><br/>下面是我的例子：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&gt;<br/>&lt;mx:Application xmlns:mx=&#34;<a href="http://www.adobe.com/2006/mxml" target="_blank" rel="external">http://www.adobe.com/2006/mxml</a>&#34; <br/>&#160;&#160;&#160;&#160;layout=&#34;absolute&#34; creationComplete=&#34;completeHandler()&#34;&gt;<br/>&#160;&#160;&#160;&#160;&lt;mx:Script&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;![CDATA[<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;import mx.controls.Button;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;import flash.utils.ByteArray;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public function clone(source:Object):*<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;var myBA:ByteArray = new ByteArray();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;myBA.writeObject(source);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;myBA.position = 0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;return(myBA.readObject());<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private var c1:CloneClass;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private var c2:Object;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private function completeHandler():void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c1 = new CloneClass();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c1.age = 30;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c1.button = new Button;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c1.button.label = &#34;c1&#34;;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c2 = clone(c1);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;c1: &#34; + c1.age + &#34;&nbsp;&nbsp;&#34; + c1.button.label); // 输出 c1: 30&nbsp;&nbsp;c1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;c2: &#34; + c2.age + &#34;&nbsp;&nbsp;&#34; + c2.button.label); // 输出 c2: 30&nbsp;&nbsp;c1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private function change():void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c1.age = 50;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;c1.button.label = &#34;cc1&#34;;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;after changed --------------------------------&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;c1: &#34; + c1.age + &#34;&nbsp;&nbsp;&#34; + c1.button.label); // 输出 c1: 50&nbsp;&nbsp;cc1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;c2: &#34; + c2.age + &#34;&nbsp;&nbsp;&#34; + c2.button.label); // 输出 c2: 30&nbsp;&nbsp;c1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;]]&gt;<br/>&#160;&#160;&#160;&#160;&lt;/mx:Script&gt;<br/>&#160;&#160;&#160;&#160;&lt;mx:Button x=&#34;106&#34; y=&#34;97&#34; label=&#34;Change&#34; click=&#34;change()&#34;/&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&lt;/mx:Application&gt;<br/><br/></div></div><br/><strong>CloneClass 类</strong><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>package<br/>{<br/>&#160;&#160;&#160;&#160;import mx.controls.Button;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;public class CloneClass<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public var button:Button;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public var age:uint = 1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public function CloneClass()<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;}<br/>}<br/></div></div><br/><strong>Flex框架中已经包含了这个方法 mx.utils.ObjectUtil.copy(value:Object):Object，直接使用即可。</strong><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.flashshe.com/articles/article.asp?id=8</link>
			<title><![CDATA[删除旧的文章]]></title>
			<author>walt&#101;rshe@126.com(Admin)</author>
			<category><![CDATA[其他]]></category>
			<pubDate>Mon,08 Sep 2008 14:31:35 +0800</pubDate>
			<guid>http://www.flashshe.com/articles/default.asp?id=8</guid>
		<description><![CDATA[从2004年到现在，这个blog纪录了我的学习过程，这次换空间，旧的blog程序怎么也调试不好，只好换了一个新的blog程序，原来的老文章不想更新过来了，索性都干掉 <img src="http://www.flashshe.com/articles/images/smilies/Face_49.gif" border="0" style="margin:0px 0px -2px 0px" alt=""/>，只留下了最新的3篇。技术文章嘛，过时了也就没有价值了。]]></description>
		</item>
		
			<item>
			<link>http://www.flashshe.com/articles/article.asp?id=4</link>
			<title><![CDATA[Flex样式工作原理分析 Part Two(完结)]]></title>
			<author>walt&#101;rshe@126.com(admin)</author>
			<category><![CDATA[原创教程]]></category>
			<pubDate>Mon,08 Sep 2008 13:34:04 +0800</pubDate>
			<guid>http://www.flashshe.com/articles/default.asp?id=4</guid>
		<description><![CDATA[以下分析都从flex3源代码推出，不一定正确！希望能和有兴趣的朋友一起探讨。<br/><br/>在<a target="_blank" href="http://www.flashshe.com/blog/post/75.html" rel="external">Flex样式工作原理分析 Part One中</a>，我们分析了组件是如何获得样式信息的，下面来谈一下设置样式是如何工作的。<br/><br/>每当组件需要重新设置自己的样式时（比如说调用了setStyle()方法或者设置了styleName属性），组件的styleChanged(styleProp:String)方法就会被调用，然后我们在styleChanged(styleProp:String)方法体里面根据参数styleProp的值的不同来对组件的样式做出相应的处理。那么什么时候组件的styleChanged(styleProp:String)方法会触发呢？下面介绍如下：<br/><br/>1，setStyle()方法<br/>当我们调用setStyle()方法的时候，首先会调用该组件的styleChanged(styleProp)然后判断改变的样式是否是可继承样式，如果是，则调用该组件的所有子孙的styleChanged(styleProp)方法。比如：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">&lt;mx:Canvas id=&#34;myCanvas&#34;&gt;<br/>&#160;&#160;&#160;&#160;&lt;mx:Vbox id=&#34;box&#34; x=&#34;0&#34; y=&#34;10&#34; width=&#34;200&#34;&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;mx:Label id=&#34;text1&#34; text=&#34;@Resource(key=&#39;name&#39;, bundle=&#39;test&#39;)&#34; color=&#34;#ff0000&#34;/&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;mx:Label id=&#34;text2&#34; text=&#34;@Resource(key=&#39;age&#39;, bundle=&#39;test&#39;)&#34; styleName=&#34;ageLabel&#34;/&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;mx:Label id=&#34;text3&#34; text=&#34;@Resource(key=&#39;sex&#39;, bundle=&#39;test&#39;)&#34;/&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;mx:Label id=&#34;text4&#34; text=&#34;{resourceManager.getString(&#39;test&#39;, &#39;sex&#39;)}&#34;/&gt;<br/>&#160;&#160;&#160;&#160;&lt;/mx:Vbox&gt;<br/>&#160;&#160;&#160;&#160;&lt;mx:Button id=&#34;myBtn&#34; x=&#34;27&#34; y=&#34;100&#34; label=&#34;change&#34; click=&#34;changeHandler(event)&#34;/&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&lt;/mx:Canvas&gt;&nbsp;&nbsp; </div></div><br/>当我们调用 myCanvas.setStyle(&#34;color&#34;, 0xff0000)的时候，首先会重新设置该组件的样式缓存(CSS style cache)，<br/>这样调用myCanvas.getStyle(&#34;color&#34;)时就能得到值0xff0000。然后调用myCanvas.styleChanged(&#34;color&#34;); 因为<br/>color是可继承样式，所以会接着调用box.styleChanged(&#34;color&#34;)，text1.styleChanged(&#34;color&#34;)，text2.styleChanged(&#34;color&#34;)，text3.styleChanged(&#34;color&#34;)，text4.styleChanged(&#34;color&#34;)，myBtn.styleChanged(&#34;color&#34;);<br/>当我们调用 myCanvas.setStyle(&#34;backgroundColor&#34;, 0xff0000)的时候，首先调用myCanvas.styleChanged(&#34;backgroundColor&#34;)因为backgroundColor不是可继承样式，所以myCanvas的子孙的styleChanged(styleProp)方法不会被调用。<br/><br/>2. addChild(chlid)的时候<br/>当我们使用addChild(chlid)时，首先会重新设置该组件和该组件的子孙的样式缓存，然后调用chlid.styleChanged(null) 和chlid的子孙的styleChanged(null)方法。<br/><br/>3, 设置 styleName<br/>当我们给一个组件（比如实例名是child）设置styleName属性时，首先会重新设置该组件和该组件的子孙的样式缓存，然后调用chlid.styleChanged(&#34;styleName&#34;)和chlid的子孙的styleChanged(&#34;styleName&#34;)方法。<br/><br/>4, 运行时载入样式表单<br/>运行时载入样式表单我们通常会使用StyleManager.loadStyleDeclarations(url:String, up&#100;ate:Boolean = true, trustContent:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)方法。当把参数up&#100;ate设置为true时表示样式表单载入完成后马上更新样式。其原理是：样式表单载入完成后程序中的所有组件会重新设置组件的样式缓存，并调用组件的styleChanged(null)方法。 <br/><br/>当我们建立一个ActionScript自定义组件（ActionScript Custom Components），并且该组件支持自定义样式的时候，我们的组件类里面必须要有一个<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">override public function styleChanged(styleProp:String):void <br/>{<br/>&#160;&#160;&#160;&#160;// 方法体<br/>}</div></div>方法。为什么呢？应为如果没有这个方法，你怎么来检测你的样式的改变呢？<br/>通过我上面的分析，相信你一定能设计出一个出色的适应Flex框架的支持自定义样式的组件。关于“自定义组件支持自定义样式”你可以参考Flex帮助文档里面的 ActionScript Custom Components / Custom Style Properties 一节。 <br/><br/>此文禁止转载，但是您可以以超级链接的方式链接到这篇文章。<br/><br/>下面是 UIComponent 组件里面的styleChanged(styleProp:String):void方法的定义，和本文无关，只是方便我自己查阅而放在这里。<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;Detects changes to style properties. When any style property is set,<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;Flex calls the &lt;code&gt;styleChanged()&lt;/code&gt; method,<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;passing to it the name of the style being set.<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&lt;p&gt;This is an advanced method that you might override<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;when creating a subclass of UIComponent. When you cr&#101;ate a custom component,<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;you can override the &lt;code&gt;styleChanged()&lt;/code&gt; method<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;to check the style name passed to it, and handle the change accordingly.<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;This lets you override the default behavior of an existing style,<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;o&#114; add your own custom style properties.&lt;/p&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&lt;p&gt;If you handle the style property, your override of<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;the &lt;code&gt;styleChanged()&lt;/code&gt; method should call the<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&lt;code&gt;invalidateDisplayList()&lt;/code&gt; method to cause Flex to execute<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;the component&#39;s &lt;code&gt;up&#100;ateDisplayList()&lt;/code&gt; method at the next screen up&#100;ate.&lt;/p&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp; *<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;@param styleProp The name of the style property, o&#114; null if all styles for this<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;component have changed.<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public function styleChanged(styleProp:String):void<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// If font changed, then invalidateProperties so<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// we can re-cr&#101;ate the text field in commitProperties<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (this is IFontContextComponent &amp;&amp; hasFontContextChanged())<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidateProperties();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Check to see if this is one of the style properties<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// that is known to affect layout.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (!styleProp ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleProp == &#34;styleName&#34; ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StyleManager.isSizeInvalidatingStyle(styleProp))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// This style property change may affect the layout of this<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// object. Signal the LayoutManager to re-measure the object.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidateSize();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!styleProp || <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleProp == &#34;styleName&#34; ||<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleProp == &#34;themeColor&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initThemeColor();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidateDisplayList();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (parent is Iinvalidating)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (StyleManager.isParentSizeInvalidatingStyle(styleProp))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iinvalidating(parent).invalidateSize();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (StyleManager.isParentDisplayListInvalidatingStyle(styleProp))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iinvalidating(parent).invalidateDisplayList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}</div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.flashshe.com/articles/article.asp?id=3</link>
			<title><![CDATA[Flex样式工作原理分析 Part One]]></title>
			<author>walt&#101;rshe@126.com(admin)</author>
			<category><![CDATA[原创教程]]></category>
			<pubDate>Mon,08 Sep 2008 13:33:23 +0800</pubDate>
			<guid>http://www.flashshe.com/articles/default.asp?id=3</guid>
		<description><![CDATA[以下分析都从flex3源代码推出，不一定正确！希望能和有兴趣的朋友一起探讨。<br/><br/>在<a target="_blank" href="http://www.flashshe.com/blog/view.asp?id=74" rel="external">浅析Flex启动过程</a>一文曾说到过 <br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">播放头前进到第二桢，docFrameHandler 函数开始执行。<br/>首先会执行很多Singleton.registerClass方法，然后执行有[Mixin]元标签的类的<br/>public static function init(fbs:IFlexModuleFactory):void 方法</div></div><br/><br/>Flex编译器编译时会生成很多 有[Mixin]元标签的类 其中大部分类都与样式有关，象下面这些<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">&#34;_alertButtonStyleStyle&#34;, &#34;_ScrollBarStyle&#34;, <br/>&#34;_activeTabStyleStyle&#34;, &#34;_textAreaHScrollBarStyleStyle&#34;, <br/>&#34;_ToolTipStyle&#34;, &#34;_advancedDataGridStylesStyle&#34;, <br/>&#34;_comboDro&#112;downStyle&#34;, &#34;_comboDro&#112;DownStyle&#34;, <br/>&#34;_ContainerStyle&#34;, &#34;_textAreaVScrollBarStyleStyle&#34;,<br/> &#34;_linkButtonStyleStyle&#34;, &#34;_globalStyle&#34;, &#34;_windowStatusStyle&#34;, <br/>&#34;_windowStylesStyle&#34;, &#34;_activeButtonStyleStyle&#34;,<br/> &#34;_errorTipStyle&#34;, &#34;_richTextEditorTextAreaStyleStyle&#34;, <br/>&#34;_CursorManagerStyle&#34;, &#34;_todayStyleStyle&#34;, &#34;_dateFieldPopupStyle&#34;,<br/> &#34;_plainStyle&#34;, &#34;_dataGridStylesStyle&#34;, &#34;_ApplicationStyle&#34;, <br/>&#34;_headerDateTextStyle&#34;, &#34;_ButtonStyle&#34;, &#34;_VScrollBarStyle&#34;, <br/>&#34;_popUpMenuStyle&#34;, &#34;_swatchPanelTextFieldStyle&#34;,<br/> &#34;_opaquePanelStyle&#34;, &#34;_weekDayStyleStyle&#34;, &#34;_headerDragProxyStyleStyle&#34; </div></div><br/>类，他们的作用就是把样式信息注册到 StyleManager，这样在生成组件的时候组件能得到自己的样式信息。<br/><br/>在flex builder 安装目录下的 sdks\3.0.0\frameworks\libs 目录有一个framework.swc 文件，你用Winrar 打开会看到 defaults.css这个文件。Defaults.css文件定义了flex组件的默认样式，这里的每一个css选择符(sel&#101;ctor)就对应上面的一个类。其实上面的那些类是flex编译器按照这个defaults.css 文件在编译时自动生成的。<br/>下面就是其生成的_ButtonStyle 类：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>package <br/>{<br/><br/>import flash.display.Sprite;<br/>import mx.core.IFlexModuleFactory;<br/>import mx.core.mx_internal;<br/>import mx.styles.CSSStyleDeclaration;<br/>import mx.styles.StyleManager;<br/>import mx.skins.halo.ButtonSkin;<br/><br/>[ExcludeClass]<br/><br/>public class _ButtonStyle<br/>{<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public static function init(fbs:IFlexModuleFactory):void<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var style:CSSStyleDeclaration = StyleManager.getStyleDeclaration(&#34;Button&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!style)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style = new CSSStyleDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StyleManager.setStyleDeclaration(&#34;Button&#34;, style, false);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (style.defaultFactory == null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.defaultFactory = function():void<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.paddingTop = 2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.textAlign = &#34;center&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.skin = mx.skins.halo.ButtonSkin;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.paddingLeft = 10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fontWeight = &#34;bold&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.cornerRadius = 4;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.paddingRight = 10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.verticalGap = 2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.horizontalGap = 2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.paddingBottom = 2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/><br/>} <br/></div></div><br/>看完了就明白了吧，也就是说当这些类的&nbsp;&nbsp;init(fbs:IFlexModuleFactory)方法执行完后，我们就可以通过&#160;&#160;&#160;&#160;StyleManager.getStyleDeclaration(sel&#101;ctor:String):CSSStyleDeclaration&nbsp;&nbsp;方法获得在 defaluts.css文件中定义的样式信息。<br/><br/>需要注意的是如果你在编译时添加了其他的主题，那么主题的样式会覆盖 defaluts.css文件中的样式。<br/>假如你的主题 中定义了<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">Button<br/>{<br/>&#160;&#160;&#160;&#160;cornerRadius: 8;<br/>}</div></div><br/>那么你的 _ButtonStyle类中的 this.cornerRadius = 8; 而不是 this.cornerRadius = 4;<br/>当然你在主题中添加的新的css选择符在编译时也会生成相对应的类。比如你在主题中增加了 <br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">.flashshe<br/>{<br/>&#160;&#160;&#160;&#160;color: #ff0000;<br/>}</div></div><br/>那么编译器编译时会生成一个<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">package <br/>{<br/><br/>import flash.display.Sprite;<br/>import mx.core.IFlexModuleFactory;<br/>import mx.core.mx_internal;<br/>import mx.styles.CSSStyleDeclaration;<br/>import mx.styles.StyleManager;<br/><br/>[ExcludeClass]<br/><br/>public class _FlashsheStyle<br/>{<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public static function init(fbs:IFlexModuleFactory):void<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var style:CSSStyleDeclaration = StyleManager.getStyleDeclaration(&#34;.flashshe&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!style)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style = new CSSStyleDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StyleManager.setStyleDeclaration(&#34;.flashshe&#34;, style, false);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (style.defaultFactory == null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style.defaultFactory = function():void<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.color = 0xff0000;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/><br/>}</div></div><br/>类。在执行 Main.mxml （假设我们的Flex工程的主文件为Main.mxml）类的构造函数时会调用StyleManager.mx_internal::initProtoChainRoots();方法，执行完后 StyleManager.stylesRoot属性 指向一个 Object，通过这个 Object我们就可以访问到defaults.css文件中Global css 选择符定义的样式信息，如果你的Global css 选择符中定义了&nbsp;&nbsp;color: #0B333C;&nbsp;&nbsp; 那么StyleManager.stylesRoot[color]的值就为 0x0B333C。（注意这些都是 flex框架的内部方法，所以你不要尝试去访问，大部分情况下如果你访问的话编译器会报错，即使能访问，也不要去做）<br/><br/>当我们在flex中调用 addChild(child)的时候，其中包含了下面几步：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">addingChild(child);<br/>$addChildAt(child, index);<br/>childAdded(child);</div></div><br/>看如下一个mxml文件：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&gt;<br/>&lt;mx:Application xmlns:mx=&#34;<a href="http://www.adobe.com/2006/mxml" target="_blank" rel="external">http://www.adobe.com/2006/mxml</a>&#34; <br/>&#160;&#160;&#160;&#160;layout=&#34;absolute&#34; xmlns:ns1=&#34;*&#34;&gt;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&lt;mx:Style source=&#34;one.css&#34;/&gt;<br/>&#160;&#160;&#160;&#160;&lt;mx:Style&gt;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.myBtn<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;color: #00ff00;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fontSize: 14;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&lt;/mx:Style&gt;<br/>&#160;&#160;&#160;&#160;&lt;!--&nbsp;&nbsp;MyButton 组件 从 Button 继承 --&gt;<br/>&#160;&#160;&#160;&#160;&lt;ns1:MyButton　id=&#34;testBtn&#34; x=&#34;27&#34; y=&#34;200&#34; color=&#34;#0000ff&#34; styleName=&#34;myBtn&#34;/&gt;<br/>&#160;&#160;&#160;&#160;<br/>&lt;/mx:Application&gt;<br/></div></div><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>/* one.css */<br/><br/>Button<br/>{<br/>&#160;&#160;&#160;&#160;color: #ff0000;<br/>}<br/><br/>MyButton<br/>{<br/>&#160;&#160;&#160;&#160;fontWeight: 16;<br/>}<br/></div></div><br/>当生成 MyButton 时　过程如下：<br/>首先调用　addingChild(testBtn), 在这个方法里面<br/>1,获得 Global css 选择符中定义的样式的一份拷贝（通过 StyleManager.stylesRoot）；<br/>2,查找 Button css 选择符,将里面的样式添加到global拷贝中，同名的样式就覆盖；<br/>3,查找 MyButton css 选择符,将里面的样式添加到global拷贝中，同名的样式就覆盖；<br/>查找完type sel&#101;ctor后开始查找class sel&#101;ctor<br/>4, 查找 .myBtn css 选择符,将里面的样式添加到global拷贝中，同名的样式就覆盖；<br/>查找完 class sel&#101;ctor 后开始查找inline style<br/>4,将 color=&#34;#0000ff&#34; 样式添加到global拷贝中，同名的样式就覆盖；<br/><br/>最后将这些样式信息存储到　UIComponent的inheritingStyles 和 nonInheritingStyles 属性中。这样调用UIComponent.getStyle(styleProp:String):* 就可以得到正确的样式值了。<br/><br/>Flex框架通过这种方式，我们就可以在组件创建过程中得到组件的样式信息，方便我们在cr&#101;ateChildren()，commitProperties(),layoutChrome(),measure(),up&#100;ateDisplayList()方法中访问。在组件的构造函数中就不要使用 UIComponent.getStyle(styleProp:String):* 方法，因为你调用getStyle方法返回的是null。样式信息是用来渲染组件用的，所以没有必要在构造函数中使用。<br/><br/>此文禁止转载，但是您可以以超级链接的方式链接到这篇文章。]]></description>
		</item>
		
			<item>
			<link>http://www.flashshe.com/articles/article.asp?id=2</link>
			<title><![CDATA[浅析Flex启动过程]]></title>
			<author>walt&#101;rshe@126.com(admin)</author>
			<category><![CDATA[原创教程]]></category>
			<pubDate>Mon,08 Sep 2008 13:32:01 +0800</pubDate>
			<guid>http://www.flashshe.com/articles/default.asp?id=2</guid>
		<description><![CDATA[以下分析都从flex3源代码推出，不一定正确！希望能和有兴趣的朋友一起探讨！<br/><br/>每个 SWF 文件都有一个关联的 ActionScript 类，称为&#34;SWF 文件的主类&#34;。当 Flash Player 打开 SWF 文件时，Flash Player 将调用主类的构造函数，并创建主类的实例，将其添加为 Stage 对象的子级。(注：在主类的构造函数里面 访问 stage 不为空，非主类在构造函数里面 访问 stage 时stage == null)<br/><br/>假设我们的Flex工程的主文件为Main.mxml，当Flex3编译时会生成一个 _Main_mx_managers_SystemManager extends mx.managers.SystemManager 的类(提示：mx.managers.SystemManager extends MovieClip) ，该类即为主类。当使用 flash player播放main.swf文件时首先载入_Main_mx_managers_SystemManager类，执行该类的构造函数。<br/><br/>在构造函数中 首先会设置<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">stage.scaleMode = StageScaleMode.NO_SCALE;<br/>stage.align = StageAlign.TOP_LEFT;</div></div><br/><br/>并停在第一桢（默认情况下SystemManager 一共有两桢，如果你使用了<a target="_blank" href="http://www.flashshe.com/articles/article.asp?id=12" rel="external">frame编译器指令</a>的话就会比两桢要多)<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">stop();<br/><br/>if (root &amp;&amp; root.loaderInfo)<br/>root.loaderInfo.addEventListener(Event.INIT, initHandler);</div></div><br/>因为是swf的主类文件，所以这里的 root即为自己<br/><br/>（注释：对于加载的 SWF 文件中的显示对象，root 属性是此 SWF 文件所表示的显示列表树结构部分中的顶级显示对象。 对于代表已加载图像文件的位图对象，root 属性就是位图对象本身。 对于第一个加载的 SWF 文件的主类的实例，root 属性就是显示对象本身。 Stage 对象的 root 属性是 Stage 对象本身。 对于任何未添加到显示列表的显示对象，root 属性设置为 null，除非它已添加到符合以下条件的显示对象容器：不在显示列表中，但属于已加载 SWF 文件中顶级显示对象的子级。）<br/><br/>构造函数结束，等待initHandler的执行。<br/><br/>在 initHandler中作了如下事情： <br/><br/>1，定义 当播放头到达第二桢的时候 运行函数docFrameHandler<br/>addFrameScript(docFrame, docFrameHandler);<br/><br/>2，设置preloader<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">preloader = new Preloader();<br/>preloader.addEventListener(FlexEvent.INIT_PROGRESS, preloader_initProgressHandler);<br/>preloader.addEventListener(FlexEvent.PRELOADER_DONE, preloader_preloaderDoneHandler);</div></div><br/>并将 preloader 增加为该类的一个 child，接着获得 rsls（运行时共享库）和 resource modules 信息，并执行<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">preloader.initialize(<br/>usePreloader,<br/>preloaderDisplayClass,<br/>preloaderBackgroundColor,<br/>preloaderBackgroundAlpha,<br/>preloaderBackgroundImage,<br/>preloaderBackgroundSize,<br/>isStageRoot ? Stage.stageWidth : loaderInfo.width,<br/>isStageRoot ? Stage.stageHeight : loaderInfo.height,<br/>null,<br/>null,<br/>rslList,<br/>resourceModuleURLs);<br/>}</div></div><br/><br/>usePreloader和preloaderDisplayClass是你在你的Main.mxml文件&lt;mx:Application&gt; 标签里设置的preloader和usePreloader的值。<br/><br/>Preloader 开始运行，你可以看到进度条，当所有的文件从网络上下载完成后preloader<br/><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">dispatchEvent(new Event(Event.COMPLETE));<br/>dispatchEvent(new FlexEvent(FlexEvent.INIT_PROGRESS));</div></div><br/>preloader发布FlexEvent.INIT_PROGRESS事件后，在主类中定义的 preloader_initProgressHandler函数开始执行<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">private function preloader_initProgressHandler(event:Event):void<br/>{<br/>// Advance the next frame<br/>preloader.removeEventListener(FlexEvent.INIT_PROGRESS, preloader_initProgressHandler);<br/><br/>deferredNextFrame();<br/>}<br/></div></div><br/>执行完后，播放头前进到第二桢，如前所述，docFrameHandler 函数开始执行。<br/>首先会执行很多Singleton.registerClass方法，然后执行有[Mixin]元标签的类的<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">public static function init(fbs:IFlexModuleFactory):void</div></div>方法，接下来将编译的ResourceBundles增加到resourceManager，这样我们在程序中可以访问。下面开始执行 Main.mxml的构造函数<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">document = app = topLevelWindow = IUIComponent(cr&#101;ate());</div></div><br/>然后设置 Main.mxml的宽高为舞台的宽高，并执行preloader.registerApplication(app);函数，接着<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">addingChild(DisplayObject(app));<br/>// calls app.cr&#101;ateChildren()<br/>childAdded(DisplayObject(app)); </div></div><br/>下面就是 大家都挺熟悉的flex初始化过程<br/><br/>1，触发preinitialize事件<br/>2，执行初始化<br/>3，触发initialize事件<br/>4，执行创建过程<br/>5，触发creationComplete事件<br/><br/>触发creationComplete事件后preloader发布FlexEvent.INIT_COMPLETE事件，进度条（DownloadProgressBar.as）接收后会发布event.COMPLETE事件，preloader侦听后会发布FlexEvent.PRELOADER_DONE事件并执行主类中定义preloader_preloaderDoneHandler函数。在preloader_preloaderDoneHandler函数里面首先会移除进度条removeChild(preloader);这样我们才能看到我们的flash内容，然后<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">// Add the mouseCatcher as child 0.<br/>mouseCatcher = new FlexSprite();<br/>mouseCatcher.name = &#34;mouseCatcher&#34;;<br/>// Must use addChildAt because a creationComplete handler can cr&#101;ate a<br/>// dialog and ins&#101;rt it at 0.<br/>//noTopMostIndex++;<br/>super.addChildAt(mouseCatcher, 0); </div></div><br/>将Main.mxml 类的实例增加到显示列表<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.flashshe.com/articles/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">super.addChildAt(DisplayObject(app), 1);</div></div><br/>发布FlexEvent.APPLICATION_COMPLETE事情<br/>[CODE_LITE]app.dispatchEvent(new FlexEvent(FlexEvent.APPLICATION_COMPLETE));<br/>dispatchEvent(new FlexEvent(FlexEvent.APPLICATION_COMPLETE));[/CODE]<br/>至此启动过程完美结束:)<br/><br/>此文禁止转载，但是您可以以超级链接的方式链接到这篇文章。]]></description>
		</item>
		
</channel>
</rss>
