<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zrong&#039;s Blog &#187; AS3</title>
	<atom:link href="http://zengrong.net/post/tag/as3/feed" rel="self" type="application/rss+xml" />
	<link>http://zengrong.net</link>
	<description>Flash、Flex、RIA、web、Linux和我的生活</description>
	<lastBuildDate>Thu, 09 Feb 2012 15:09:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Signals框架介绍（三）原生事件</title>
		<link>http://zengrong.net/post/1510.htm</link>
		<comments>http://zengrong.net/post/1510.htm#comments</comments>
		<pubDate>Mon, 23 Jan 2012 15:16:15 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1510</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1510.htm" title="Signals框架介绍（三）原生事件"></a>注意：本文参考An introduction to AS3 Signals写成，但不是翻译，有增删改。 第一部分：Signals框架介绍（一）基本用法 第二部分：Signals框架介绍（二）高级事件 原生事件 为了达到替换AS3事件机制的目的，Signals当然包含了对AS3原生事件的支持。这依赖于NativeSignal类。 下面的范例演示了如何在Stage上添加单击事件。由于一看就懂，这里就不废话解释了。 [NativeSignalSample.as] ?Download NativeSignalSample.as1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 &#8230;<p class="read-more"><a href="http://zengrong.net/post/1510.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1510.htm" title="Signals框架介绍（三）原生事件"></a><p>注意：本文参考<a href="http://www.developria.com/2010/10/an-introduction-to-as3-signals.html">An introduction to AS3 Signals</a>写成，但不是翻译，有增删改。</p>
<ul>
<li>第一部分：<a href="http://zengrong.net/post/1504.htm">Signals框架介绍（一）基本用法</a></li>
<li>第二部分：<a href="http://zengrong.net/post/1507.htm">Signals框架介绍（二）高级事件</a></li>
</ul>
<hr />
<h3>原生事件</h3>
<p>为了达到替换AS3事件机制的目的，Signals当然包含了对AS3原生事件的支持。这依赖于NativeSignal类。</p>
<p>下面的范例演示了如何在Stage上添加单击事件。由于一看就懂，这里就不废话解释了。</p>
<p><strong>[NativeSignalSample.as]</strong></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://zengrong.net/wp-content/plugins/wp-codebox/wp-codebox.php?p=1510&amp;download=NativeSignalSample.as">NativeSignalSample.as</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15102"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code" id="p1510code2"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">MouseEvent</span>;
<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">osflash</span>.<span style="color: #006600;">signals</span>.<span style="color: #006600;">natives</span>.<span style="color: #006600;">NativeSignal</span>;
&nbsp;
<span style="color: #66cc66;">&#91;</span>SWF<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">width</span>=<span style="color: #cc66cc;">500</span>,<span style="color: #0066CC;">height</span>=<span style="color: #cc66cc;">300</span>,frameRate=<span style="color: #cc66cc;">30</span>,<span style="color: #0066CC;">backgroundColor</span>=0xFFFFFF<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #808080; font-style: italic;">/**
 * 测试原生事件
 * @author zrong(zengrong.net)
 */</span>
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> NativeSignalSample <span style="color: #0066CC;">extends</span> Sprite 
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> NativeSignalSample<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        _click = <span style="color: #000000; font-weight: bold;">new</span> NativeSignal<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>.<span style="color: #0066CC;">stage</span>, MouseEvent.<span style="color: #006600;">CLICK</span>, MouseEvent<span style="color: #66cc66;">&#41;</span>;
        _click.<span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span>handler_click<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">//测试只发生一次的点击事件</span>
        <span style="color: #808080; font-style: italic;">//_click.addOnce(handler_click);</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _click:NativeSignal;
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handler_click<span style="color: #66cc66;">&#40;</span>$evt:MouseEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'currentTarget：'</span>,$evt.<span style="color: #006600;">currentTarget</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'target：'</span>,$evt.<span style="color: #0066CC;">target</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<h3>其它资料</h3>
<ul>
<li><a href="http://www.developria.com/2010/10/an-introduction-to-as3-signals.html">An introduction to AS3 Signals</a>（本文的参考）</li>
<li><a href="http://johnlindquist.com/2010/01/21/as3-signals-tutorial/">AS3 Signals Tutorial</a>（一个非常棒的视频教程）</li>
<li><a href="https://github.com/robertpenner/as3-signals/wiki/community-examples">更多的文章，与其它框架(PureMVC,Robotlegs,Flex)的连用</a></li>
<li>Signals的作者关于AS3事件机制的3篇吐槽文 <a href="http://robertpenner.com/flashblog/2009/08/my-critique-of-as3-events-part-1.html">之一</a>,<a href="http://robertpenner.com/flashblog/2009/09/my-critique-of-as3-events-part-2.html">之二</a>,<a href="http://robertpenner.com/flashblog/2009/09/as3-events-7-things-ive-learned-from.html">之三</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1510.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Signals框架介绍（二）高级事件</title>
		<link>http://zengrong.net/post/1507.htm</link>
		<comments>http://zengrong.net/post/1507.htm#comments</comments>
		<pubDate>Mon, 23 Jan 2012 14:28:32 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1507</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1507.htm" title="Signals框架介绍（二）高级事件"></a>注意：本文参考An introduction to AS3 Signals写成，但不是翻译，有增删改。 第一部分：Signals框架介绍（一）基本用法 第三部分：Signals框架介绍（三）原生事件 也许你现在又想起了AS3内置事件框架的好处，希望使用currentTarget？或者希望支持冒泡？OK，Signals也能满足你那多变的心……（貌似是我自己多变罢了ˇ^ˇ） 高级事件 使用DeluxeSignal可以实现更高级的事件传递。还是基于闹钟的例子进行修改，将原来AlarmClock中的Signal改为DeluxSignal： [AlarmClock.as] ?View Code ACTIONSCRIPTpublic function AlarmClock&#40;&#41; &#123; //将自己作为引用传递给DeluxeSignal，同时增加GenericEvent的传递 alarm = new DeluxeSignal&#40;this, GenericEvent, Date&#41;; &#125; &#160; public var alarm:DeluxeSignal; &#160; public function ring&#40;&#41;:void &#123; alarm.dispatch&#40;new GenericEvent&#40;&#41;, new Date&#40;&#41;&#41;; &#125; 修改Wakeup.as中的处理器函数，让它能够接受到传递的2个参数。 &#8230;<p class="read-more"><a href="http://zengrong.net/post/1507.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1507.htm" title="Signals框架介绍（二）高级事件"></a><p>注意：本文参考<a href="http://www.developria.com/2010/10/an-introduction-to-as3-signals.html">An introduction to AS3 Signals</a>写成，但不是翻译，有增删改。</p>
<ul>
<li>第一部分：<a href="http://zengrong.net/post/1504.htm">Signals框架介绍（一）基本用法</a></li>
<li>第三部分：<a href="http://zengrong.net/post/1510.htm">Signals框架介绍（三）原生事件</a></li>
</ul>
<hr />
<p>也许你现在又想起了AS3内置事件框架的好处，希望使用currentTarget？或者希望支持冒泡？OK，Signals也能满足你那多变的心……（貌似是我自己多变罢了ˇ^ˇ）</p>
<h3>高级事件</h3>
<p>使用DeluxeSignal可以实现更高级的事件传递。还是基于闹钟的例子进行修改，将原来AlarmClock中的Signal改为DeluxSignal：<span id="more-1507"></span></p>
<p>[AlarmClock.as]</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1507code9'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15079"><td class="code" id="p1507code9"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> AlarmClock<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">//将自己作为引用传递给DeluxeSignal，同时增加GenericEvent的传递</span>
    alarm = <span style="color: #000000; font-weight: bold;">new</span> DeluxeSignal<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, GenericEvent, <span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> alarm:DeluxeSignal;
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ring<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
    alarm.<span style="color: #006600;">dispatch</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> GenericEvent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>修改Wakeup.as中的处理器函数，让它能够接受到传递的2个参数。</p>
<p>[Wakeup.as]</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1507code10'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150710"><td class="code" id="p1507code10"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handler_ring<span style="color: #66cc66;">&#40;</span>$evt:GenericEvent, $date:<span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'currentTarget：'</span>,$evt.<span style="color: #006600;">currentTarget</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'target：'</span>,$evt.<span style="color: #0066CC;">target</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'signal：'</span>,$evt.<span style="color: #006600;">signal</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'起床了！！！也不看看几点了：'</span>+$date.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>在这里出现的GenericEvent，并非继承自flash.events.Event，而是实现了Signals自己的IEvent接口，与AS3的事件机制毫无关系。取一个貌似兄弟的名称，是为了方便大家理解罢了。它所提供的currentTarget和target属性，也是由IEvent自身提供。</p>
<p>运行修改后的例子，可以看到如下输出：</p>
<blockquote>
<p>[trace] currentTarget： [object AlarmClock]<br />
  [trace] target： [object AlarmClock]<br />
  [trace] signal： [object DeluxeSignal]<br />
  [trace] 起床了！！！也不看看几点了：Mon Jan 23 17:07:16 GMT+0800 2012</p>
</blockquote>
<p>现在，是不是可以对currentTarget“为所欲为”了呢？</p>
<h3>冒泡事件</h3>
<p>Signals一样可以冒泡，而且并不依赖AS3自带的事件机制。当然，发送和接收冒泡事件的对象必须处于显示列表中。</p>
<p>为了让AlarmClock能够被加入显示列表，我们让AlarmClock继承Sprite。而抛出冒泡事件就非常简单，只需要在实例化GenericEvent的同时传递true参数即可。看看AlarmClock类被修改的部分吧：</p>
<p>[AlarmClock.as]</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1507code11'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150711"><td class="code" id="p1507code11"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AlarmClock <span style="color: #0066CC;">extends</span> Sprite
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ring<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
    <span style="color: #66cc66;">&#123;</span>
        alarm.<span style="color: #006600;">dispatch</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> GenericEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>接收事件的类，必须实现IBubbleEventHandler接口，在onEventBubbled中处理冒泡事件。同时，要将&#92;_alarm实例加入显示列表。</p>
<p>为了方便查看冒泡效果，可以将addOnce所在的一行注释掉，只接收冒泡事件。</p>
<p>[Wakeup.as]</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1507code12'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150712"><td class="code" id="p1507code12"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Wakeup <span style="color: #0066CC;">extends</span> Sprite <span style="color: #0066CC;">implements</span> IBubbleEventHandler
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Wakeup<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        _alarm  = <span style="color: #000000; font-weight: bold;">new</span> AlarmClock<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        addChild<span style="color: #66cc66;">&#40;</span>_alarm<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">//_alarm.alarm.addOnce(handler_ring);</span>
        _alarm.<span style="color: #006600;">ring</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> onEventBubbled<span style="color: #66cc66;">&#40;</span>$evt:IEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Boolean</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'冒泡 currentTarget：'</span>,$evt.<span style="color: #006600;">currentTarget</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'冒泡 target：'</span>,$evt.<span style="color: #0066CC;">target</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'冒泡 signal：'</span>,$evt.<span style="color: #006600;">signal</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">//返回false代表不再继续冒泡</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">false</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>运行修改后的例子，可以看到如下输出：</p>
<blockquote>
<p>[trace] 冒泡 currentTarget： [object Wakeup]<br />
  [trace] 冒泡 target： [object AlarmClock]<br />
  [trace] 冒泡 signal： [object DeluxeSignal]</p>
</blockquote>
<h3>完整的类</h3>
<p><strong>[AlarmClock.as]</strong></p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://zengrong.net/wp-content/plugins/wp-codebox/wp-codebox.php?p=1507&amp;download=AlarmClock.as">AlarmClock.as</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150713"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p1507code13"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">osflash</span>.<span style="color: #006600;">signals</span>.<span style="color: #006600;">Signal</span>;
<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">osflash</span>.<span style="color: #006600;">signals</span>.<span style="color: #006600;">DeluxeSignal</span>;
<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">osflash</span>.<span style="color: #006600;">signals</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">GenericEvent</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">/**
* Signals闹钟范例
* @author Aiden Tailor(http://www.developria.com/2010/10/an-introduction-to-as3-signals.html)
* @author zrong(zengrong.net)
*/</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AlarmClock <span style="color: #0066CC;">extends</span> Sprite
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> AlarmClock<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        alarm = <span style="color: #000000; font-weight: bold;">new</span> DeluxeSignal<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">this</span>, GenericEvent, <span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> alarm:DeluxeSignal;
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ring<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;">//使用冒泡的方式发布闹钟的响铃事件</span>
        alarm.<span style="color: #006600;">dispatch</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> GenericEvent<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p><strong>[Wakeup.as]</strong></p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://zengrong.net/wp-content/plugins/wp-codebox/wp-codebox.php?p=1507&amp;download=Wakeup.as">Wakeup.as</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150714"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
</pre></td><td class="code" id="p1507code14"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">osflash</span>.<span style="color: #006600;">signals</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">GenericEvent</span>;
<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">osflash</span>.<span style="color: #006600;">signals</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">IBubbleEventHandler</span>;
<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">osflash</span>.<span style="color: #006600;">signals</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">IEvent</span>;
&nbsp;
<span style="color: #66cc66;">&#91;</span>SWF<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">width</span>=<span style="color: #cc66cc;">500</span>,<span style="color: #0066CC;">height</span>=<span style="color: #cc66cc;">300</span>,frameRate=<span style="color: #cc66cc;">30</span>,<span style="color: #0066CC;">backgroundColor</span>=0xFFFFFF<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #808080; font-style: italic;">/**
 * 测试闹钟
 * @author Aiden Tailor(http://www.developria.com/2010/10/an-introduction-to-as3-signals.html)
 * @author zrong(zengrong.net)
 */</span>
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Wakeup <span style="color: #0066CC;">extends</span> Sprite <span style="color: #0066CC;">implements</span> IBubbleEventHandler
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Wakeup<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        _alarm  = <span style="color: #000000; font-weight: bold;">new</span> AlarmClock<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        addChild<span style="color: #66cc66;">&#40;</span>_alarm<span style="color: #66cc66;">&#41;</span>;
        _alarm.<span style="color: #006600;">alarm</span>.<span style="color: #006600;">addOnce</span><span style="color: #66cc66;">&#40;</span>handler_ring<span style="color: #66cc66;">&#41;</span>;
        _alarm.<span style="color: #006600;">ring</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _alarm:AlarmClock;
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handler_ring<span style="color: #66cc66;">&#40;</span>$evt:GenericEvent, $date:<span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'currentTarget：'</span>,$evt.<span style="color: #006600;">currentTarget</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'target：'</span>,$evt.<span style="color: #0066CC;">target</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'signal：'</span>,$evt.<span style="color: #006600;">signal</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'起床了！！！也不看看几点了：'</span>+$date.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> onEventBubbled<span style="color: #66cc66;">&#40;</span>$evt:IEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Boolean</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'冒泡 currentTarget：'</span>,$evt.<span style="color: #006600;">currentTarget</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'冒泡 target：'</span>,$evt.<span style="color: #0066CC;">target</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'冒泡 signal：'</span>,$evt.<span style="color: #006600;">signal</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">//返回false代表不再继续冒泡</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">false</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1507.htm/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Signals框架介绍（一）基本用法</title>
		<link>http://zengrong.net/post/1504.htm</link>
		<comments>http://zengrong.net/post/1504.htm#comments</comments>
		<pubDate>Fri, 20 Jan 2012 10:16:19 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1504</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1504.htm" title="Signals框架介绍（一）基本用法"></a>注意：本文参考An introduction to AS3 Signals写成，但不是翻译，有增删改。 第二部分：Signals框架介绍（二）高级事件 第三部分：Signals框架介绍（三）原生事件 Signals是一个基于AS3的轻量级事件框架，它被设计用来代替AS3内置的Event框架。 为什么我们要放弃Event框架，改用Signals呢？原因主要有以下几点： 使用AS3内置的Event框架，必须继承EventDispatcher或者自行实现IEventDispatcher，而Signals使用组合，可以避免继承； 使用AS3内置框架在事件中实现值的传递，必须自定义事件类才可以。而Signals可以方便的实现多个强类型值的传递； Signals不使用字符串来区分不同的事件，而是使用实例; Signals的速度更快，据说是AS3内置事件机制的4倍。 来看个简单的例子吧，这个例子中的闹钟会叫我们起床。此范例部分源码来自An introduction to AS3 Signals 基本用法 先看看闹钟类AlarmClock.as ?View Code ACTIONSCRIPTpackage &#123; import org.osflash.signals.Signal; &#160; /** * Signals闹钟范例 * @author Aiden Tailor(http://www.developria.com/2010/10/an-introduction-to-as3-signals.html) * @author zrong(zengrong.net) */ &#160; public &#8230;<p class="read-more"><a href="http://zengrong.net/post/1504.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1504.htm" title="Signals框架介绍（一）基本用法"></a><p>注意：本文参考<a href="http://www.developria.com/2010/10/an-introduction-to-as3-signals.html">An introduction to AS3 Signals</a>写成，但不是翻译，有增删改。</p>
<ul>
<li>第二部分：<a href="http://zengrong.net/post/1507.htm">Signals框架介绍（二）高级事件</a></li>
<li>第三部分：<a href="http://zengrong.net/post/1510.htm">Signals框架介绍（三）原生事件</a></li>
</ul>
<hr />
<p><a href="https://github.com/robertpenner/as3-signals">Signals</a>是一个基于AS3的轻量级事件框架，它被设计用来代替AS3内置的Event框架。</p>
<p>为什么我们要放弃Event框架，改用Signals呢？原因主要有以下几点：</p>
<ol>
<li>使用AS3内置的Event框架，必须继承EventDispatcher或者自行实现IEventDispatcher，而Signals使用组合，可以避免继承；</li>
<li>使用AS3内置框架在事件中实现值的传递，必须自定义事件类才可以。而Signals可以方便的实现多个强类型值的传递；</li>
<li>Signals不使用字符串来区分不同的事件，而是使用实例;</li>
<li>Signals的速度更快，据说是AS3内置事件机制的4倍。</li>
</ol>
<p>来看个简单的例子吧，这个例子中的闹钟会叫我们起床。此范例部分源码来自<a href="http://www.developria.com/2010/10/an-introduction-to-as3-signals.html">An introduction to AS3 Signals</a><br />
<span id="more-1504"></span></p>
<h3>基本用法</h3>
<p>先看看闹钟类AlarmClock.as</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1504code21'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150421"><td class="code" id="p1504code21"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">osflash</span>.<span style="color: #006600;">signals</span>.<span style="color: #006600;">Signal</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">/**
* Signals闹钟范例
* @author Aiden Tailor(http://www.developria.com/2010/10/an-introduction-to-as3-signals.html)
* @author zrong(zengrong.net)
*/</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AlarmClock
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> AlarmClock<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        alarm = <span style="color: #000000; font-weight: bold;">new</span> Signal<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
     * 声明一个Signal实例用来发送Signal
     */</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> alarm:Signal;
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ring<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;">//发布闹钟的响铃事件</span>
        alarm.<span style="color: #006600;">dispatch</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>再来看看起床类Wakeup.as</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1504code22'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150422"><td class="code" id="p1504code22"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
&nbsp;
<span style="color: #66cc66;">&#91;</span>SWF<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">width</span>=<span style="color: #cc66cc;">500</span>,<span style="color: #0066CC;">height</span>=<span style="color: #cc66cc;">300</span>,frameRate=<span style="color: #cc66cc;">30</span>,<span style="color: #0066CC;">backgroundColor</span>=0xFFFFFF<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #808080; font-style: italic;">/**
 * 测试闹钟
 * @author Aiden Tailor(http://www.developria.com/2010/10/an-introduction-to-as3-signals.html)
 * @author zrong(zengrong.net)
 */</span>
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Wakeup <span style="color: #0066CC;">extends</span> Sprite
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Wakeup<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        _alarm  = <span style="color: #000000; font-weight: bold;">new</span> AlarmClock<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <span style="color: #808080; font-style: italic;">//向alarm注册事件，这里不需要提供任何的事件名称。因为alarm就是一个确定的Signal实例。</span>
        _alarm.<span style="color: #006600;">alarm</span>.<span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span>handler_ring<span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <span style="color: #808080; font-style: italic;">//使用addOnce，让alarm在事件收到一次后立即取消</span>
        <span style="color: #808080; font-style: italic;">//_alarm.alarm.addOnce(handler_ring);</span>
&nbsp;
        _alarm.<span style="color: #006600;">ring</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        _alarm.<span style="color: #006600;">ring</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _alarm:AlarmClock;
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
     * 由于我们并没有在事件中传递参数，因此这里的方法也不需要提供任何参数。
     */</span>
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handler_ring<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'起床了！！！'</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>在进行事件注册的时候，我们使用的是AlarmClock的public属性alarm。在面向对象编程中，这种方式是不可取的。但我们现在只是个范例对么？不要要求那么严格好不好？</p>
<p>当然，如果你知道在AS3中，使用get方法会比直接使用public属性的性能低不少，或许你也会让这种“不规范”的编程方法延续下去？</p>
<h3>取消事件注册</h3>
<p>如果运行这个范例，应该可以看到2条“起床了！！！”的trace信息。然后，取消addOnce一行的注释，并注释掉add那行，让它们变成这样：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1504code23'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150423"><td class="code" id="p1504code23"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Wakeup<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    _alarm  = <span style="color: #000000; font-weight: bold;">new</span> AlarmClock<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">//向alarm注册事件，这里不需要提供任何的事件名称。因为alarm就是一个确定的Signal实例。</span>
    <span style="color: #808080; font-style: italic;">//_alarm.alarm.add(handler_ring);</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">//使用addOnce，让alarm在事件收到一次后立即取消</span>
    _alarm.<span style="color: #006600;">alarm</span>.<span style="color: #006600;">addOnce</span><span style="color: #66cc66;">&#40;</span>handler_ring<span style="color: #66cc66;">&#41;</span>;
&nbsp;
    _alarm.<span style="color: #006600;">ring</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    _alarm.<span style="color: #006600;">ring</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>再次运行范例，应该只能看到1条trace信息了。你可以把这种现象理解成原来的AS事件机制中的removeEventDispatcher被自动执行了。</p>
<p>当然，手动移除也是可以的。如果你使用的是add方法注册，可以使用下面的方法来移除事件的注册。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1504code24'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150424"><td class="code" id="p1504code24"><pre class="actionscript" style="font-family:monospace;">_alarm.<span style="color: #006600;">alarm</span>.<span style="color: #006600;">remove</span><span style="color: #66cc66;">&#40;</span>handler_ring<span style="color: #66cc66;">&#41;</span>;
_alarm.<span style="color: #006600;">alarm</span>.<span style="color: #006600;">removeAll</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<h3>传递参数</h3>
<p>看看传递参数有多简单吧……修改AlarmClock.as中的相关代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1504code25'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150425"><td class="code" id="p1504code25"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> AlarmClock<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">//让我们传递一个AS3的标准Date对象吧，让那个懒虫知道现在几点</span>
    alarm = <span style="color: #000000; font-weight: bold;">new</span> Signal<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ring<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">//把当前的时间发出去</span>
    alarm.<span style="color: #006600;">dispatch</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>再修改Wakeup.as中的相关代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1504code26'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p150426"><td class="code" id="p1504code26"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handler_ring<span style="color: #66cc66;">&#40;</span>$date:<span style="color: #0066CC;">Date</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'起床了！！！也不看看几点了：'</span>+$date.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>就这样，不需要该死的继承Event和重写clone()了，是不是很清净呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1504.htm/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>将图像的透明区域转换为Alpha通道原理</title>
		<link>http://zengrong.net/post/1454.htm</link>
		<comments>http://zengrong.net/post/1454.htm#comments</comments>
		<pubDate>Tue, 27 Sep 2011 01:56:56 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[BitmapData]]></category>
		<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1454</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1454.htm" title="将图像的透明区域转换为Alpha通道原理"></a>在Sprite Sheep Editor中，使用了这样的一个小技术（思路来自这里）：将透明图像的Alpha通道转换成黑白（灰度）图像，然后与正常图像拼合成一张大图，再存储成JPEG格式。 这方法其实是一个折中方案。因为JPEG格式是不支持透明的，很多时候为了获得透明效果，我们只能使用PNG格式。但PNG是无损压缩的，在图像尺寸上没有优势。如果将Alpha通道转换成黑白图并保存到JPEG图像中，就能大幅降低最终的图像文件大小。 在我的测试中，一个2000&#215;3300的32位带Alpha通道的PNG图像文件大小为2MB，转换为4000&#215;3300（因为拼合了黑白图片，宽度增加一倍）70%压缩比的JPEG后，文件大小为1.1MB。 当然，转换后的JPEG文件画质比PNG要稍差一些。这可以通过调整压缩比得到一定程度的改善。 要将图像的Alpha通道转换为黑白图像，在AS3中很容易： ?View Code ACTIONSCRIPTvar __p:Point = new Point&#40;0,0&#41;; _channelBmd = new BitmapData&#40;_bmd.width, _bmd.height, true, 0x00000000&#41;; _channelBmd.fillRect&#40;_bmd.rect, 0xff000000&#41;; _channelBmd.copyChannel&#40;_bmd, _bmd.rect, __p, 8, 1&#41;; _channelBmd.copyChannel&#40;_bmd, _bmd.rect, __p, 8, 2&#41;; _channelBmd.copyChannel&#40;_bmd, _bmd.rect, __p, 8, 4&#41; 这些代码将 _bmd的Alpha通道信息分别复制到 &#8230;<p class="read-more"><a href="http://zengrong.net/post/1454.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1454.htm" title="将图像的透明区域转换为Alpha通道原理"></a><p>在<a href="http://zengrong.net/sprite_sheet_editor">Sprite Sheep Editor</a>中，使用了这样的一个小技术（思路来自<a href="http://www.riaidea.com/blog/archives/279.html">这里</a>）：将透明图像的Alpha通道转换成黑白（灰度）图像，然后与正常图像拼合成一张大图，再存储成JPEG格式。</p>
<p>这方法其实是一个折中方案。因为JPEG格式是不支持透明的，很多时候为了获得透明效果，我们只能使用PNG格式。但PNG是无损压缩的，在图像尺寸上没有优势。如果将Alpha通道转换成黑白图并保存到JPEG图像中，就能大幅降低最终的图像文件大小。</p>
<p>在我的测试中，一个2000&#215;3300的32位带Alpha通道的PNG图像文件大小为2MB，转换为4000&#215;3300（因为拼合了黑白图片，宽度增加一倍）70%压缩比的JPEG后，文件大小为1.1MB。</p>
<p>当然，转换后的JPEG文件画质比PNG要稍差一些。这可以通过调整压缩比得到一定程度的改善。</p>
<p>要将图像的Alpha通道转换为黑白图像，在AS3中很容易：<span id="more-1454"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1454code30'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p145430"><td class="code" id="p1454code30"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> __p:Point = <span style="color: #000000; font-weight: bold;">new</span> Point<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
_channelBmd = <span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span>_bmd.<span style="color: #0066CC;">width</span>, _bmd.<span style="color: #0066CC;">height</span>, <span style="color: #000000; font-weight: bold;">true</span>, 0x00000000<span style="color: #66cc66;">&#41;</span>;
_channelBmd.<span style="color: #006600;">fillRect</span><span style="color: #66cc66;">&#40;</span>_bmd.<span style="color: #006600;">rect</span>, 0xff000000<span style="color: #66cc66;">&#41;</span>;
_channelBmd.<span style="color: #006600;">copyChannel</span><span style="color: #66cc66;">&#40;</span>_bmd, _bmd.<span style="color: #006600;">rect</span>, __p, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
_channelBmd.<span style="color: #006600;">copyChannel</span><span style="color: #66cc66;">&#40;</span>_bmd, _bmd.<span style="color: #006600;">rect</span>, __p, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
_channelBmd.<span style="color: #006600;">copyChannel</span><span style="color: #66cc66;">&#40;</span>_bmd, _bmd.<span style="color: #006600;">rect</span>, __p, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这些代码将 <code>_bmd</code>的Alpha通道信息分别复制到 <code>_channelBmd</code>的红绿蓝通道中，最终合成了一张代表Alpha通道的灰度图。</p>
<p>但是，并不是所有语言都有“通道”这个概念。其实AS3中的“通道”（包括Photoshop中的）就是在颜色中的红绿蓝值而已，我们可以手工把ARGB颜色中的Alpha分离出来，将它们组成RGB颜色。这是AS3的实现：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1454code31'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p145431"><td class="code" id="p1454code31"><pre class="actionscript" style="font-family:monospace;">_pixelBmd = <span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span>_bmd.<span style="color: #0066CC;">width</span>, _bmd.<span style="color: #0066CC;">height</span>, <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i:<span style="color: #0066CC;">int</span>=<span style="color: #cc66cc;">0</span>;i<span style="color: #66cc66;">&lt;</span>_bmd.<span style="color: #0066CC;">height</span>;i++<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">var</span> __str:<span style="color: #0066CC;">String</span> = <span style="color: #ff0000;">''</span>;
    <span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> j:<span style="color: #0066CC;">int</span>=<span style="color: #cc66cc;">0</span>;j<span style="color: #66cc66;">&lt;</span>_bmd.<span style="color: #0066CC;">width</span>;j++<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">var</span> __pixel:<span style="color: #0066CC;">int</span> = _bmd.<span style="color: #006600;">getPixel32</span><span style="color: #66cc66;">&#40;</span>j,i<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">//分离ARGB颜色中的alpha值，alpha处于32位的最前面8位</span>
        <span style="color: #000000; font-weight: bold;">var</span> __alpha:<span style="color: #0066CC;">int</span> = $argb <span style="color: #66cc66;">&gt;&gt;</span> <span style="color: #cc66cc;">24</span> <span style="color: #66cc66;">&amp;</span> 0xFF;
        <span style="color: #000000; font-weight: bold;">var</span> __argbstr:<span style="color: #0066CC;">String</span> = __alpha == <span style="color: #cc66cc;">0</span> ? <span style="color: #ff0000;">'00'</span> : __alpha.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">16</span><span style="color: #66cc66;">&#41;</span>;
        __str += __argbstr + <span style="color: #ff0000;">' '</span>;
        <span style="color: #808080; font-style: italic;">//利用alpha的值合并成RGB颜色值，因为不需要透明，因此24位即可</span>
        __pixel = __alpha <span style="color: #66cc66;">&lt;&lt;</span> <span style="color: #cc66cc;">16</span> <span style="color: #66cc66;">|</span> __alpha <span style="color: #66cc66;">&lt;&lt;</span> <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">|</span> __alpha;
        _pixelBmd.<span style="color: #006600;">setPixel</span><span style="color: #66cc66;">&#40;</span>j,i, __pixel<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #808080; font-style: italic;">//如果你的屏幕足够宽，可以看到一个字符画，内容你猜猜？</span>
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>__str<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>这是JAVA的实现，当然，也可以用RGBImageFilter来做这件事：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1454code32'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p145432"><td class="code" id="p1454code32"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">BufferedImage</span></a> convertImage<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">BufferedImage</span></a> $image<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    _img <span style="color: #339933;">=</span> $image<span style="color: #339933;">;</span>
    _w <span style="color: #339933;">=</span> _img.<span style="color: #006633;">getWidth</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    _h <span style="color: #339933;">=</span> _img.<span style="color: #006633;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    _sourceARGB <span style="color: #339933;">=</span> _img.<span style="color: #006633;">getRGB</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, _w, _h, <span style="color: #000066; font-weight: bold;">null</span>, <span style="color: #cc66cc;">0</span>, _w<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">BufferedImage</span></a> __image <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">BufferedImage</span></a><span style="color: #009900;">&#40;</span>_w, _h, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abufferedimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">BufferedImage</span></a>.<span style="color: #006633;">TYPE_INT_RGB</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> __destARGB <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span>_sourceARGB.<span style="color: #006633;">length</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;所有数组的长度：&quot;</span><span style="color: #339933;">+</span>_sourceARGB.<span style="color: #006633;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span>_sourceARGB.<span style="color: #006633;">length</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">int</span> __alpha <span style="color: #339933;">=</span> _sourceARGB<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">24</span> <span style="color: #339933;">&amp;</span> 0xFF<span style="color: #339933;">;</span>
        __destARGB<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> __alpha <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">16</span> <span style="color: #339933;">|</span> __alpha <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">8</span> <span style="color: #339933;">|</span> __alpha<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    __image.<span style="color: #006633;">setRGB</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, _w, _h, __destARGB, <span style="color: #cc66cc;">0</span>, _w<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> __image<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>一个AS3实现的范例：</p>
Note: There is a file embedded within this post, please visit this post to download the file.
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1454.htm/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>使用Embed标签在AS3项目中嵌入字体</title>
		<link>http://zengrong.net/post/1438.htm</link>
		<comments>http://zengrong.net/post/1438.htm#comments</comments>
		<pubDate>Tue, 06 Sep 2011 09:24:03 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1438</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1438.htm" title="使用Embed标签在AS3项目中嵌入字体"></a>2011年9月10日更新：根据网友zszen的回复，找到这样几篇更详细的文章： Flash字体嵌入方法总结—(1)基础篇 Flash字体嵌入方法总结—(2)ActionScript基础篇 Flash字体嵌入方法总结—(3)ActionScript提高篇 Flash字体嵌入方法总结—(4)进阶篇 Flash中文字体嵌入助手 在线版　AIR版　源码 FontCreator &#8211; 好用的字体编辑工具 MainType &#8211; 同一公司出品的字体管理工具 source on github 关于嵌入字体，其实Embed fonts这篇文章已经很详细的介绍了。但这篇文章有这样几个问题： 它是针对Flex开发者的，纯AS开发者看起来未免不爽； 没有讲解怎么使用在Flash IDE中嵌入的字体； 嵌入字体就那么点东西，其实不值得花功夫读这一大篇鸟语（介是偷懒……） 那我就把要点总结下…… 配合Flash IDE使用 我现在开始讨厌Flash IDE，因为它实在太慢，而且跳版本不兼容。但如果希望可视化的控制嵌入的字体中的文本，还必须使用Flash CS5。 下面是Flash CS5嵌入字体的两张截图。 这个界面很直观，但其实我们可以用更直观的方式（控制unicodeRange的方式，当然，这个“直观”只是对程序员来说），后面会讲到。 图中的“传统”和“TLF”分别对应你的字体是用于TextField还是用于FlashPlayer 10支持的FTE引擎。这两者是互斥的，不能选错。 如果在输出属性面板中选择的目标是Flash Player 9，那么在这里是不能选择嵌入方式的。 输出后的swf，使用下面的语法嵌入： ?View Code ACTIONSCRIPT&#91;Embed&#40;source=&#34;myFont.swf&#34;,fontFamily=&#34;04b_08&#34;&#93; &#8230;<p class="read-more"><a href="http://zengrong.net/post/1438.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1438.htm" title="使用Embed标签在AS3项目中嵌入字体"></a><p><span style="color:red;">2011年9月10日更新：</span>根据网友zszen的回复，找到这样几篇更详细的文章：</p>
<ul>
<li><a href="http://kevincao.com/2009/06/flash-font-1/">Flash字体嵌入方法总结—(1)基础篇</a></li>
<li><a href="http://kevincao.com/2009/06/flash-font-2/">Flash字体嵌入方法总结—(2)ActionScript基础篇</a></li>
<li><a href="http://kevincao.com/2009/06/flash-font-3/">Flash字体嵌入方法总结—(3)ActionScript提高篇</a></li>
<li><a href="http://kevincao.com/2009/06/flash-font-4/">Flash字体嵌入方法总结—(4)进阶篇</a></li>
<li>Flash中文字体嵌入助手 <a href="http://kevincao.com/app/font/">在线版</a>　<a href="http://kevincao.com/2010/07/hanfont/">AIR版</a>　<a href="https://github.com/kyoji2/HanFont">源码</a></li>
<li><a href="http://www.high-logic.com/fontcreator.html">FontCreator</a> &#8211; 好用的字体编辑工具</li>
<li><a href="http://www.high-logic.com/maintype.html">MainType</a> &#8211; 同一公司出品的字体管理工具</li>
</ul>
<hr />
<p><a href="https://github.com/zrong/blog/edit/master/as3_embed_font.md">source on github</a></p>
<p>关于嵌入字体，其实<a href="http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7f5f.html">Embed fonts</a>这篇文章已经很详细的介绍了。但这篇文章有这样几个问题：</p>
<ol>
<li>它是针对Flex开发者的，纯AS开发者看起来未免不爽；</li>
<li>没有讲解怎么使用在Flash IDE中嵌入的字体；</li>
<li>嵌入字体就那么点东西，其实不值得花功夫读这一大篇鸟语（介是偷懒……）</li>
</ol>
<p>那我就把要点总结下……<span id="more-1438"></span></p>
<h3>配合Flash IDE使用</h3>
<p>我现在开始讨厌Flash IDE，因为它实在太慢，而且跳版本不兼容。但如果希望可视化的控制嵌入的字体中的文本，还必须使用Flash CS5。</p>
<p>下面是Flash CS5嵌入字体的两张截图。</p>
<p><a href="/wp-content/uploads/2011/09/cs5_embedfont_1.png"><img src="/wp-content/uploads/2011/09/cs5_embedfont_1-300x187.png" alt="选择要嵌入的文本" title="选择要嵌入的文本" width="300" height="187" class="aligncenter size-medium wp-image-1439" /></a></p>
<p>这个界面很直观，但其实我们可以用更直观的方式（控制unicodeRange的方式，当然，这个“直观”只是对程序员来说），后面会讲到。</p>
<p><a href="/wp-content/uploads/2011/09/cs5_embedfont_2.png"><img src="/wp-content/uploads/2011/09/cs5_embedfont_2-300x187.png" alt="选择要嵌入的方式" title="选择要嵌入的方式" width="300" height="187" class="aligncenter size-medium wp-image-1440" /></a></p>
<p>图中的“传统”和“TLF”分别对应你的字体是用于TextField还是用于FlashPlayer 10支持的<a href="http://www.zengrong.net/post/tag/FTE">FTE</a>引擎。这两者是互斥的，不能选错。</p>
<p>如果在输出属性面板中选择的目标是Flash Player 9，那么在这里是不能选择嵌入方式的。</p>
<p>输出后的swf，使用下面的语法嵌入：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1438code41'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p143841"><td class="code" id="p1438code41"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&#91;</span>Embed<span style="color: #66cc66;">&#40;</span>source=<span style="color: #ff0000;">&quot;myFont.swf&quot;</span>,fontFamily=<span style="color: #ff0000;">&quot;04b_08&quot;</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> myFont:<span style="color: #000000; font-weight: bold;">Class</span>;</pre></td></tr></table></div>

<p>其中的 <code>fontFamily</code>就是双击嵌入的字体打开的的字体预览中显示的全名。例如，微软雅黑的fontFamily的值为 <code>Microsoft YaHei</code>。</p>
<p>这里要注意的是，不要使用这种错误的语法来嵌入字体：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1438code42'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p143842"><td class="code" id="p1438code42"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&#91;</span>Embed<span style="color: #66cc66;">&#40;</span>source=<span style="color: #ff0000;">&quot;myFont.swf&quot;</span>,symbol=<span style="color: #ff0000;">&quot;MyFont&quot;</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> myFont:<span style="color: #000000; font-weight: bold;">Class</span>;</pre></td></tr></table></div>

<p>这种语法一般会得到一个编译错误，因为 <code>MyFont</code>并不是一个Symbol，这种语法只能用于在Flash IDE中导出的MovieClip或者图像、声音等资源。</p>
<h3>在纯AS3项目中嵌入字体</h3>
<p>如果你和我一样讨厌Flash IDE的话，那不如直接在AS3代码中嵌入TTF字体好了，语法如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1438code43'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p143843"><td class="code" id="p1438code43"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&#91;</span>Embed<span style="color: #66cc66;">&#40;</span>source=<span style="color: #ff0000;">&quot;04b_08__.ttf&quot;</span>,fontName=<span style="color: #ff0000;">&quot;04b_08&quot;</span>,embedAsCFF=<span style="color: #ff0000;">&quot;false&quot;</span>,unicodeRange=<span style="color: #ff0000;">&quot;U+0020,U+0041-005A,U+0020,U+0061-007A,U+0030-0039,U+002E,U+0020-002F,U+003A-0040,U+005B-0060,U+007B-007E,U+0020-002F,U+0030-0039,U+003A-0040,U+0041-005A,U+005B-0060,U+0061-007A,U+007B-007E&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> Font04b08:<span style="color: #000000; font-weight: bold;">Class</span>;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> myFont:<span style="color: #000000; font-weight: bold;">Class</span>;</pre></td></tr></table></div>

<p>这一串代码代表的含义是：</p>
<p>使用传统方式（就是上面图2中提到的“传统”）嵌入字体名为<code>04b_08</code>的TTF字体中的英文、数字和标点符号，包含大小写。</p>
<p>来看看这四个常用参数的作用吧：</p>
<ul>
<li>source        指定要嵌入的字体文件路径。还可以用 <code>systemFont</code>指定一个系统中安装的字体。这样的话就可以不需要 <code>source</code>参数了。</li>
<li>fontName      这个实际上就是 <code>fontFamily</code> 的别名。</li>
<li>embedAsCFF    如果不提供这个参数，默认就是true。所以，如果系统你嵌入的字体用于TextField，一定要将其设置为false。</li>
<li>unicodeRange  要嵌入的文本的范围。见下表：</li>
</ul>
<p>嵌入字体范围：</p>
<ul>
<li>大写字符      U+0020,U+0041-U+005A</li>
<li>小写字符      U+0020,U+0061-U+007A</li>
<li>数字            U+0030-U+0039,U+002E</li>
<li>标点符号      U+0020-U+002F,U+003A-U+0040,U+005B-U+0060,U+007B-U+007E</li>
<li>基本拉丁字符    U+0020-U+002F, U+0030-U+0039, U+003A-U+0040, U+0041-U+005A, U+005B-U+0060, U+0061-U+007A, U+007B-U+007E</li>
</ul>
<p>当然，还有中文范围等等，详细的可以找到你本机的 <code>FlexSDK/frameworks/flash-unicode-table.xml</code> 看看就明白了。还可以参考<a href="http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7e04.html">Setting character ranges</a>。</p>
<p>那么，怎样制作一个只有嵌入字体数据的swf文件呢？有两种方法：</p>
<p><strong>第一种</strong>，使用下面的范例代码。下面的代码嵌入了两个字体，使用的范围和上面的例子一样。</p>
<p>有趣的是，如果你<strong>在嵌入字体的这个SWF文件中使用嵌入的字体</strong>（额……我知道有点拗口），你不需要注册这个字体。如果查看注册字体列表，你会发现它已经注册过了。运行下面的代码就知道了。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1438code44'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p143844"><td class="code" id="p1438code44"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
<span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #0066CC;">Font</span>;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> fonts <span style="color: #0066CC;">extends</span> Sprite
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #66cc66;">&#91;</span>Embed<span style="color: #66cc66;">&#40;</span>source=<span style="color: #ff0000;">&quot;04b_08__.ttf&quot;</span>,fontName=<span style="color: #ff0000;">&quot;04b_08&quot;</span>,embedAsCFF=<span style="color: #ff0000;">&quot;false&quot;</span>,unicodeRange=<span style="color: #ff0000;">&quot;U+0020,U+0041-005A,U+0020,U+0061-007A,U+0030-0039,U+002E,U+0020-002F,U+003A-0040,U+005B-0060,U+007B-007E,U+0020-002F,U+0030-0039,U+003A-0040,U+0041-005A,U+005B-0060,U+0061-007A,U+007B-007E&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> Font04b08:<span style="color: #000000; font-weight: bold;">Class</span>;
    <span style="color: #66cc66;">&#91;</span>Embed<span style="color: #66cc66;">&#40;</span>source=<span style="color: #ff0000;">&quot;Frabk.ttf&quot;</span>,fontFamily=<span style="color: #ff0000;">&quot;Franklin Gothic Book&quot;</span>,embedAsCFF=<span style="color: #ff0000;">&quot;false&quot;</span>,unicodeRange=<span style="color: #ff0000;">&quot;U+0020,U+0041-005A,U+0020,U+0061-007A,U+0030-0039,U+002E,U+0020-002F,U+003A-0040,U+005B-0060,U+007B-007E,U+0020-002F,U+0030-0039,U+003A-0040,U+0041-005A,U+005B-0060,U+0061-007A,U+007B-007E&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> FontFrabk:<span style="color: #000000; font-weight: bold;">Class</span>;
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> fonts<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">var</span> __fontArr:<span style="color: #0066CC;">Array</span>= <span style="color: #0066CC;">Font</span>.<span style="color: #006600;">enumerateFonts</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">//Font.registerFont(myFont);</span>
        <span style="color: #b1b100;">for</span> <span style="color: #b1b100;">each</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> __font:<span style="color: #0066CC;">Font</span> <span style="color: #b1b100;">in</span> __fontArr<span style="color: #66cc66;">&#41;</span>
            <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>__font.<span style="color: #006600;">fontName</span>, __font.<span style="color: #006600;">fontType</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p><strong>第二种</strong>，使用Flex SDK提供的fontswf工具，这个工具位于 <code>FlexSDK/bin</code>文件夹下，是JAVA开发的命令行工具。具体用法和参数与Embed类似，看<a href="http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7f5f.html#WS02f7d8d4857b16776fadeef71269f135e73-8000">Using the fontswf utility</a>就清楚了。</p>
<h3>载入外部的字体文件</h3>
<p>当然，你不应该载入ttf文件。应该先使用上面介绍的方法把字体做成swf文件，然后载入。</p>
<p>使用Loader载入外部的swf文件后，需要获取到该swf中嵌入的字体的Class，然后使用 <code>Font.registerFont</code> 注册这个字体，注册成功后就可以使用了。</p>
<p>获取swf中嵌入的字体的Class，也有两种方法：</p>
<p><strong>第一种</strong>，载入成功后，使用Loader.content获取到载入的swf的root，然后直接通过该swf中定义的public变量获取到类定义：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1438code45'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p143845"><td class="code" id="p1438code45"><pre class="actionscript" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">var</span> __font:<span style="color: #66cc66;">*</span> = _loader.<span style="color: #006600;">content</span>;
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'04b08:'</span>, __font.<span style="color: #006600;">Font04b08</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #0066CC;">Font</span>.<span style="color: #006600;">registerFont</span><span style="color: #66cc66;">&#40;</span>__font.<span style="color: #006600;">Font04b08</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0066CC;">Font</span>.<span style="color: #006600;">registerFont</span><span style="color: #66cc66;">&#40;</span>__font.<span style="color: #006600;">FontFrabk</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p><strong>第二种</strong>，载入成功后，使用 <code>ApplicationDomain.getDefinition</code> 获取嵌入的字体类，类的名称是“源文件类名_嵌入目标变量名称”：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1438code46'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p143846"><td class="code" id="p1438code46"><pre class="actionscript" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">var</span> __fontClass:<span style="color: #000000; font-weight: bold;">Class</span> = _loader.<span style="color: #006600;">contentLoaderInfo</span>.<span style="color: #006600;">applicationDomain</span>.<span style="color: #006600;">getDefinition</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;fonts_Font04b08&quot;</span><span style="color: #66cc66;">&#41;</span> as <span style="color: #000000; font-weight: bold;">Class</span>;
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'class:'</span>,__fontClass<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0066CC;">Font</span>.<span style="color: #006600;">registerFont</span><span style="color: #66cc66;">&#40;</span>__fontClass<span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>在使用外部字体swf文件的时候，如果自身又被另一个swf载入，情况就变得非常复杂，需要设置应用程序域和系统安全域。简单的说，就是要遵循以下两条原则：</p>
<ul>
<li>如果自己被父SWF载入，那么应用程序域就必须设置成当前域或者是子域才行</li>
</ul>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1438code47'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p143847"><td class="code" id="p1438code47"><pre class="actionscript" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">var</span> __loaderContext:LoaderContext = <span style="color: #000000; font-weight: bold;">new</span> LoaderContext<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">true</span>, ApplicationDomain.<span style="color: #006600;">currentDomain</span><span style="color: #66cc66;">&#41;</span>;
    _loader.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'fonts_local.swf'</span><span style="color: #66cc66;">&#41;</span>,  __loaderContext<span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<ul>
<li>如果载入的字体swf与发起载入的swf不在一个网域，就需要将安全域设定为当前安全域</li>
</ul>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1438code48'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p143848"><td class="code" id="p1438code48"><pre class="actionscript" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">var</span> __loaderContext:LoaderContext = <span style="color: #000000; font-weight: bold;">new</span> LoaderContext<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">true</span>, ApplicationDomain.<span style="color: #006600;">currentDomain</span>, SecurityDomain.<span style="color: #006600;">currentDomain</span><span style="color: #66cc66;">&#41;</span>;
    _loader.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'fonts_local.swf'</span><span style="color: #66cc66;">&#41;</span>,  __loaderContext<span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>但是，如果子域和父域有同名包、同名类、同名方法，那么就要注意了，使用当前应用程序域或者子域会让你程序的结构变得一团糟，甚至可能会产生命名空间冲突。而这种冲突给出的运行时错误提示基本让你没法查出错误在哪里。</p>
<p>要理解这块的纠结之处，最好的办法是下载我的范例程序自已调试把！</p>
Note: There is a file embedded within this post, please visit this post to download the file.<br />
Note: There is a file embedded within this post, please visit this post to download the file.
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1438.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FlashPlayer/AIR在new Vector(-1)的时候崩溃</title>
		<link>http://zengrong.net/post/1396.htm</link>
		<comments>http://zengrong.net/post/1396.htm#comments</comments>
		<pubDate>Thu, 04 Aug 2011 09:50:38 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[BUG]]></category>
		<category><![CDATA[FlashPlayer]]></category>
		<category><![CDATA[Vector]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1396</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1396.htm" title="FlashPlayer/AIR在new Vector(-1)的时候崩溃"><img width="431" height="139" src="http://zengrong.net/wp-content/uploads/2011/08/flashplayer_crash_vector.png" class="attachment-extra-featured-image wp-post-image" alt="ADL错误" title="flashplayer_crash_vector" /></a>source on github 试试这段代码： ?View Code ACTIONSCRIPTvar __length:int = -1; var __v:Vector.&#60;String&#62; = new Vector.&#60;String&#62;&#40;__length&#41;; 如果你用Flash builder编译，不会显示任何错误。编译后的swf无法双击打开，或打开后立即退出。 如果你用编译的是AIR程序，程序运行后会立即崩溃，同时弹出下面的提示信息: 如果你用Flash IDE来编译，则会看到错误提示： Error: Error #1000: 系统内存不足。 at Vector$object/set length() at Vector$object() at aaa_fla::MainTimeline/frame1() 这本来不是什么大问题，毕竟极少极少有人会使用 -1 这个值来作为Vector的length属性。 可是，起码给点提示好不好？起码让我不要找错方向！ 测试平台： FlashPlayer 10.3 Flash Builder &#8230;<p class="read-more"><a href="http://zengrong.net/post/1396.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1396.htm" title="FlashPlayer/AIR在new Vector(-1)的时候崩溃"><img width="431" height="139" src="http://zengrong.net/wp-content/uploads/2011/08/flashplayer_crash_vector.png" class="attachment-extra-featured-image wp-post-image" alt="ADL错误" title="flashplayer_crash_vector" /></a><p><a href="https://github.com/zrong/blog/blob/master/flashplayer_crash_on_vector_create.md">source on github</a></p>
<p>试试这段代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1396code50'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p139650"><td class="code" id="p1396code50"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> __length:<span style="color: #0066CC;">int</span> = -<span style="color: #cc66cc;">1</span>;
<span style="color: #000000; font-weight: bold;">var</span> __v:Vector.<span style="color: #66cc66;">&lt;</span>String<span style="color: #66cc66;">&gt;</span> = <span style="color: #000000; font-weight: bold;">new</span> Vector.<span style="color: #66cc66;">&lt;</span>String<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span>__length<span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>如果你用Flash builder编译，不会显示任何错误。编译后的swf无法双击打开，或打开后立即退出。</p>
<p>如果你用编译的是AIR程序，程序运行后会立即崩溃，同时弹出下面的提示信息:<span id="more-1396"></span></p>
<p><img src="/wp-content/uploads/2011/08/flashplayer_crash_vector.png" alt="ADL错误" /></p>
<p>如果你用Flash IDE来编译，则会看到错误提示：</p>
<blockquote>
<p>Error: Error #1000: 系统内存不足。<br />
    at Vector$object/set length()<br />
    at Vector$object()<br />
    at aaa_fla::MainTimeline/frame1()</p>
</blockquote>
<p>这本来不是什么大问题，毕竟极少极少有人会使用 <code>-1</code> 这个值来作为Vector的length属性。</p>
<p>可是，起码给点提示好不好？起码让我不要找错方向！</p>
<p><strong>测试平台：</strong></p>
<ul>
<li>FlashPlayer 10.3</li>
<li>Flash Builder 4.5.1</li>
<li>Flex SDK 4.5.1</li>
<li>AIR 1.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1396.htm/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>一个未完成的简单AS3 eval实现</title>
		<link>http://zengrong.net/post/1395.htm</link>
		<comments>http://zengrong.net/post/1395.htm#comments</comments>
		<pubDate>Mon, 01 Aug 2011 03:48:09 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[eval]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1395</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1395.htm" title="一个未完成的简单AS3 eval实现"></a>本文源码(on github)：https://github.com/zrong/blog/blob/master/unfinished_as3_eval.md AS3没有eval确实不方便，目前我所知有两种方法： 使用ActionScript 3 Eval Library来实现。但这个库比较大，debug编译越140KB。如果项目非常注重文件大小，则需要考虑； 如果swf部署在浏览器环境中，可以将eval交给Javascript来处理，然后获取Javascript的返回值即可。 我在工作中需要使用eval的地方，往往比较简单，且比较规律。这种情况下，完全可以自己写一些简单的逻辑来实现。 这个例子中的需求就很简单，是实现一个较为灵活的站位算法。我在外部配置文件中定位了12个站位坐标（包含xy值），人物进入界面后，基于这些站位点来站位。但由于舞台的大小是变化的，如果定义一个确定的值，无法根据舞台的大小进行变化。 如果让外部的配置文件中支持类似于 h/2 或者 w-100 这种语法，就非常灵活了。 这个实现仅支持一次运算，而且不支持单个的 w 这种类型的值，要获取 w，必须用 w+0 这种语法。但对当前的需求来说，足够了。 下面就是代码： ?View Code ACTIONSCRIPT/** * 站位容器宽高 */ private var box_w:int = 600; private var box_h:int = 400; &#160; /** &#8230;<p class="read-more"><a href="http://zengrong.net/post/1395.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1395.htm" title="一个未完成的简单AS3 eval实现"></a><p>本文源码(on github)：<a href="https://github.com/zrong/blog/blob/master/unfinished_as3_eval.md">https://github.com/zrong/blog/blob/master/unfinished_as3_eval.md</a></p>
<p>AS3没有eval确实不方便，目前我所知有两种方法：</p>
<ol>
<li>使用<a href="http://eval.hurlant.com/">ActionScript 3 Eval Library</a>来实现。但这个库比较大，debug编译越140KB。如果项目非常注重文件大小，则需要考虑；</li>
<li>如果swf部署在浏览器环境中，可以将eval交给Javascript来处理，然后获取Javascript的返回值即可。</li>
</ol>
<p>我在工作中需要使用eval的地方，往往比较简单，且比较规律。这种情况下，完全可以自己写一些简单的逻辑来实现。</p>
<p>这个例子中的需求就很简单，是实现一个较为灵活的站位算法。我在外部配置文件中定位了12个站位坐标（包含xy值），人物进入界面后，基于这些站位点来站位。但由于舞台的大小是变化的，如果定义一个确定的值，无法根据舞台的大小进行变化。</p>
<p>如果让外部的配置文件中支持类似于 <code>h/2</code> 或者 <code>w-100</code> 这种语法，就非常灵活了。</p>
<p>这个实现仅支持一次运算，而且不支持单个的 <code>w</code> 这种类型的值，要获取 <code>w</code>，必须用 <code>w+0</code> 这种语法。但对当前的需求来说，足够了。</p>
<p>下面就是代码：<span id="more-1395"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1395code52'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p139552"><td class="code" id="p1395code52"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/**
 * 站位容器宽高
 */</span>
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> box_w:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">600</span>;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> box_h:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">400</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">/**
 * 对传来的值进行运算，支持加减乘除的一次运算，变量支持w和h
 */</span>
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> calculate<span style="color: #66cc66;">&#40;</span>$coord:<span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">int</span>
<span style="color: #66cc66;">&#123;</span>
     <span style="color: #808080; font-style: italic;">/*支持的运算符和变量
     例如：w-8 h/2 等等。格式必须是 1(w或h) 2(运算符) 3(数字)*/</span>
    const reg:RegExp = <span style="color: #66cc66;">/</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>w<span style="color: #66cc66;">|</span>h<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>+<span style="color: #66cc66;">|</span>\-<span style="color: #66cc66;">|*|</span>\<span style="color: #66cc66;">/</span><span style="color: #66cc66;">&#93;</span>+<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>\d+<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>;
    <span style="color: #000000; font-weight: bold;">var</span> __num:<span style="color: #0066CC;">Number</span> = <span style="color: #0066CC;">parseInt</span><span style="color: #66cc66;">&#40;</span>$coord<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #808080; font-style: italic;">//如果可以解析，就返回解析后的值</span>
    <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span><span style="color: #0066CC;">isNaN</span><span style="color: #66cc66;">&#40;</span>__num<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span> __num;
    <span style="color: #808080; font-style: italic;">//如果该值不是字符串，就返回0</span>
    <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span><span style="color: #66cc66;">&#40;</span>$coord is <span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
    <span style="color: #000000; font-weight: bold;">var</span> __coord:<span style="color: #0066CC;">String</span> = <span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#40;</span>$coord<span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">toLowerCase</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #808080; font-style: italic;">//不符合规则，返回0</span>
    <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span>reg.<span style="color: #006600;">test</span><span style="color: #66cc66;">&#40;</span>__coord<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
    <span style="color: #808080; font-style: italic;">//如果没有设置容器宽高，返回0</span>
    <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>box_w == <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">||</span> box_h == <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
    <span style="color: #000000; font-weight: bold;">var</span> __arr:<span style="color: #0066CC;">Array</span> = __coord.<span style="color: #006600;">match</span><span style="color: #66cc66;">&#40;</span>reg<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #808080; font-style: italic;">//trace('arr:', __arr);</span>
    <span style="color: #000000; font-weight: bold;">var</span> __box:<span style="color: #0066CC;">int</span> = __arr<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #ff0000;">'w'</span> ? box_w : box_h;
    __num = <span style="color: #0066CC;">int</span><span style="color: #66cc66;">&#40;</span>__arr<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #808080; font-style: italic;">//加减乘除运算</span>
    <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>__arr<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #ff0000;">'+'</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #b1b100;">return</span> __box + __num;
    <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>__arr<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #ff0000;">'-'</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #b1b100;">return</span> __box - __num;
    <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>__arr<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #ff0000;">'*'</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #b1b100;">return</span> __box <span style="color: #66cc66;">*</span> __num;
    <span style="color: #b1b100;">return</span> <span style="color: #0066CC;">int</span><span style="color: #66cc66;">&#40;</span>__box<span style="color: #66cc66;">/</span>__num<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1395.htm/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AS3中正则表达式对反斜杠的替换</title>
		<link>http://zengrong.net/post/1374.htm</link>
		<comments>http://zengrong.net/post/1374.htm#comments</comments>
		<pubDate>Thu, 14 Jul 2011 01:24:29 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[RegExp]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1374</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1374.htm" title="AS3中正则表达式对反斜杠的替换"></a>本文源码 一个有趣的小问题，下面的正则表达式能替换成功么？ ?View Code ACTIONSCRIPTvar __str:String = '1234\6789'; trace&#40;__str.replace&#40;/\\/g, '5'&#41;&#41;; 答案是：不能。trace出来的结果为： [trace] 12346789 其实正则本身并没有写错，错在被替换的字符串。反斜杠“&#92;”在AS3中是转义符，会将其后的任何值转换为本身，因此看到的字符串其实本身就是12346789，也就是没有反斜杠，当然无法搜索到。 直接trace(__str)，结果和上面的trace相同。 希望得到正确的结果，需要将字符串设置为：1234\\6789，我们看到的是两个反斜杠，而AS3认为它是一个反斜杠。 如果使用RegExp来建立正则，则需要使用4个反斜杠： ?View Code ACTIONSCRIPTvar __str:String = '1234\\6789'; var __reg:RegExp = new RegExp&#40;'\\\\', ''&#41;; trace&#40;__str.replace&#40;__reg, '5'&#41;&#41;; 这种情况只在硬编码字符串的时候出现，而如果字符串出现在TextField中，从TextField.text中取出的字符串，本身就自动进行了转义，看到的一个反斜杠，其实是两个反斜杠。 附送一篇关于MXML中的正则表达式的文章： MXML中正则表达式的expression需要转义]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1374.htm" title="AS3中正则表达式对反斜杠的替换"></a><p><a href="https://github.com/zrong/blog/blob/master/backslash_in_regexp.md">本文源码</a></p>
<p>一个有趣的小问题，下面的正则表达式能替换成功么？</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1374code55'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p137455"><td class="code" id="p1374code55"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> __str:<span style="color: #0066CC;">String</span> = <span style="color: #ff0000;">'1234<span style="color: #000099; font-weight: bold;">\6</span>789'</span>;
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>__str.<span style="color: #006600;">replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">/</span>\\<span style="color: #66cc66;">/</span>g, <span style="color: #ff0000;">'5'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>答案是：<strong>不能</strong>。trace出来的结果为：</p>
<blockquote><p>
  [trace] 12346789
</p></blockquote>
<p>其实正则本身并没有写错，错在被替换的字符串。反斜杠“&#92;”在AS3中是转义符，会将其后的任何值转换为本身，因此看到的字符串其实本身就是<code>12346789</code>，也就是没有反斜杠，当然无法搜索到。</p>
<p>直接<code>trace(__str)</code>，结果和上面的trace相同。</p>
<p>希望得到正确的结果，需要将字符串设置为：<code>1234\\6789</code>，我们看到的是<strong>两个</strong>反斜杠，而AS3认为它是<strong>一个</strong>反斜杠。<span id="more-1374"></span></p>
<p>如果使用RegExp来建立正则，则需要使用4个反斜杠：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1374code56'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p137456"><td class="code" id="p1374code56"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> __str:<span style="color: #0066CC;">String</span> = <span style="color: #ff0000;">'1234<span style="color: #000099; font-weight: bold;">\\</span>6789'</span>;
<span style="color: #000000; font-weight: bold;">var</span> __reg:RegExp = <span style="color: #000000; font-weight: bold;">new</span> RegExp<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\\</span><span style="color: #000099; font-weight: bold;">\\</span>'</span>, <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>__str.<span style="color: #006600;">replace</span><span style="color: #66cc66;">&#40;</span>__reg, <span style="color: #ff0000;">'5'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>这种情况只在硬编码字符串的时候出现，而如果字符串出现在TextField中，从TextField.text中取出的字符串，本身就自动进行了转义，看到的<strong>一个</strong>反斜杠，其实是<strong>两个</strong>反斜杠。</p>
<p>附送一篇关于MXML中的正则表达式的文章：<br />
<a href="http://www.smithfox.com/?e=131">MXML中正则表达式的expression需要转义</a></p>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1374.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[转]Flash Player 执行模型之可变跑道</title>
		<link>http://zengrong.net/post/1365.htm</link>
		<comments>http://zengrong.net/post/1365.htm#comments</comments>
		<pubDate>Fri, 08 Jul 2011 03:29:48 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[FlashPlayer]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1365</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1365.htm" title="[转]Flash Player 执行模型之可变跑道   "><img width="600" height="200" src="http://zengrong.net/wp-content/uploads/2011/07/eastic_racktrack.png" class="attachment-extra-featured-image wp-post-image" alt="传统的FlashPlayer可变跑道模型" title="传统的FlashPlayer可变跑道模型" /></a>本文源码 原文地址：http://blogs.adobe.com/xwlin/2010/04/flash_player_101_-_adobe_max_2009_1.html 转载地址：http://blog.csdn.net/zlxluofeng/article/details/5516349 演讲人: Lee Thomason (lthomaso@adobe.com) 翻译: 林晓伟 (xwlin@adobe.com) 上一篇我们介绍了Flash Player的代码库是如何归并一体以及对Flash平台的后期开发产生的影响，在第二节里，我们将重点讨论Flash Player的体系结构及其对开发人员的影响。 理解执行模型 执行模型是指Flash Player在每一个帧周期中如何执行相应的指令操作。Flash Player后台事实上运行着n多线程，只是AS并没有给开发人员提供多线程编程模型。这意味着从概念上来讲我们要把Flash Player看做是单线程运行实体，有关这一单线程编程模型的优势/劣势的争论从未休止过，我不想对这一具有争议性的问题做过多评论，但请大家记住这一事实。 可变跑道(Elastic Racetrack) 可变跑道是Flash Player的帧执行模型，这个模型描述了在一帧的处理周期中，代码执行和帧渲染的工作是怎样彼此平衡的。Flash Player 9和AVM2对这一模型进行了一些改进，这一信息是基于对事件机制和渲染模型的研究总结出来的，完整的模型尚未被官方公布。 基本的跑道理论没有发生改变，在Flash Player执行一帧的周期里，前一部分时间用于执行代码，剩余时间用于渲染显示列表中的对象。每个执行阶段都可以根据实际需求增加执行时间来执行更多代码或做更多的渲染工作，而跑道的总长度也将相应增长。 在前一模型基础上发生改变的是每一阶段在一个微观周期里的样子以及他们怎样形成一帧。 AVM2是由Flash Player中一个叫做Marshal的元帅级组件所操控，Marshal负责将时间切割成Flash Player工作所依的基本时间片，在这里我希望澄清一下Flash Player的时间片跟swf文件运行时的帧速率没有任何关系，我们将最终看到Flash Player是如何将这些时间片合成为一帧。在Mac OS版Firefox中执行一个由Flex编译得来的swf文件，Marshal通常会将时间切割成19-20毫秒的时间片,时间片大小根据平台和浏览器的不同而存在差异.为方便我们接下来的讨论,我们假定时间片大小为20毫秒,也就是说Marshal每秒钟会产生不超过50个时间片，每个时间片中，五步可能的操作按如下顺序执行： Player事件调度 &#8211; 比如Timer事件，鼠标事件，ENTER_FRAME事件，URLLoader事件等等。 用户代码执行 &#8211; 所有侦听上一步相应事件的代码被执行。 RENDER事件调度 &#8230;<p class="read-more"><a href="http://zengrong.net/post/1365.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1365.htm" title="[转]Flash Player 执行模型之可变跑道   "><img width="600" height="200" src="http://zengrong.net/wp-content/uploads/2011/07/eastic_racktrack.png" class="attachment-extra-featured-image wp-post-image" alt="传统的FlashPlayer可变跑道模型" title="传统的FlashPlayer可变跑道模型" /></a><p><a href="https://github.com/zrong/blog/blob/master/use_scancode_map_to_disable_the_caps_lock_key.md">本文源码</a></p>
<p>原文地址：<a href="http://blogs.adobe.com/xwlin/2010/04/flash_player_101_-_adobe_max_2009_1.html">http://blogs.adobe.com/xwlin/2010/04/flash_player_101_-_adobe_max_2009_1.html</a><br />
转载地址：<a href="http://blog.csdn.net/zlxluofeng/article/details/5516349">http://blog.csdn.net/zlxluofeng/article/details/5516349</a><br />
演讲人: Lee Thomason (lthomaso@adobe.com)<br />
翻译: 林晓伟 (xwlin@adobe.com)</p>
<p>上一篇我们介绍了Flash Player的代码库是如何归并一体以及对Flash平台的后期开发产生的影响，在第二节里，我们将重点讨论Flash Player的体系结构及其对开发人员的影响。</p>
<h2>理解执行模型</h2>
<p>执行模型是指Flash Player在每一个帧周期中如何执行相应的指令操作。Flash Player后台事实上运行着n多线程，只是AS并没有给开发人员提供多线程编程模型。这意味着从概念上来讲我们要把Flash Player看做是单线程运行实体，有关这一单线程编程模型的优势/劣势的争论从未休止过，我不想对这一具有争议性的问题做过多评论，但请大家记住这一事实。</p>
<h2>可变跑道(Elastic Racetrack)</h2>
<p>可变跑道是Flash Player的帧执行模型，这个模型描述了在一帧的处理周期中，代码执行和帧渲染的工作是怎样彼此平衡的。Flash Player 9和AVM2对这一模型进行了一些改进，这一信息是基于对事件机制和渲染模型的研究总结出来的，完整的模型尚未被官方公布。</p>
<p>基本的跑道理论没有发生改变，在Flash Player执行一帧的周期里，前一部分时间用于执行代码，剩余时间用于渲染显示列表中的对象。每个执行阶段都可以根据实际需求增加执行时间来执行更多代码或做更多的渲染工作，而跑道的总长度也将相应增长。<span id="more-1365"></span></p>
<p><a href="http://zengrong.net/wp-content/uploads/2011/07/eastic_racktrack.png"><img src="/wp-content/uploads/2011/07/eastic_racktrack.png" alt="传统的FlashPlayer可变跑道模型" /></a></p>
<p>在前一模型基础上发生改变的是每一阶段在一个微观周期里的样子以及他们怎样形成一帧。</p>
<p>AVM2是由Flash Player中一个叫做Marshal的元帅级组件所操控，Marshal负责将时间切割成Flash Player工作所依的基本时间片，在这里我希望澄清一下Flash Player的时间片跟swf文件运行时的帧速率没有任何关系，我们将最终看到Flash Player是如何将这些时间片合成为一帧。在Mac OS版Firefox中执行一个由Flex编译得来的swf文件，Marshal通常会将时间切割成19-20毫秒的时间片,时间片大小根据平台和浏览器的不同而存在差异.为方便我们接下来的讨论,我们假定时间片大小为20毫秒,也就是说Marshal每秒钟会产生不超过50个时间片，每个时间片中，五步可能的操作按如下顺序执行：</p>
<ol>
<li>Player事件调度 &#8211; 比如Timer事件，鼠标事件，ENTER_FRAME事件，URLLoader事件等等。</li>
<li>用户代码执行 &#8211; 所有侦听上一步相应事件的代码被执行。</li>
<li>RENDER事件调度 &#8211; 在用户代码执行期间调用stage.invalidate()会触发这一特殊事件。</li>
<li>最后的用户代码执行 &#8211; 侦听上述第三步特殊事件的用户代码此时被执行。</li>
<li>Player更改显示列表。</li>
</ol>
<p><a href="http://zengrong.net/wp-content/uploads/2011/07/avm2_marshalled_slice.png"><img src="/wp-content/uploads/2011/07/avm2_marshalled_slice.png" alt="AVM2元帅切片" /></a></p>
<p>Marshal如此反复的执行20毫秒时间片并在运行中决定下一步操作。一个时间片中执行的所有这些操作最终归纳为上述两段式跑道(代码执行，图像渲染)也就是我们所说的一帧。用户代码和失效操作填充在代码执行区，渲染操作填充在跑道的渲染区段。需要指出的是相关操作只能在Marshal预定的时间内发生，如果你的用户代码很短，那么Marshal仍然会在执行完用户代码后等待一段时间然后进入渲染阶段。</p>
<p>为了更好阐述哪些action被如何执行以及可变跑道如何被创建，请参考如下示例，分别描述了以5fps, 25fps和50fps帧速率工作的swf中时间片是如何被处理的。</p>
<p><a href="http://zengrong.net/wp-content/uploads/2011/07/flash_frames_synthetize.jpg"><img src="/wp-content/uploads/2011/07/flash_frames_synthetize-300x87.jpg" alt="Flash帧合成" /></a></p>
<p>以上示例可以看出，不同的帧速率下，一个帧周期中的可变跑道会执行不同操作，例如对于5fps的swf，每帧处理10个用户action，1个失效action，1个渲染action；帧速率25fps的swf，每帧处理2个用户action，1个失效action，1个渲染action；对于50fps的swf，每帧只能处理1个用户action，1个失效action，1个渲染action。需要指出的很重要的一点是，某些事件只可能能发生在某些特定的时间片里，比如，Event.ENTER_FRAME事件只能在某一帧的初始时间片中被调度。</p>
<ol>
<li>一个时间片中代码部分和渲染部分都有可能过长而导致相应时间片大于20毫秒，这就是&#8221;可变&#8221;的含义，为了保证帧的播放速率仍然接近swf编译时设定的帧率，Marshal会选择丢掉一些时间片。</li>
<li>swf文件的播放速率不可能超过当前Flash Player切割时间片的速率，你可以为swf文件设定120fps的播放速率，但Flash最多可以按照50帧的速度播放(具体数值取决于当前系统的设置)。</li>
<li>代码的执行频率可能比swf的帧率更高，播放一个1fps的swf文件，播放一帧时间为1秒，也就是50个时间片，但在每个时间片里，都会有触发鼠标或计时器事件，尽管只有最后一个时间片才会渲染，另外你可以选择通过调用函数updateAfterEvent() 提前渲染，但只能在鼠标，计时器和键盘事件处理函数中调用。在这种情况下，Marshal会认为当前帧已结束并从下一个时间片起进入下一帧。 最后，如果一个Sprite的外观属性比如width,height等发生变化而将鼠标从该Sprite上方掠过，Flash会进行强制渲染。</li>
<li>如果帧率不是每秒时间片数量的整数因子，那么该平台的渲染时间间隔将变得不固定，比如帧率20fps的swf运行在50个时间片每秒的系统上，Flash Player的行为将是每5个时间片播放两帧，那swf的渲染频率将是2-3-2-3-2-3(时间片)。</li>
</ol>
<p>【原博主】<br />
<strong>在9RIA上，有关于该文章的进一步讨论，主要是updateAfterEvent()到底能不能结束当前帧而进入下一帧，下面是讨论内容：</strong></p>
<hr />
<p>【jinni】<br />
我一直对这篇文章的结论有质疑，根据我测试的结果，当调用updateAfterEvent()时，FP并不认为是一帧的结束，而只是单纯的重绘屏幕<br />
例如你可以在一帧中点击20次鼠标＋updateAfterEvent()，并造成20次重绘事件(RENDER)，但对于Flash Player的帧事件(ENTER_FRAME)，只会触发一次。<br />
换句话说，帧的运行次数和重绘屏幕的次数是没有任何关系的</p>
<p>【jinni】<br />
其实有一个很简单的论证<br />
很多Flash的逻辑依赖于ENTER_FRAME执行<br />
如果调用updateAfterEvent()就会立即结束当前帧从并触发下一帧的话<br />
那么这些Flash的运行逻辑就会加快了，这显然不合理<br />
而事实上（根据我的测试），调用updateAfterEvent()只会触发RENDER事件和系统重绘<br />
另外，Flex中的Mouse事件，默认会调用updateAfterEvent()来保证运行效果</p>
<p>【Aone】<br />
我测试下来不会打断。不过确实有种可以打断帧的方法，就是给 stage.frameRate赋值，即便是stage.frameRate = stage.frameRate也会打断帧强制该帧结束。<br />
测试代码如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1365code58'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p136558"><td class="code" id="p1365code58"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">stage</span>.<span style="color: #006600;">frameRate</span> = <span style="color: #cc66cc;">1</span>;  
<span style="color: #000000; font-weight: bold;">var</span> timer:Timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;  
timer.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>,onTimer<span style="color: #66cc66;">&#41;</span>;  
timer.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;  
addEventListener<span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">ENTER_FRAME</span>,test<span style="color: #66cc66;">&#41;</span>;  
<span style="color: #000000; font-weight: bold;">var</span> old:<span style="color: #0066CC;">int</span> = <span style="color: #0066CC;">getTimer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;  
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> test<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>:Event<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>  
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">getTimer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>-old<span style="color: #66cc66;">&#41;</span>;  
        old = <span style="color: #0066CC;">getTimer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;  
<span style="color: #66cc66;">&#125;</span>  
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> onTimer<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">e</span>:TimerEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>          
                <span style="color: #808080; font-style: italic;">//stage.frameRate = 1;  </span>
        <span style="color: #0066CC;">e</span>.<span style="color: #0066CC;">updateAfterEvent</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;  
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;timer&quot;</span><span style="color: #66cc66;">&#41;</span>;  
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>【jinni】<br />
我所做的测试都是Mac和Win同时做的<br />
事实证明updateAfterEvent()是不会造成帧的结束<br />
而且，在实际情况中，updateAfterEvent()并不只是用户手动调用才会触发<br />
Flash Player会根据需要来对自身进行强制重绘，一帧中可能触发数十次RENDER事件和重绘<br />
而原文所描述的模型基于一个假设：“一帧之中用户事件代码会执行多次，但渲染事件代码和渲染过程只会执行一次。”就是不成立的。</p>
<p>【Aone】<br />
updateAfterEvent()必须Timer触发或者鼠标事件还有键盘事件触发后才能正确重绘。<br />
不过呢&#8230; 鼠标和键盘就算不注册侦听在某些情况下也会自动updateAfterEvent()来强制渲染。</p>
<p>【jinni】<br />
我和Ted讨论了一下,这是他的回复：</p>
<blockquote>
<p>Yes you can call updateAfterEvent over and over between standard renders. You basically inject a partial render in the code execution side of the racetrack and elongate it.<br />
  I would love to see AS have full render control as a playermode in FP11. If set there are no automatic renders and the developer must call render for all visual changes to occur.<br />
  是的，你可以在每次标准RENDER（即原文中的Last slice&#8217;s render）之间调用多次updateAfterEvent（并进行重绘），相当于你在跑道一圈中代码执行的阶段&#8221;注入&#8221;了部分渲染过程并延长了整个跑道。</p>
</blockquote>
<p>其实我很希望看到Flash Player 11可以在某种模式下给开发者完整的渲染控制。在这种情况下开发者必须主动调用API来实现屏幕重绘。</p>
<p>我想问题其实已经比较清楚了，文中跑道模型描述的只是其中一种形态，很多时候，渲染和用户代码的调用在一帧的过程中，是穿插进行的，而不是简单的先执行用户代码，最后渲染</p>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1365.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FocusEvent与buttonMode的关系</title>
		<link>http://zengrong.net/post/1351.htm</link>
		<comments>http://zengrong.net/post/1351.htm#comments</comments>
		<pubDate>Mon, 27 Jun 2011 14:24:34 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1351</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1351.htm" title="FocusEvent与buttonMode的关系"></a>本文源码 这两个家伙有关系么？ 当然有，而且还挺紧密的。 它们之间的关系就是： 如果一个Sprite不开启buttonMode，那么就不会有FocusEvent事件发出 这关系说起来挺简单的，但是你若是不知道，而且还急着用，说不定会让你发疯……（我就疯了一次） 当然，TextField虽然没有buttonMode，也会有FocusEvent。 那么SimpleButton会如何？我没试，懒得试了…… 把下面的代码中的 _sprite.buttonMode = true; 一行注释掉，可以看到（或者说看不到？）效果。 ?View Code ACTIONSCRIPTpackage &#123; import flash.display.Sprite; import flash.events.Event; import flash.events.FocusEvent; import flash.events.MouseEvent; import flash.text.TextField; &#160; public class Focus extends Sprite &#123; public function Focus&#40;&#41; &#123; getSprite&#40;&#41;; getSprite&#40;200, &#8230;<p class="read-more"><a href="http://zengrong.net/post/1351.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1351.htm" title="FocusEvent与buttonMode的关系"></a><p><a href="https://github.com/zrong/blog/blob/master/focusevent_and_buttonmode.md" target="_blank">本文源码</a></p>
<p>这两个家伙有关系么？</p>
<p>当然有，而且还挺紧密的。</p>
<p>它们之间的关系就是：</p>
<p><strong>如果一个Sprite不开启buttonMode，那么就不会有FocusEvent事件发出</strong></p>
<p>这关系说起来挺简单的，但是你若是不知道，而且还急着用，说不定会让你发疯……（我就疯了一次）</p>
<p>当然，TextField虽然没有buttonMode，也会有FocusEvent。</p>
<p>那么SimpleButton会如何？我没试，懒得试了……</p>
<p>把下面的代码中的 <code>_sprite.buttonMode = true;</code> 一行注释掉，可以看到（或者说看不到？）效果。</p>
<p><span id="more-1351"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1351code60'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p135160"><td class="code" id="p1351code60"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">Event</span>;
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">FocusEvent</span>;
<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">MouseEvent</span>;
<span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #0066CC;">TextField</span>;
&nbsp;
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Focus <span style="color: #0066CC;">extends</span> Sprite
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Focus<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#123;</span>
		getSprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		getSprite<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">200</span>, <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #000000; font-weight: bold;">var</span> _tf:<span style="color: #0066CC;">TextField</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">TextField</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		_tf.<span style="color: #0066CC;">type</span> = <span style="color: #ff0000;">'input'</span>;
		_tf.<span style="color: #0066CC;">border</span> = <span style="color: #000000; font-weight: bold;">true</span>;
		_tf.<span style="color: #006600;">x</span> = <span style="color: #cc66cc;">200</span>;
		_tf.<span style="color: #006600;">y</span> = <span style="color: #cc66cc;">200</span>;
		_tf.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>FocusEvent.<span style="color: #006600;">FOCUS_IN</span>, handler_focusin<span style="color: #66cc66;">&#41;</span>;
		_tf.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>FocusEvent.<span style="color: #006600;">FOCUS_OUT</span>, handler_focusout<span style="color: #66cc66;">&#41;</span>;
		addChild<span style="color: #66cc66;">&#40;</span>_tf<span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _sprite:Sprite;
&nbsp;
	<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> getSprite<span style="color: #66cc66;">&#40;</span>$x:<span style="color: #0066CC;">int</span>=<span style="color: #cc66cc;">0</span>, $y:<span style="color: #0066CC;">int</span>=<span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>:Sprite
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">var</span> _sprite:Sprite = <span style="color: #000000; font-weight: bold;">new</span> Sprite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		_sprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">beginFill</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
		_sprite.<span style="color: #006600;">graphics</span>.<span style="color: #006600;">drawRect</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>;
		_sprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">endFill</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		_sprite.<span style="color: #006600;">x</span> = $x;
		_sprite.<span style="color: #006600;">y</span> = $y;
		_sprite.<span style="color: #0066CC;">useHandCursor</span> = <span style="color: #000000; font-weight: bold;">true</span>;
		_sprite.<span style="color: #006600;">buttonMode</span> = <span style="color: #000000; font-weight: bold;">true</span>;
		<span style="color: #0066CC;">this</span>.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>_sprite<span style="color: #66cc66;">&#41;</span>;
		_sprite.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>FocusEvent.<span style="color: #006600;">FOCUS_OUT</span>, handler_focusout<span style="color: #66cc66;">&#41;</span>;
		_sprite.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>FocusEvent.<span style="color: #006600;">FOCUS_IN</span>, handler_focusin<span style="color: #66cc66;">&#41;</span>;
		_sprite.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>MouseEvent.<span style="color: #006600;">CLICK</span>, handler_click<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">return</span> _sprite;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handler_focusout<span style="color: #66cc66;">&#40;</span>evt:FocusEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'focusout,target:'</span>, evt.<span style="color: #0066CC;">target</span>, <span style="color: #ff0000;">',relatedTarget:'</span>, evt.<span style="color: #006600;">relatedObject</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handler_focusin<span style="color: #66cc66;">&#40;</span>evt:FocusEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'focusin,target:'</span>, evt.<span style="color: #0066CC;">target</span>, <span style="color: #ff0000;">',relatedTarget:'</span>, evt.<span style="color: #006600;">relatedObject</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> handler_click<span style="color: #66cc66;">&#40;</span>evt:MouseEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'click'</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1351.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

