<?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; ActionScript</title>
	<atom:link href="http://zengrong.net/post/tag/actionscript/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>[转]ColorMatrixFilter色彩矩阵滤镜</title>
		<link>http://zengrong.net/post/1443.htm</link>
		<comments>http://zengrong.net/post/1443.htm#comments</comments>
		<pubDate>Fri, 09 Sep 2011 06:20:12 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Color]]></category>
		<category><![CDATA[Filter]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1443</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1443.htm" title="[转]ColorMatrixFilter色彩矩阵滤镜"></a>转自蜗牛的博客 matrix是一个长度为4*5＝20的数组，其构成如下所示： R ,G, B, A, offset [1, 0, 0, 0, 0]); // red [0, 1, 0, 0, 0]); // green [0, 0, 1, 0, 0]); // blue [0, 0, 0, 1, 0]); // alpha 上面是matrix的初始状态。 下面我分先来分析一下其初始状态。 red通道的值：（1，0，0，0，0）表示，R通道的乘数是1（完全保留），别的道道的的乘数是0，（不加入别的通道的颜色），色彩偏移量off是0； 别的通道依次类推。 下面来做一些效果，增加对colorMatrixFilter的认识： &#8230;<p class="read-more"><a href="http://zengrong.net/post/1443.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1443.htm" title="[转]ColorMatrixFilter色彩矩阵滤镜"></a><p>转自<a href="http://blog.163.com/mdzhg@126/blog/static/1633215682010423113048711/">蜗牛的博客</a></p>
<p>matrix是一个长度为4*5＝20的数组，其构成如下所示：</p>
<pre><code> R  ,G,  B,  A, offset
[1,  0,  0,  0,  0]); // red
[0,  1,  0,  0,  0]); // green
[0,  0,  1,  0,  0]); // blue
[0,  0,  0,  1,  0]); // alpha
</code></pre>
<p>上面是matrix的初始状态。</p>
<p>下面我分先来分析一下其初始状态。</p>
<p>red通道的值：（1，0，0，0，0）表示，R通道的乘数是1（完全保留），别的道道的的乘数是0，（不加入别的通道的颜色），色彩偏移量off是0；</p>
<p>别的通道依次类推。</p>
<p>下面来做一些效果，增加对colorMatrixFilter的认识：<span id="more-1443"></span></p>
<h3>1、调整亮度：</h3>
<p>亮度(N取值为-255到255)</p>
<pre><code>1,0,0,0,N
0,1,0,0,N
0,0,1,0,N
0,0,0,1,0
</code></pre>
<p>我们只需要设置一下RGB的色彩偏移就能调节其亮度，是不是很简单呢。</p>
<h3>2、颜色反向</h3>
<pre><code>-1,0,0,0,255
0,-1,0,0,255
0,0,-1,0,255
0,0,0,1,0
</code></pre>
<p>先解释一下颜色反向：就是把0变为255，255变为0，1变为254，254变为1&#8230;..</p>
<p>因此，我们只需把RGB通道的原通道乘数设为－1，然后再把色彩偏移量设为255就行了。</p>
<h3>3、图像去色：</h3>
<pre><code>0.3086, 0.6094, 0.0820, 0, 0
0.3086, 0.6094, 0.0820, 0, 0
0.3086, 0.6094, 0.0820, 0, 0
0    , 0    , 0    , 1, 0
</code></pre>
<p>1）、首先了解一下去色原理：只要把RGB三通道的色彩信息设置成一样；即：R＝G＝B，那么图像就变成了灰色，并且，为了保证图像亮度不变，同一个通道中的R+G+B=1:如：0.3086+0.6094+0.0820＝1；</p>
<p>2）、三个数字的由来：0.3086, 0.6094, 0.0820；</p>
<p>按理说应该把RGB平分，都是0.3333333。三个数字应该是根据色彩光波频率及色彩心理学计算出来的（本人是这么认为，当然也查询了一些资料，目前尚未找到准确答案。</p>
<p>在作用于人眼的光线中，彩色光要明显强于无色光。对一个图像按RGB平分理论给图像去色的话，人眼就会明显感觉到图像变暗了（当然可能有心理上的原因，也有光波的科学依据）另外，在彩色图像中能识别的一下细节也可能会丢失。我假想：可能绿色的一些东西会丢失。</p>
<p>下面是我从PS中对RGB都为255的明度对比图：</p>
<p><a href="/wp-content/uploads/2011/09/rgb_bright.jpg"><img src="/wp-content/uploads/2011/09/rgb_bright-300x224.jpg" alt="" title="rgb_bright" width="300" height="224" class="aligncenter size-medium wp-image-1446" /></a></p>
<p>同样的RGB，给人的感觉是绿色最亮，红色次之，蓝色最暗。它们的比例大概是3：6：1，即：0.3086, 0.6094, 0.0820</p>
<p>所以，在给图像去色时我们保留了大量的G通道信息，使得图像不至于变暗或者绿色信息不至于丢失（我猜想）。</p>
<h3>4、色彩饱和度</h3>
<p>N取值为0到2，当然也可以更高。</p>
<pre><code>0.3086*(1-N) + N, 0.6094*(1-N)    , 0.0820*(1-N)    , 0, 0,
0.3086*(1-N)   , 0.6094*(1-N) + N, 0.0820*(1-N)    , 0, 0,
0.3086*(1-N)   , 0.6094*(1-N)    , 0.0820*(1-N) + N 0, 0,
0        , 0        , 0        , 1, 0
</code></pre>
<p>分析：</p>
<ol>
<li>当色彩饱和度低到一定成度的时候，就想当于给图像去色，所以跟第3条：图像去色，有着千丝万缕的联系，在此不想过多解释；</li>
<li>N为原有通道信息保留量；可以理解为百分之几，等于0时完全去色，小于1时降低色度，大于1时增加色度，等于2时色度翻一倍，等于3时……。注意：RGB的原有通道信息保留量都应该相等，不然会产生偏色。</li>
<li>为什么是这样的计算公式：</li>
</ol>
<p>N是原通道色彩保留量：所以，在原通道中，我们都+ N，这是不能被别的通道瓜分的。剩余的就是（1－N），就让RGB按0.3086, 0.6094, 0.0820的比例还瓜分这个剩余量吧。</p>
<h3>5、对比度</h3>
<p>N取值为0到10</p>
<pre><code>N,0,0,0,128*(1-N)
0,N,0,0,128*(1-N)
0,0,N,0,128*(1-N)
0,0,0,1,0
</code></pre>
<p>分析：</p>
<p>所谓对比度就是让红的更红，绿的更绿……或反之。初一想，我们只需要修改RGB的乘数（要一至，不然偏色）。可仔细一琢磨，不对。如果只增加乘数，那么整个图像就会被漂白，（或反之）。好，有办法了，设置色彩偏移量，offset。具体要偏移多少呢，我们找到了一个折中的方案：128（1－N);即：一幅图像，不论很亮或很黑，但对比度为0了，最终得到的都是一幅中性灰度的图像（128），</p>
<h3>6、阈值</h3>
<p>所谓阈值，就是以一个色度值为基准对图像作非黑即白的处理（注意没有灰色），由于不去除了彩色属性，因此，也离不开0.3086, 0.6094, 0.0820这三组神奇的数字。</p>
<p>(N取值为0到255)</p>
<p>下面的256也可以改成255；（那样就能看到图一和图五的小黑点和小白点）；</p>
<pre><code>0.3086*256,0.6094*256,0.0820*256,0,-256*N
0.3086*256,0.6094*256,0.0820*256,0,-256*N
0.3086*256,0.6094*256,0.0820*256,0,-256*N
0, 0, 0, 1, 0
</code></pre>
<p>分析：</p>
<p>先不看最后面的色彩偏移：-256*N</p>
<p>前面我们提及过，当RGB三个通道的色彩信息一模一样时，图像就失去了色彩（去色），从0.3086<em>256,0.6094</em>256,0.0820<em>256,0,-256</em>N可以看出：图像已经去色了，并且，（*256）亮度已经翻了256倍（当然也可以是255）；我们知道，RGB的有效值是0－255，即：0，1，2……255，把这些值乘以255以后会出现什么情况呢？但是除了0之外，别的全都大于或等于255了，所以此时的图像除了剩有几个黑点外，其它的全都变成白色了如图一（N＝0）；那么现在我们再作色彩偏移处理：把RGB都减去255；上次值为255（白色）的现在又变成0（黑色了）超过255的仍然是白色，我们不断的反复减255，图2，图3，图4，图5，分别是N＝64，N＝128，n=192,n=255时的图像：</p>
<p><a href="/wp-content/uploads/2011/09/threshold.jpg"><img src="/wp-content/uploads/2011/09/threshold-300x67.jpg" alt="" title="threshold" width="300" height="67" class="aligncenter size-medium wp-image-1445" /></a></p>
<h3>7、色彩旋转</h3>
<p>所谓色彩旋转就是让某一个通道的色彩信息让另一个通道去显示；比如，R显示G的信息，G显示B的信息，B显示R的信息，也可以只拿出一部份信息让给别的通道去显示，至于参数的瓜分可以平分。不必太讲究，但是，始终要坚持的一个原则就是每一个通道中的RGB信息量之和一定要为1，不然将会生偏色，如果您要制作偏色效果又另当别论；请偿试下面的参数：</p>
<pre><code>0,1,0,0,0
0,0,1,0,0
1,0,0,0,0
0,0,0,1,0
</code></pre>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<pre><code>0,0,1,0,0
1,0,0,0,0
0,1,0,0,0
0,0,0,1,0
</code></pre>
<h3>8、只显示某个通道；</h3>
<pre><code>1,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,1,0
</code></pre>
<p>上面是只显示红色通道。依次类推。</p>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1443.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>将当前目录下的所有as文件加入缓冲区列表</title>
		<link>http://zengrong.net/post/1427.htm</link>
		<comments>http://zengrong.net/post/1427.htm#comments</comments>
		<pubDate>Sat, 27 Aug 2011 11:45:27 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1427</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1427.htm" title="将当前目录下的所有as文件加入缓冲区列表"></a>vim的缓冲区列表(buffer list)保存着打开过的文件集合。使用 :b filename 可以快速打开需要的文件，且支持文件名自动补全，为编辑提供方便。 如果所有源文件都加入到缓冲区列表中，在编辑源码的时候不就更方便了么？ 使用 :badd 命令可以将一个文件加入到缓冲区，我写了3个函数来提供批量加入和文件搜索的功能： GetFileList返回提供的路径（和子目录）下的所有as文件的列表； EchoBaddList将提供的路径（和子目录）下的所有as文件输出成Vim支持的添加缓冲区列表语句，并输出到当前缓冲区中；使用这个函数，可以方便的编辑自己的Session文件； BaddList则直接将提供的路径（和子目录）下的所有as文件加入到缓冲区列表。 ?View Code VIM&#34; 获取目录下的所有文件的列表 function! GetFileList&#40;...&#41; if exists&#40;'a:1'&#41; let path = a:1 else let path = glob&#40;&#34;%:h&#34;&#41; endif if exists&#40;'a:2'&#41; let ext = a:2 else let ext = &#8230;<p class="read-more"><a href="http://zengrong.net/post/1427.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1427.htm" title="将当前目录下的所有as文件加入缓冲区列表"></a><p>vim的缓冲区列表(buffer list)保存着打开过的文件集合。使用 <code>:b filename</code> 可以快速打开需要的文件，且支持文件名自动补全，为编辑提供方便。</p>
<p>如果所有源文件都加入到缓冲区列表中，在编辑源码的时候不就更方便了么？</p>
<p>使用 <code>:badd</code> 命令可以将一个文件加入到缓冲区，我写了3个函数来提供批量加入和文件搜索的功能：</p>
<ul>
<li>GetFileList返回提供的路径（和子目录）下的所有as文件的列表；</li>
<li>EchoBaddList将提供的路径（和子目录）下的所有as文件输出成Vim支持的添加缓冲区列表语句，并输出到当前缓冲区中；使用这个函数，可以方便的编辑自己的Session文件；</li>
<li>BaddList则直接将提供的路径（和子目录）下的所有as文件加入到缓冲区列表。<br />
<span id="more-1427"></span></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('p1427code2'); return false;">View Code</a> VIM</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p14272"><td class="code" id="p1427code2"><pre class="vim" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;">&quot; 获取目录下的所有文件的列表</span>
<span style="color: #804040;">function</span><span style="color: #000000;">!</span> GetFileList<span style="color: #000000;">&#40;</span><span style="color: #000000;">...</span><span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">if</span> <span style="color: #25BB4D;">exists</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">'a:1'</span><span style="color: #000000;">&#41;</span>
        <span style="color: #804040;">let</span> <span style="color: #668080;">path</span> = a<span style="color: #000000;">:</span><span style="color: #000000; font-weight:bold;">1</span>
    <span style="color: #804040;">else</span>
        <span style="color: #804040;">let</span> <span style="color: #668080;">path</span> = <span style="color: #25BB4D;">glob</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;%:h&quot;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">endif</span>
    <span style="color: #804040;">if</span> <span style="color: #25BB4D;">exists</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">'a:2'</span><span style="color: #000000;">&#41;</span>
        <span style="color: #804040;">let</span> ext = a<span style="color: #000000;">:</span><span style="color: #000000; font-weight:bold;">2</span>
    <span style="color: #804040;">else</span>
        <span style="color: #804040;">let</span> ext = <span style="color: #C5A22D;">&quot;as&quot;</span>
    <span style="color: #804040;">endif</span>
    <span style="color: #804040;">let</span> trueList = <span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #adadad; font-style: italic;">
    &quot; 获取子目录中的文件列表</span>
    <span style="color: #804040;">let</span> fileList = <span style="color: #25BB4D;">split</span><span style="color: #000000;">&#40;</span><span style="color: #25BB4D;">glob</span><span style="color: #000000;">&#40;</span><span style="color: #668080;">path</span><span style="color: #000000;">.</span><span style="color: #C5A22D;">&quot;/**/*.&quot;</span><span style="color: #000000;">.</span>ext<span style="color: #000000;">&#41;</span>, <span style="color: #C5A22D;">&quot;<span style="">\&lt;</span>NL&gt;&quot;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">for</span> afile <span style="color: #804040;">in</span> fileList
        <span style="color: #804040;">if</span> <span style="color: #25BB4D;">isdirectory</span><span style="color: #000000;">&#40;</span>afile<span style="color: #000000;">&#41;</span><span style="color: #adadad; font-style: italic;">
        &quot; 排除目录</span>
            <span style="color: #804040;">continue</span>    
        <span style="color: #804040;">end</span>
        <span style="color: #804040;">call</span> <span style="color: #25BB4D;">add</span><span style="color: #000000;">&#40;</span>trueList, afile<span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">endfor</span>
    <span style="color: #804040;">return</span> trueList
endfunction<span style="color: #adadad; font-style: italic;">
&nbsp;
&quot; 输出buffer列表到当前缓冲区</span>
<span style="color: #804040;">function</span><span style="color: #000000;">!</span> EchoBaddList<span style="color: #000000;">&#40;</span><span style="color: #000000;">...</span><span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">let</span> baddList = <span style="color: #804040;">call</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;GetFileList&quot;</span>, a<span style="color: #000000;">:</span>000<span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">for</span> afile <span style="color: #804040;">in</span> baddList
        <span style="color: #804040;">execute</span> <span style="color: #C5A22D;">'normal obadd '</span><span style="color: #000000;">.</span>afile
    <span style="color: #804040;">endfor</span>
endfunction<span style="color: #adadad; font-style: italic;">
&nbsp;
&quot; 将path中的文件直接加入buffer列表</span>
<span style="color: #804040;">function</span><span style="color: #000000;">!</span> BaddList<span style="color: #000000;">&#40;</span><span style="color: #000000;">...</span><span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">let</span> baddList = <span style="color: #804040;">call</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;GetFileList&quot;</span>, a<span style="color: #000000;">:</span>000<span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">for</span> afile <span style="color: #804040;">in</span> baddList
        <span style="color: #804040;">execute</span> <span style="color: #C5A22D;">'badd '</span><span style="color: #000000;">.</span>afile
    <span style="color: #804040;">endfor</span>
endfunctio</pre></td></tr></table></div>

<p>运行一下看看 <code>:call BaddList('src')</code><br />
再看看缓冲区是否被加入了： <code>:ls</code></p>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1427.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系</title>
		<link>http://zengrong.net/post/1295.htm</link>
		<comments>http://zengrong.net/post/1295.htm#comments</comments>
		<pubDate>Thu, 21 Apr 2011 12:42:42 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[FlashPlayer]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1295</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1295.htm" title="Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系"><img width="266" height="200" src="http://zengrong.net/wp-content/uploads/2011/04/flash_history.png" class="attachment-extra-featured-image wp-post-image" alt="FlashIDE发展史" title="FlashIDE发展史" /></a>2011-05-06更新：加入SWF SWC SWZ部分 2011-09-19更新：smithfox推荐了一篇英文的，比我的更详细：Versions in the Flash Platform 这篇文章本来是我在9ria上对网友的回复，但最近询问此类问题的网友越来越多，就整理了一下，增加了一些东西。原贴见这里 ActionScript ActionScript通常简称为AS，它是Flash平台的语言。AS编写的程序，最终可以编译成SWF、SWC。SWF就是我们常说的Flash动画。但是现在SWF已经不仅仅是动画，而是RIA的载体。 ActionScript有3个版本，分别是1.0版（AS1），2.0版（AS2）和3.0版（AS3）。只有Flash Player 9及以上播放器才支持AS3编译的SWF。这三个版本的差别非常大，现在最流行的版本是AS3。 Flex与MXML 因为在开发RIA的时候，需要很多常用的功能，例如控件（Button,ComboBox,List……）、布局（VGroup、VBox……）等等…… Adobe就开发了一套官方的框架集来实现这些功能，这套框架集就叫做Flex。 为了方便程序员快速编写RIA程序界面，Adobe又实现了一种基于XML语法的语言MXML，这套语言很像HTML，可以与AS混用，MXML最终也是编译成SWF或SWC。 Flex框架就是使用AS3与MXML两种语言写成的。但说白了，MXML 外加实现了MXML语法，如果你有兴趣，也可以自己实现这些。 Flash和Flex，都是用AS编写，使用swf体现。 Flash 现在Adobe已经将Flash其定义为一个平台（Flash Plantform），包括了Flash IDE、Flash Builder、AIR、Flash Player以及更多。但我们一般讲Flash，有两个意思，一个是指Flash动画（也就是网页上扩展名为swf的动画），另一个就是Flash IDE。 Flash（IDE）从4.0开始进入中国，前期一直在网页动画方面告诉发展，多被用来做网页小广告（让你CPU100%的罪魁祸首之一）和MV（showgood三国系列、小小系列、大学自习室……曾经风靡一时啊）。那时的“闪客”，主要是做动画，即使涉及到编程，也大多是用当时的AS1.0（后来Flash MX 2004升级为AS2.0）写一点stop、gotoAndPlay之类的东东了。Flash（IDE）发展到8.0版本以后，才开始大量用于编程，当时比较流行的就是“Flash留言本”等等。相关历史我做了一张图来表示，括号里的数字是年份。 Flash Builder/Flex Builder AS发展到3.0之后，由于其语法和JAVA比较像，再加上增强的性能与强类型，可以完全脱离FLA文件，使用纯文本编码，受到了许多其他程序员（尤其是JAVA程序员）的青睐。由此得以高速发展，用AS开发程序的人也越来越多。AS在视频网站、游戏行业发展迅速。但是，Flash IDE虽然是一个很好的动画制作工具，却不是一个好的开发工具。于是，Adobe又发布了Flex Builder，一个基于Eclipse的IDE，并发布了Flex SDK，后来又开源了。 有了免费的编译器，Flex得以快速发展。用Flex Builder也可以开发纯AS项目（即所有的文件都是as文件，不包含MXML，也不包含FLA）。一个真正的程序猿，应该更愿意使用这种方式吧？Flex &#8230;<p class="read-more"><a href="http://zengrong.net/post/1295.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1295.htm" title="Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系"><img width="266" height="200" src="http://zengrong.net/wp-content/uploads/2011/04/flash_history.png" class="attachment-extra-featured-image wp-post-image" alt="FlashIDE发展史" title="FlashIDE发展史" /></a><p><span style="color:red;">2011-05-06更新：</span>加入SWF SWC SWZ部分</p>
<p><span style="color:red;">2011-09-19更新：</span><a href="http://www.smithfox.com" target="_blank">smithfox</a>推荐了一篇英文的，比我的更详细：<a href="http://www.senocular.com/flash/tutorials/versions/" target="_blank">Versions in the Flash Platform</a></p>
<hr />
<p>这篇文章本来是我在9ria上对网友的回复，但最近询问此类问题的网友越来越多，就整理了一下，增加了一些东西。<a href="http://bbs.9ria.com/viewthread.php?tid=74956&#038;rpid=687671&#038;ordertype=0&#038;page=1#pid687671" target="_blank">原贴见这里</a></p>
<h3>ActionScript</h3>
<p>ActionScript通常简称为AS，它是Flash平台的语言。AS编写的程序，最终可以编译成SWF、SWC。SWF就是我们常说的Flash动画。但是现在SWF已经不仅仅是动画，而是<a title="什么是RIA" href="http://zh.wikipedia.org/zh/%E4%B8%B0%E5%AF%8C%E4%BA%92%E8%81%94%E7%BD%91%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" target="_blank">RIA</a>的载体。</p>
<p>ActionScript有3个版本，分别是1.0版（AS1），2.0版（AS2）和3.0版（AS3）。只有Flash Player 9及以上播放器才支持AS3编译的SWF。这三个版本的差别非常大，现在最流行的版本是AS3。 <span id="more-1295"></span></p>
<h3>Flex与MXML</h3>
<p>因为在开发RIA的时候，需要很多常用的功能，例如控件（Button,ComboBox,List……）、布局（VGroup、VBox……）等等…… Adobe就开发了一套官方的框架集来实现这些功能，这套框架集就叫做Flex。</p>
<p>为了方便程序员快速编写RIA程序界面，Adobe又实现了一种基于XML语法的语言<strong>MXML</strong>，这套语言很像HTML，可以与AS混用，MXML最终也是编译成SWF或SWC。 Flex框架就是使用AS3与MXML两种语言写成的。但说白了，MXML 外加实现了MXML语法，如果你有兴趣，也可以自己实现这些。 Flash和Flex，都是用AS编写，使用swf体现。</p>
<h3>Flash</h3>
<p>现在Adobe已经将Flash其定义为一个平台（Flash Plantform），包括了Flash IDE、Flash Builder、AIR、Flash Player以及更多。但我们一般讲Flash，有两个意思，一个是指Flash动画（也就是网页上扩展名为swf的动画），另一个就是Flash IDE。</p>
<p>Flash（IDE）从4.0开始进入中国，前期一直在网页动画方面告诉发展，多被用来做网页小广告（让你CPU100%的罪魁祸首之一）和MV（showgood三国系列、小小系列、大学自习室……曾经风靡一时啊）。那时的“闪客”，主要是做动画，即使涉及到编程，也大多是用当时的AS1.0（后来Flash MX 2004升级为AS2.0）写一点stop、gotoAndPlay之类的东东了。Flash（IDE）发展到8.0版本以后，才开始大量用于编程，当时比较流行的就是“Flash留言本”等等。相关历史我做了一张图来表示，括号里的数字是年份。</p>
<p><a href="/wp-content/uploads/2011/04/flash_history.png"><img src="/wp-content/uploads/2011/04/flash_history.png" alt="FlashIDE发展史" title="FlashIDE发展史" width="685" height="514" class="aligncenter size-full wp-image-1310" /></a></p>
<h3>Flash Builder/Flex Builder</h3>
<p>AS发展到3.0之后，由于其语法和JAVA比较像，再加上增强的性能与强类型，可以完全脱离FLA文件，使用纯文本编码，受到了许多其他程序员（尤其是JAVA程序员）的青睐。由此得以高速发展，用AS开发程序的人也越来越多。AS在视频网站、游戏行业发展迅速。但是，Flash IDE虽然是一个很好的动画制作工具，却不是一个好的开发工具。于是，Adobe又发布了Flex Builder，一个基于Eclipse的IDE，并发布了Flex SDK，后来又开源了。</p>
<p>有了免费的编译器，Flex得以快速发展。用Flex Builder也可以开发纯AS项目（即所有的文件都是as文件，不包含MXML，也不包含FLA）。一个真正的程序猿，应该更愿意使用这种方式吧？Flex Builder从4.0开始，被Adobe改名为Flash Builder。</p>
<p>Flash Builder和Flash IDE不应该放在一起比较，它们不是一类软件。如果一定要比较一下的话，那么就是Flash IDE比较偏重于设计一点，用它做动画比较方便，当然也可以用它编写AS3程序。用Flash IDE编写的程序，会有一个FLA源文件，可能还包含多个as文件。Flash Builder偏重于程序，用它可以开发MXML（也就是Flex）项目。也可以用它编写纯AS项目。用Flash Builder编写的项目，都是纯文本文件（.as或者.mxml）。 对于程序流，当然偏爱Flash Builder，而设计流比较偏爱Flash IDE。</p>
<p>当然，IDE并非只有Adobe官方的东西，<a href="http://www.flashdevelop.org/">Flash Develop</a>就是个免费的IDE。如果你愿意，用记事本做编辑器也没什么不好（比如说zrong就正在尝试<a href="http://www.vim.org">VIM</a>），因为SDK和编译器都是免费的。</p>
<h3>Flash Player</h3>
<p>swf动画需要在网页上显示出来，就需要安装Flash Player。Flash Player的不同版本，其实与Flash IDE也有一定的对应关系（从上图也能看出来）。但到了AS3时代后，这个对应关系就不那么明显了。Flash Player 9是能支持AS3 的最低版本（其实前面还有一个Flash Player 8.5，只是没普及就升级到9了），后面的Flash Player 都能支持AS3了。关于Flash Player，我写过一篇<a href="http://zengrong.net/post/1188.htm">有史以来关于Flash Player的最详细说明</a>，看这个就很清楚了。</p>
<h3>AIR</h3>
<p>Flash Player 再强大，也是运行在浏览器中，受浏览器约束。为了摆脱浏览器，Adobe又出奇招，发布了AIR。AIR其实就是一个Runtime，你可以把它理解成<a href="http://en.wikipedia.org/wiki/Java_Virtual_Machine">JVM</a>。有了AIR，就可以用AS3开发桌面软件，而且开发出的软件可跨平台运行（这和JAVA的<strong>一次编译，随处运行</strong>不是如出一辙么！)。目前国内的AIR应用主要集中在网站的客户端方面，例如<a href="http://sinatair.sinaapp.com/">新浪微博AIR客户端</a>等。</p>
<h3>SWF SWC SWZ</h3>
<p><strong>SWF</strong><br />
swf是我们见到的最多的Flash平台文件了。是的，它就是Flash平台的最终表现形式。前面说到了，无论是Flex、Flash还是纯AS3，最终编译出来的文件都是swf格式，浏览器中的Flash Player插件和独立的Flash Player，也只能“打开”swf文件进行播放。前面说到的AIR，它的本质也就是运行时+swf而已。</p>
<p>其实并非所有的swf都能直接播放的。swf有3种：</p>
<ol>
<li><strong>程序SWF(application swf)</strong>：可以直接在flash player中运行的swf；</li>
<li><strong>库SWF（library swf）</strong>：swc文件中的library.swf；</li>
<li><strong>模块SWF（module swf）</strong>：Flex Module产生的swf文件。</li>
</ol>
<p>最终用户碰到的绝大多数都是“程序SWF”，而程序猿们碰到后面两种SWF的可能性就比较大。</p>
<p><strong>SWC</strong></p>
<p>SWC是一种库文件，通常用来发布非开源的类。程序猿们将源码编译成SWC文件，并发布API文档，我们就可以使用这些SWC提供的类库进行自己的开发。SWC并不是运行时共享的，而是在编译的时候直接加入了程序SWF中。最终的程序SWF可以脱离SWC运行。</p>
<p>SWC本质就是一个zip文档，其中包含一个library.swf文件和一个用于描述的xml文件，你可以用zip管理器打开它查看。</p>
<p><strong>SWZ</strong></p>
<p>你可能会发现，从<a href="http://zengrong.net/post/tag/tlf" target="_blank">TLF</a>出现以来，Flex SDK中多了一个<a href="http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/flashx/textLayout/elements/package-detail.html" target="_blank">flashx</a>包，这个包中的功能，就是用SWZ实现的。SWZ是在运行时共享的库，你可以将其看作一个<strong>可以放在外部的SWC</strong>。而且SWZ的共享是平台级别的（Moudle SWF的共享是浏览器级别），存在于操作系统缓存中（Module SWF的存在浏览器缓存），只要下载过一次SWZ，你的操作系统中所有用到这些SWZ中的地方（无论是IE、FF、Chrome还是AIR）都不用重新下载。</p>
<p>对于程序猿，这里的关于SWC和SWZ的信息肯定是不够的，所以建议看一下smithfox的<a href="http://www.smithfox.com/?e=135" target="_blank">swf swc swz RSLs ant</a>，本文的这个部分也是参照它写成的。</p>
<p><em>全文完</em></p>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1295.htm/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>[转]原来Tween缓冲是这么回事</title>
		<link>http://zengrong.net/post/1151.htm</link>
		<comments>http://zengrong.net/post/1151.htm#comments</comments>
		<pubDate>Mon, 04 Oct 2010 15:48:16 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[tween]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1151</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1151.htm" title="[转]原来Tween缓冲是这么回事"></a>转自：http://bbs.9ria.com/viewthread.php?tid=63977 Tween缓冲 Tween缓冲大家应该都不陌生，说白了就是从一起始位置逐渐移动到目标位置的过程，这个过程可以是加速移动，也可以是减速移动，这些不同的缓动方式就是Tween的各种ease。 Tween算法 概念知道了，了解一下Tween的算法对我们更好的使用Tween或者编写自己的Tween都是很有帮助的。 在缓动过程中，随着时间的推移，对象从起始位置开始逐渐向目标位置移动，我们假设移动的距离为disX，并将其作为y轴，时间t作为x轴，这样可以轻松的得到一条曲线，如下图：在上图中我取了三个时间点ta、tb和tc，他们对于的移动的距离分别是da、db和dc，其中ta到tb与tb到tc之间的时间相同，但是很明显的可以看到db-da比dc-db小，也就是说相同的时间内，时间越靠后，对象移动的越快，实际上着就是Tween中的Cubic缓动模式，你可以在下面的SWF中看到它的效果。 
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_tween_94376862"
			class="flashmovie"
			width="465"
			height="465">
	<param name="movie" value="/wp-content/uploads/2010/10/tween.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="/wp-content/uploads/2010/10/tween.swf"
			name="fm_tween_94376862"
			width="465"
			height="465">
	<!--<![endif]-->
		 
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object> 如果曲线是下面这种情况，你觉得缓动应该是什么样子的呢？ 在开始部分的SWF的舞台中点击，试着找到这条曲线，看到了吗？上面的方块像是一个篮球掉在地上一样，反弹了几下然后停止在目标位置，这是Tween种的Bounce缓冲效果。Tween中还有很多很好玩的缓冲模式，你可以在TweenLite开源类库中找到这些缓冲模式。 效果是看到了,但是缓动是怎么计算的呢?别着急，听我们慢慢给你细说。 首先我先声明几个变量： time：缓动经历过的时间 beforeMove：起始位置 changeDistance：起始位置与目标位置的距离,也就是距离上的一个变化量 duration：我们要求对象从起始位置移动到目标位置所需的时间，也就是缓动的总时长 我们假设对象是匀速像目标位置移动，那么根据这四个变量可以轻松的计算出对象在经历time时间后应处的位置pos，公式如下： ?View Code ACTIONSCRIPTpos = changeDistance * &#40; time/duration &#41; + beforeMove 能看明白上面的公式吗？在经历的time时间后，用changeDistance乘以这个时间time占缓动总时长duration的比例，可以得到移动的距离，再加上初始位置便是对象实际应该处的位置。 请你试着代开TweenLite开源类中的Linear类，你会看到下面的代码： ?View Code ACTIONSCRIPTpackage gs.easing &#8230;<p class="read-more"><a href="http://zengrong.net/post/1151.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1151.htm" title="[转]原来Tween缓冲是这么回事"></a><p>转自：http://bbs.9ria.com/viewthread.php?tid=63977</p>
<h3>Tween缓冲</h3>
<p>Tween缓冲大家应该都不陌生，说白了就是从一起始位置逐渐移动到目标位置的过程，这个过程可以是加速移动，也可以是减速移动，这些不同的缓动方式就是Tween的各种ease。</p>
<h3>Tween算法</h3>
<p>概念知道了，了解一下Tween的算法对我们更好的使用Tween或者编写自己的Tween都是很有帮助的。<br />
在缓动过程中，随着时间的推移，对象从起始位置开始逐渐向目标位置移动，我们假设移动的距离为disX，并将其作为y轴，时间t作为x轴，这样可以轻松的得到一条曲线，如下图：<a href="/wp-content/uploads/2010/10/tween1.jpg"><img class="aligncenter size-full wp-image-1152" title="tween1" src="/wp-content/uploads/2010/10/tween1.jpg" alt="" width="622" height="262" /></a>在上图中我取了三个时间点ta、tb和tc，他们对于的移动的距离分别是da、db和dc，其中ta到tb与tb到tc之间的时间相同，但是很明显的可以看到db-da比dc-db小，也就是说相同的时间内，时间越靠后，对象移动的越快，实际上着就是Tween中的Cubic缓动模式，你可以在下面的SWF中看到它的效果。<span id="more-1151"></span><br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_tween_1030635183"
			class="flashmovie"
			width="465"
			height="465">
	<param name="movie" value="/wp-content/uploads/2010/10/tween.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="/wp-content/uploads/2010/10/tween.swf"
			name="fm_tween_1030635183"
			width="465"
			height="465">
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object><br />
如果曲线是下面这种情况，你觉得缓动应该是什么样子的呢？</p>
<p><a href="/wp-content/uploads/2010/10/tween2.jpg"><img class="aligncenter size-full wp-image-1153" title="tween2" src="/wp-content/uploads/2010/10/tween2.jpg" alt="" width="605" height="264" /></a></p>
<p>在开始部分的SWF的舞台中点击，试着找到这条曲线，看到了吗？上面的方块像是一个篮球掉在地上一样，反弹了几下然后停止在目标位置，这是Tween种的Bounce缓冲效果。Tween中还有很多很好玩的缓冲模式，你可以在TweenLite开源类库中找到这些缓冲模式。</p>
<p><a href="/wp-content/uploads/2010/10/tween3.jpg"><img class="aligncenter size-full wp-image-1154" title="tween3" src="/wp-content/uploads/2010/10/tween3.jpg" alt="" width="162" height="227" /></a></p>
<p>效果是看到了,但是缓动是怎么计算的呢?别着急，听我们慢慢给你细说。</p>
<p>首先我先声明几个变量：</p>
<ul>
<li>time：缓动经历过的时间</li>
<li>beforeMove：起始位置</li>
<li>changeDistance：起始位置与目标位置的距离,也就是距离上的一个变化量</li>
<li>duration：我们要求对象从起始位置移动到目标位置所需的时间，也就是缓动的总时长</li>
</ul>
<p>我们假设对象是匀速像目标位置移动，那么根据这四个变量可以轻松的计算出对象在经历time时间后应处的位置pos，公式如下：</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('p1151code6'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p11516"><td class="code" id="p1151code6"><pre class="actionscript" style="font-family:monospace;">pos = changeDistance <span style="color: #66cc66;">*</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">time</span><span style="color: #66cc66;">/</span><span style="color: #0066CC;">duration</span> <span style="color: #66cc66;">&#41;</span> + beforeMove</pre></td></tr></table></div>

<p>能看明白上面的公式吗？在经历的time时间后，用changeDistance乘以这个时间time占缓动总时长duration的比例，可以得到移动的距离，再加上初始位置便是对象实际应该处的位置。<br />
请你试着代开TweenLite开源类中的Linear类，你会看到下面的代码：</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('p1151code7'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p11517"><td class="code" id="p1151code7"><pre class="actionscript" style="font-family:monospace;">package gs.<span style="color: #006600;">easing</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Linear <span style="color: #66cc66;">&#123;</span>
                <span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">function</span> easeNone <span style="color: #66cc66;">&#40;</span>t:<span style="color: #0066CC;">Number</span>, b:<span style="color: #0066CC;">Number</span>, c:<span style="color: #0066CC;">Number</span>, d:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Number</span>
		<span style="color: #66cc66;">&#123;</span>
                        <span style="color: #b1b100;">return</span> c<span style="color: #66cc66;">*</span>t<span style="color: #66cc66;">/</span>d + b;
                <span style="color: #66cc66;">&#125;</span>
                <span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">function</span> easeIn <span style="color: #66cc66;">&#40;</span>t:<span style="color: #0066CC;">Number</span>, b:<span style="color: #0066CC;">Number</span>, c:<span style="color: #0066CC;">Number</span>, d:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Number</span> 
		<span style="color: #66cc66;">&#123;</span>
                        <span style="color: #b1b100;">return</span> c<span style="color: #66cc66;">*</span>t<span style="color: #66cc66;">/</span>d + b;
                <span style="color: #66cc66;">&#125;</span>
                <span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">function</span> easeOut <span style="color: #66cc66;">&#40;</span>t:<span style="color: #0066CC;">Number</span>, b:<span style="color: #0066CC;">Number</span>, c:<span style="color: #0066CC;">Number</span>, d:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Number</span> 
		<span style="color: #66cc66;">&#123;</span>
                        <span style="color: #b1b100;">return</span> c<span style="color: #66cc66;">*</span>t<span style="color: #66cc66;">/</span>d + b;
                <span style="color: #66cc66;">&#125;</span>
                <span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">function</span> easeInOut <span style="color: #66cc66;">&#40;</span>t:<span style="color: #0066CC;">Number</span>, b:<span style="color: #0066CC;">Number</span>, c:<span style="color: #0066CC;">Number</span>, d:<span style="color: #0066CC;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Number</span> 
		<span style="color: #66cc66;">&#123;</span>
                        <span style="color: #b1b100;">return</span> c<span style="color: #66cc66;">*</span>t<span style="color: #66cc66;">/</span>d + b;
                <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>是不是很眼熟？是的，就是刚刚我讲过的那个公式，这就是TweenLite中Linear缓动模式的算法，你可以试着打开其他缓动模式类看一下它们的源码，虽然easeIn、easeOut和easeInOut的算法不同，但是它们都包含了这四个参数：t（time）、b（beforeMove）、c（changeDistance）及d（duration）。<br />
但是在TweenLite计算缓动时，并不是直接将起始位置和起始与目标位置的距离作为参数传递给easeIn函数，因为TweenLite不只是缓动坐标，还包括对象的宽高，透明度等等，所以实际上TweenLite是将这两个数值分别用0和1代替，得到经历时间与缓动时间长的比例factor，然后再用factor应用到对象属性的缓动上。</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('p1151code8'); return false;">View Code</a> ACTIONSCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p11518"><td class="code" id="p1151code8"><pre class="actionscript" style="font-family:monospace;">factor        = Linear.<span style="color: #006600;">easeIn</span> <span style="color: #66cc66;">&#40;</span> t,<span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">1</span>,d<span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">object</span>.<span style="color: #006600;">para</span>= changeValue <span style="color: #66cc66;">*</span> factor + beforeValue;</pre></td></tr></table></div>

<p>理解了缓动的计算原理，你是不是可以运用大学里学的曲线方程写出自己的缓动模式呢？！</p>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1151.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alcon/De MonsterDebugger/Arthropod Flash Debugger简单评测</title>
		<link>http://zengrong.net/post/1143.htm</link>
		<comments>http://zengrong.net/post/1143.htm#comments</comments>
		<pubDate>Mon, 20 Sep 2010 06:37:31 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[AIR]]></category>

		<guid isPermaLink="false">http://zengrong.net/?p=1143</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/1143.htm" title="Alcon/De MonsterDebugger/Arthropod Flash Debugger简单评测"></a>Alcon、De MonsterDebugger、Arthropod都是基于AIR的Debugger工具。今天有时间简单使用了一下这三个Debugger，下面是一些使用感受和选择建议。 首选：De MonsterDebugger 优点： 显示正在运行的swf的显示列表 实时更改显示对象的属性 在Debugger中选择某个显示对象的时候，swf中该对象周边还会出现黄色边框 可以筛选（筛选比搜索更好用）调试信息 可以调整界面的显示，不显示不需要的界面 有Monitor界面 缺点： Debug.as文件较大 运行速度较慢 快速开发：Alcon 优点： 启动快速 使用更加简单 单独的Inspect可以显示复杂对象 缺点： 暂无 不再推荐：Arthropod 著名的JWPlayer也可以采用Arthropod进行调试。但和上面两个调试器比起来就没什么特色了。]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/1143.htm" title="Alcon/De MonsterDebugger/Arthropod Flash Debugger简单评测"></a><p><a href="http://blog.hexagonstar.com/downloads/alcon/" target="_blank">Alcon</a>、<a href="http://demonsterdebugger.com/" target="_blank">De MonsterDebugger</a>、<a href="http://arthropod.stopp.se/" target="_blank">Arthropod</a>都是基于AIR的Debugger工具。今天有时间简单使用了一下这三个Debugger，下面是一些使用感受和选择建议。</p>
<p><strong>首选：De MonsterDebugger</strong></p>
<p><a href="/wp-content/uploads/2010/09/DeMonsterDebugger.png"><img class="aligncenter size-medium wp-image-1144" title="DeMonsterDebugger" src="/wp-content/uploads/2010/09/DeMonsterDebugger-300x189.png" alt="" width="300" height="189" /></a></p>
<p>优点：</p>
<ul>
<li>显示正在运行的swf的显示列表</li>
<li>实时更改显示对象的属性</li>
<li>在Debugger中选择某个显示对象的时候，swf中该对象周边还会出现黄色边框</li>
<li>可以筛选（筛选比搜索更好用）调试信息</li>
<li>可以调整界面的显示，不显示不需要的界面</li>
<li>有Monitor界面</li>
</ul>
<p>缺点：<span id="more-1143"></span></p>
<ul>
<li>Debug.as文件较大</li>
<li>运行速度较慢</li>
</ul>
<p><strong>快速开发：Alcon</strong></p>
<p><a href="/wp-content/uploads/2010/09/alcon2.png"><img class="aligncenter size-medium wp-image-1146" title="alcon2" src="/wp-content/uploads/2010/09/alcon2-300x255.png" alt="" width="300" height="255" /></a></p>
<p><a href="/wp-content/uploads/2010/09/alcon1.png"><img class="aligncenter size-medium wp-image-1145" title="alcon1" src="/wp-content/uploads/2010/09/alcon1-300x255.png" alt="" width="300" height="255" /></a></p>
<p>优点：</p>
<ul>
<li>启动快速</li>
<li>使用更加简单</li>
<li>单独的Inspect可以显示复杂对象</li>
</ul>
<p>缺点：</p>
<p>暂无</p>
<p><strong>不再推荐：Arthropod</strong></p>
<p><a href="/wp-content/uploads/2010/09/arthropod.png"><img class="aligncenter size-medium wp-image-1147" title="arthropod" src="/wp-content/uploads/2010/09/arthropod-300x256.png" alt="" width="300" height="256" /></a></p>
<p>著名的<a href="http://www.longtailvideo.com/players/jw-flv-player/" target="_blank">JWPlayer</a>也可以采用Arthropod进行调试。但和上面两个调试器比起来就没什么特色了。</p>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/1143.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[译]20个不能错过的ActionScript类库</title>
		<link>http://zengrong.net/post/887.htm</link>
		<comments>http://zengrong.net/post/887.htm#comments</comments>
		<pubDate>Fri, 18 Dec 2009 07:23:00 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[听说]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://www.zengrong.net/?p=887</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/887.htm" title="[译]20个不能错过的ActionScript类库"></a>本文译自20 Flash Resources and Tools You’ll Want 原文比较老了，所以里面很多东西我改了。 TweenLite 最快的补间动画引擎。看这个测试。仅3K大小，可用于AS3和 AS2。 滤镜看这里：TweenFilterLite 引擎。 Papervision3D 最流行的3D引擎。 Away3D另一个3D引擎。查看范例 WOW Engine AS3 3D 物理引擎。与 Papervision3D 或者 Away3D配合使用不错。 FIVe3D还是3D动画引擎。 Ribbit &#8211; An amazing technology that lets Flash call a phone and use the microphone &#8230;<p class="read-more"><a href="http://zengrong.net/post/887.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/887.htm" title="[译]20个不能错过的ActionScript类库"></a><p>本文译自<a href="http://www.weberdesignlabs.com/blog/2008/08/20-flash-resources-and-tools-youll-want/" target="_blank">20 Flash Resources and Tools You’ll Want</a></p>
<p>原文比较老了，所以里面很多东西我改了。</p>
<ol>
<li><a title="TweenLite" href="http://blog.greensock.com/tweenliteas3/"  target="_blank">TweenLite</a> 最快的补间动画引擎。<a title="Speed Test" href="http://blog.greensock.com/tweening-speed-test/"  target="_blank">看这个测试</a>。仅3K大小，可用于AS3和 AS2。 滤镜看这里：<a title="TweenFilterLiteAS3" href="http://www.greensock.com/ActionScript/TweenFilterLiteAS3/" target="_blank">TweenFilterLite </a>引擎。</li>
<li><a title="Papervision3D" href="http://code.google.com/p/papervision3d/" target="_blank">Papervision3D</a> 最流行的3D引擎。</li>
<li><a title="Away3D" href="http://away3d.com/" target="_blank">Away3D</a>另一个3D引擎。<a title="Green Planet Demo" href="http://www.closier.nl/playground/greenplanet.html" target="_blank">查看范例</a> </li>
<li><a title="WOW-Engine" href="http://seraf.mediabox.fr/wow-engine/as3-3d-physics-engine-wow-engine/" target="_blank">WOW Engine</a> AS3 3D 物理引擎。与 Papervision3D 或者 Away3D配合使用不错。</li>
<p><span id="more-887"></span></p>
<li><a title="FIVe3D" href="http://five3d.mathieu-badimon.com/" target="_blank">FIVe3D</a>还是3D动画引擎。</li>
<li><a title="Ribbit" href="http://developer.ribbit.com" target="_blank">Ribbit</a> &#8211; An amazing technology that lets Flash call a phone and use the microphone on your computer. Enables Flash pieces to receive phone calls. Visual voice mail, with speech to text capabilities. Very easy component-based implementation.</li>
<li><a title="WiiFlash" href="http://wiiflash.bytearray.org/"  target="_blank">WiiFlash</a>让Wii控制器用于Flash。使用WiiFlash，你可以创建更有趣的体验。</li>
<li><a title="APE" href="http://www.cove.org/ape/" target="_blank">APE (Actionscript Physics Engine)</a> 最大的物理引擎。</li>
<li><a title="AMFPHP" href="http://www.amfphp.org/" target="_blank">AMFPHP </a>在Flash中通过PHP连接数据库。（不过zrong更推荐<a href="http://www.themidnightcoders.com/products/weborb-for-php">weborb for PHP</a>）</li>
<li><a title="Flickr" href="http://code.google.com/p/as3flickrlib/" target="_blank">Flickr Library</a>zrong：修改了原文提供的地址。</li>
<li><a title="RSS Library" href="http://code.google.com/p/as3syndicationlib/" target="_blank">RSS Library</a> zrong：修改了原文提供的地址。</li>
<li><a title="YouTube" href="http://code.google.com/p/as3youtubelib/" target="_blank">YouTube</a> zrong:修改了原文提供的地址。还可以用这个google官方提供的<a href="http://code.google.com/intl/en/apis/youtube/flash_api_reference.html" target="_blank">YouTube API</a>。当然，国内基本用不上。</li>
<li><a title="FZip" href="http://codeazur.com.br/lab/fzip/" target="_blank">FZip </a>在客户端压缩zip文件。以前必须使用服务器端代码才能做到这些。</li>
<li><a title="AS3SoundEditorLib" href="http://code.google.com/p/as3soundeditorlib/" target="_blank">AS3SoundEditorLib</a> 使用这个库，可以以频谱的形式可视化的显示mp3文件，并支持提示点，可以在提示点之间播放mp3。</li>
<li><a title="Facebook-AS3" href="http://code.google.com/p/facebook-as3/"  target="_blank">Facebook-AS3</a>zrong:不说了，国内基本用不上。</li>
<li><a title="AS3Crypto" href="http://code.google.com/p/as3crypto/" target="_blank">AS3Crypto</a>用ActionScript3加密。</li>
<li><a title="AlivePDF" href="http://code.google.com/p/alivepdf/" target="_blank">AlivePDF</a> AlivePDF是一个开源的ActionScript 3 (Flash, Flex, AIR) PDF 生成库。使用它可以在客户端生成PDF文件。zrong:这里还有一个<a href="http://code.google.com/p/apdf/" target="_blank">aPDF</a></li>
<li><a title="ASSQL" href="http://code.google.com/p/assql/"  target="_blank">ASSQL</a>让ActionScript与MySQL直接沟通（不通过PHP等服务端）。</li>
<li><a title="Yahoo! Maps Communication Kit" href="http://developer.yahoo.com/flash/astra-webapis/" target="_blank">Yahoo!地图服务器通信开发包。</li>
<li><a title="AS3CoreLib" href="http://code.google.com/p/as3corelib/"  target="_blank">AS3CoreLib</a> 包含数个基于ActionScript3的工具类库。有MD5 和 SHA 1 加密（上面的AS3Crypt也有这个），图像压缩（现在已经直接整合进入Flex4 SDK了），和 JSON 解析和生成工具，以及一些数字和日期API。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/887.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Flex中实现聊天表情图片支持-实战篇</title>
		<link>http://zengrong.net/post/810.htm</link>
		<comments>http://zengrong.net/post/810.htm#comments</comments>
		<pubDate>Wed, 16 Sep 2009 07:40:09 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[FTE]]></category>
		<category><![CDATA[TLF]]></category>

		<guid isPermaLink="false">http://www.zengrong.net/?p=810</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/810.htm" title="在Flex中实现聊天表情图片支持-实战篇"></a>2011年6月17日更新：有网友说 SDK4.5下编译报错 1119: 访问可能未定义的属性 textFlow (通过 static 类型 spark.core:IEditableText 引用)。 TextChat.mxml /TextChat/src 第 94 行 问题的原因，在于SDK4.5将TextInput和TextArea的外观部件textDisplay的类型从原来的RichEditableText改为了IEditableText，因此无法得到textFlow属性。这是为了适应Mobile设备。在Spark主题下，它是 RichEditableText，而在Mobile主题下，它是StyleableTextField。 我解决的办法是强制将IEditableText转换成RichEditableText（见TextChat.mxml第95,100行）。这在Spark主题下当然是没问题的，但这并非是最好的办法。现在的源码是可以正常在SDK4和SDK4.5下编译的，请重新下载。 另外，经常有网友问到下载的压缩包中是一个FXP文件，这个该如何处理。其实这个问题Google一下自然有答案，做Flex，居然不知道FXP是什么，而且随手Google也不愿意做，我就只能鄙视你一下了。为了避免大家的麻烦，新提供的源码中增加了编译好的swf方便大家看效果，同时也放弃了FXP格式。我现在采用的是ANT+SDK编译，所以不要问我怎么把项目导入Flash Builder。 2010年10月7日更新：很多网友反应在SDK4正式版中，即使修改了源码也用不了，于是就顺手改了一下。现在的源码基于SDK4.1正式版，删除了一些原来beta版的时候用来解决beta版bug的代码，并加入了切分字符串的功能。也就是说，如果先输入文字，然后将输入点置于文字中再插入图片，图片会自动将文字分开。唉——转眼间这个源码发布一年了，时间过得真快啊…… 顺便说一句：后来我又做了一个魔法表情功能，可以看这里 2009年10月29日更新：今天发现，有几个问题，Flash Builder beta2自带的SDK已经解决了（下面标出了），看来beta确实是不能用于正式产品啊…… 2009年10月8日更新：Flash Builder beta 2发布后，spark组件中有些类的名称修改了，比如TextFilter改为TextConverter，SimpleText改为Label，TextArea.textview.textFlow改为TextArea.textFlow……因此如果使用beta2，那么下面的源码可能不会编译通过，请自行修改。 我发布“在Flex中实现聊天表情图片支持-资料篇”后，便有许多朋友找我要那个范例的源码。我在文章中就已提过那范例是从网上down来，并非我所做，自然没有源码。要源码，用X思，你懂的…… 那好吧，源码来了。 例子很简单，所有的代码加起来都不到400行，但做的时候却很痛苦。因为要了解spark组件和FXG的特点，还要了解新的skin的做法。不过总算做好了，总结一下，纠结的地方主要有下面几点： 采用内嵌表情还是采用外部表情图片。 为了获得更小的文件（Flex4比Flex3编译的文件大了200多K），一直是采用外部表情图片的。在本机调试都正常。但上传到网上后，就无法显示图片。调整了swf的base属性之后，图片可以在输入框和文字框中显示，就是不能显示在图片选择面板中。最后一气之下改成了内嵌图片。后来发现有可能是浏览器缓存问题，不过改就改了，也就没再纠缠这个问题。 要注意的是，spark的BitmapImage是不支持外部图片的，必须要内嵌。所以如果要用外部图片，就必须用Halo组件中的Image。而由于TLF中的InlineGraphicElement又仅支持URL或者DisplayObject，而BitmapImage无法提供URL（本来嘛，是内嵌的撒）因此在我将外部图片转成内嵌后，原来的程序出了问题。原因是BitmapImage的source属性返回的是BitmapData对象，如果将其提供给InlineGraphicElement的source属性，就会报错。因此在提供图片信息的时候，必须要提供Bitmap才行。2010-10-07：正式版的InlineGraphicElement的source属性已经可以支持BitmapData对象了]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/810.htm" title="在Flex中实现聊天表情图片支持-实战篇"></a><p><span style="color: red;font-weight:bold;">2011年6月17日更新：</span>有网友说</p>
<blockquote><p>SDK4.5下编译报错 1119: 访问可能未定义的属性 textFlow (通过 static 类型 spark.core:IEditableText 引用)。 TextChat.mxml	/TextChat/src	第 94 行</p></blockquote>
<p>问题的原因，在于SDK4.5将TextInput和TextArea的外观部件textDisplay的类型从原来的RichEditableText改为了IEditableText，因此无法得到textFlow属性。这是为了适应Mobile设备。在Spark主题下，它是 RichEditableText，而在Mobile主题下，它是StyleableTextField。</p>
<p>我解决的办法是强制将IEditableText转换成RichEditableText（见TextChat.mxml第95,100行）。这在Spark主题下当然是没问题的，但这并非是最好的办法。现在的源码是可以正常在SDK4和SDK4.5下编译的，请重新下载。</p>
<p>另外，<strong>经常有网友问到下载的压缩包中是一个FXP文件，这个该如何处理</strong>。其实这个问题Google一下自然有答案，做Flex，居然不知道FXP是什么，而且随手Google也不愿意做，我就只能鄙视你一下了。为了避免大家的麻烦，新提供的源码中增加了编译好的swf方便大家看效果，同时也放弃了FXP格式。我现在采用的是<a href="http://zengrong.net/post/1307.htm">ANT+SDK编译</a>，所以不要问我怎么把项目导入Flash Builder。</p>
<p><span  style="color: red;font-weight:bold;">2010年10月7日更新：</span>很多网友反应在SDK4正式版中，即使修改了源码也用不了，于是就顺手改了一下。现在的源码基于SDK4.1正式版，删除了一些原来beta版的时候用来解决beta版bug的代码，并加入了切分字符串的功能。也就是说，如果先输入文字，然后将输入点置于文字中再插入图片，图片会自动将文字分开。唉——转眼间这个源码发布一年了，时间过得真快啊……<br />
顺便说一句：后来我又做了一个魔法表情功能，可以看<a href="http://demo.zengrong.net/freeroom/" target="blank">这里</a></p>
<p><span  style="color: red;font-weight:bold;">2009年10月29日更新：</span>今天发现，有几个问题，Flash Builder beta2自带的SDK已经解决了（下面标出了），看来beta确实是不能用于正式产品啊……</p>
<p><span  style="color: red;font-weight:bold;">2009年10月8日更新：</span><del datetime="2010-10-07T09:21:02+00:00">Flash Builder beta 2发布后，spark组件中有些类的名称修改了，比如TextFilter改为TextConverter，SimpleText改为Label，TextArea.textview.textFlow改为TextArea.textFlow……因此如果使用beta2，那么下面的源码可能不会编译通过，请自行修改。</del></p>
<hr />
我发布“<a href="http://www.zengrong.net/?p=721">在Flex中实现聊天表情图片支持-资料篇</a>”后，便有许多朋友找我要那个范例的源码。我在文章中就已提过那范例是从网上down来，并非我所做，自然没有源码。要源码，用X思，你懂的……</p>
<h1>那好吧，源码来了。</h1>
<p><span id="more-810"></span><br />
例子很简单，所有的代码加起来都不到400行，但做的时候却很痛苦。因为要了解spark组件和FXG的特点，还要了解新的skin的做法。不过总算做好了，总结一下，纠结的地方主要有下面几点：</p>
<ol>
<li><strong>采用内嵌表情还是采用外部表情图片。</strong><br />
为了获得更小的文件（Flex4比Flex3编译的文件大了200多K），一直是采用外部表情图片的。在本机调试都正常。但上传到网上后，就无法显示图片。调整了swf的base属性之后，图片可以在输入框和文字框中显示，就是不能显示在图片选择面板中。最后一气之下改成了内嵌图片。后来发现有可能是浏览器缓存问题，不过改就改了，也就没再纠缠这个问题。<br />
要注意的是，spark的BitmapImage是不支持外部图片的，必须要内嵌。所以如果要用外部图片，就必须用Halo组件中的Image。而由于TLF中的InlineGraphicElement又仅支持URL或者DisplayObject，而BitmapImage无法提供URL（本来嘛，是内嵌的撒）因此在我将外部图片转成内嵌后，原来的程序出了问题。原因是BitmapImage的source属性返回的是BitmapData对象，如果将其提供给InlineGraphicElement的source属性，就会报错。<del datetime="2010-10-07T13:09:00+00:00">因此在提供图片信息的时候，必须要提供Bitmap才行。</del>2010-10-07：正式版的InlineGraphicElement的source属性已经可以支持BitmapData对象了</li>
<li><<del datetime="2010-10-07T13:09:00+00:00"><strong>图片插入到TextInput之后不更新。</strong><br />
检查发现，InlineGraphicElement已经作为textFlow的元素存在了，但是在TextInput中却不显示出来，但如果再输入一些文字的话，图像又可以显示出来。因此判断是textFlow更新后没有执行flowComposer.updateAllControllers。把这个操作放在StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGED事件后就行了。</del>2010-10-07正式版中已经支持自动更新了。</li>
<li><del datetime="2010-10-07T13:09:00+00:00"><strong>Flex4 spark中的TextInpu焦点定位的怪问题。</strong><br />
在发送输入框文字之后，再将文字清空，如果使用按钮来发送文字，则清空过后还能重新定位回输入框继续输入文字；而如果使用TextInput的enter事件来完成这个动作，则清空后返回虽然能重新定位输入框，并显示闪烁的输入光标，但无论如何也无法输入文字了，必须重新单击一次输入框，才能再次输入。后来用一个变通的方法解决了。就是在为输入框重新设置焦点之前，先将焦点移到按钮上，再移回来…… 很无语</del>Flash Builder beta2自带的SDK（以及后面的SDK）已经解决了这个问题</li>
<li><del datetime="2010-10-07T13:09:00+00:00"><strong>flowComposer自动清空为null的问题。</strong><br />
flowComposer偶尔会自动清空，造成flowComposer.compose()或者flowComposer.updateAllControllers()失效，后来发现在界面大小变更的时候以及通过text=&#8221;设置文字清空的时候，flowComposer都可能会清空为null。而只需要重新将ti或者ta设置焦点就可以填充flowComposer的值。</del>Flash Builder beta2自带的SDK（以及后面的的SDK）已经解决了这个问题</li>
<li><strong>滚动条不更新的问题。</strong><br />
输入的文字超过一屏之后，TextArea会自动出现滚动条。在Halo组件中，我是通过valueCommit事件来更新滚动条，但在spark中没有。不仅valueCommit没用，change等统统没用。后来改为用updateComplete来更新滚动条。其实，如果用textFlow的事件来更新，应该更加保险。<br />
另外，spark的scroller组件也是蛮纠结的，在Halo中用ta.verticalScrollPosition = ta.maxVerticalScrollPosition就可以了，可spark又整了个viewport出来。这不，更新语句又要改成ta.scroller.viewport.verticalScrollPosition=ta.scroller.viewport.contentHeight。</li>
<li>还有几个麻烦的事情，比如ParagraphElement要进行深复制才能用，比如format和hostFormat……算了，不说了，直接看效果好了 :em50:</li>
</ol>
Note: There is a file embedded within this post, please visit this post to download the file.<br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_TextChat_1619235969"
			class="flashmovie"
			width="400"
			height="500">
	<param name="movie" value="/wp-content/uploads/2009/09/TextChat.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="/wp-content/uploads/2009/09/TextChat.swf"
			name="fm_TextChat_1619235969"
			width="400"
			height="500">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/810.htm/feed</wfw:commentRss>
		<slash:comments>71</slash:comments>
		</item>
		<item>
		<title>在Flex中实现聊天表情图片支持-资料篇</title>
		<link>http://zengrong.net/post/721.htm</link>
		<comments>http://zengrong.net/post/721.htm#comments</comments>
		<pubDate>Mon, 10 Aug 2009 10:03:03 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[FTE]]></category>
		<category><![CDATA[TLF]]></category>

		<guid isPermaLink="false">http://www.zengrong.net/?p=721</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/721.htm" title="在Flex中实现聊天表情图片支持-资料篇"></a>2011年8月24日09:44:35 更新：重新找到了基于riaidea的TextField的图文混排组件源码，见作者博客 这个组件在对文本进行滚动的时候占用CPU较大，我在30行文本+少量表情滚动的时候，CPU瞬间可达30%以上（AMD羿龙II三核），因此在性能较差的机器上可能感觉滚动会卡。综合目前Flash Player 10的市占率90%以上来考虑，应该使用TLF来开发聊天表情支持功能（其实TLF大量文本滚动也会卡的，但比这个要好些）。见在Flex中实现聊天表情图片支持-实战篇。 2009年10月9日11:09:14 更新：增加riaidea的范例，（riaidea的作者自行关闭了googlecode上的开源项目，因此riaidea的源码不能下载了，我也没有源码） 2009年9月16日20:34:30 更新：在Flex中实现聊天表情图片支持-实战篇 2009年8月21日09:36:19 更新：Flash Text Engine、Text Layout Framework在Flex、Flash中的实现） 仔细研究了一下Flex支持表情图片，主要有下面三种方法： 使用TextArea，或直接使用TextField的html支持功能，在html中使用&#60;img&#62;标签嵌入表情图片文件。但这样做有两个问题，一是图片文件载入较慢；二是不容易控制载入的图片在文本中的“流向”。虽然可以使用getImageReference获取对图片的引用，但处理起来也比较费力。 将文本中需要插入图像的地方留出空白空间，获取空白空间的位置，并使用图像替代。这种方法的缺点在于每次更新文字内容的时候，所有的图片都要重排位置，对性能有一定影响，尤其是文本和图像比较多的情况下。 使用Flash Player 10提供的flash.text.engine（简称FTE）提供的高级功能进行处理，具体是使用GraphicElement类，这无疑是更好的方法。Adobe提供的Text Layout Framework（简称TLF）就是架设FTE的基础之上的。 下面是一些我搜集的资料，为后面的实战做个记录： How to use Text Layout Framework in Flex 3.2 or AIR 1.5 How to add a &#8230;<p class="read-more"><a href="http://zengrong.net/post/721.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/721.htm" title="在Flex中实现聊天表情图片支持-资料篇"></a><p><span style="color: red;">2011年8月24日09:44:35 更新：</span>重新找到了基于riaidea的TextField的图文混排组件源码，见<a href="http://www.riaidea.com/blog/archives/295.html" title="FP9下的图文混编组件RichTextField 2.0" target="_blank">作者博客</a></p>
<p><strong>这个组件在对文本进行滚动的时候占用CPU较大</strong>，我在30行文本+少量表情滚动的时候，CPU瞬间可达30%以上（AMD羿龙II三核），因此在性能较差的机器上可能感觉滚动会卡。综合目前Flash Player 10的市占率90%以上来考虑，应该使用TLF来开发聊天表情支持功能<strong>（其实TLF大量文本滚动也会卡的，但比这个要好些）</strong>。见<a href="/?p=810">在Flex中实现聊天表情图片支持-实战篇</a>。</p>
<p><span style="color: red;">2009年10月9日11:09:14 更新：</span>增加riaidea的范例<del datetime="2011-08-24T01:35:09+00:00">，（<strong>riaidea的作者自行关闭了googlecode上的开源项目，因此riaidea的源码不能下载了，我也没有源码</strong>）</del></p>
<p><span style="color: red;">2009年9月16日20:34:30 更新：</span><a href="/?p=810">在Flex中实现聊天表情图片支持-实战篇</a></p>
<p><span style="color: red;">2009年8月21日09:36:19 更新：</span><a href="http://zengrong.net/post/770.htm" target="_blank">Flash Text Engine、Text Layout Framework在Flex、Flash中的实现</a></strong>）</p>
<hr />仔细研究了一下Flex支持表情图片，主要有下面三种方法：</p>
<ol>
<li>使用TextArea，或直接使用TextField的html支持功能，在html中使用&lt;img&gt;标签嵌入表情图片文件。但这样做有两个问题，一是图片文件载入较慢；二是不容易控制载入的图片在文本中的“流向”。虽然可以使用<a href="http://livedocs.adobe.com/flex/3_cn/langref/flash/text/TextField.html#getImageReference%28%29" target="_blank">getImageReference</a>获取对图片的引用，但处理起来也比较费力。</li>
<li>将文本中需要插入图像的地方留出空白空间，获取空白空间的位置，并使用图像替代。这种方法的缺点在于每次更新文字内容的时候，所有的图片都要重排位置，对性能有一定影响，尤其是文本和图像比较多的情况下。</li>
<li>使用Flash Player 10提供的<a href="http://livedocs.adobe.com/flex/3_cn/langref/flash/text/engine/package-detail.html" target="_blank">flash.text.engine</a>（简称FTE）提供的高级功能进行处理，具体是使用<a href="http://livedocs.adobe.com/flex/3_cn/langref/flash/text/engine/GraphicElement.html" target="_blank">GraphicElement</a>类，这无疑是更好的方法。Adobe提供的<a href="http://labs.adobe.com/technologies/textlayout/" target="_blank">Text Layout Framework</a>（简称TLF）就是架设FTE的基础之上的。</li>
</ol>
<p>下面是一些我搜集的资料，为后面的实战做个记录：<br />
<span id="more-721"></span></p>
<ul>
<li><a href="http://corlan.org/2009/01/19/how-to-use-text-layout-framework-in-flex-32-or-air-15/" target="_blank">How to use Text Layout Framework in Flex 3.2 or AIR 1.5</a></li>
<li><a href="http://corlan.org/2009/02/12/how-to-add-a-scrollbar-to-text-layout-framework/" target="_blank">How to add a scrollbar to Text Layout Framework</a></li>
<li><a href="http://www.insideria.com/2009/06/utilizing-flash-text-layout-fr.html" target="_blank">Utilizing Flash Text Layout Framework using MXML</a></li>
<li><a href="http://www.51toria.cn/?p=151" target="_blank">Flex 用AS3GIF类播放gif动画</a></li>
<li><a href="http://opensource.adobe.com/wiki/display/flexsdk/Spark+Text+Primitives" target="_blank">Spark Text Primitives &#8211; Functional and Design Specification</a></li>
</ul>
<p>下面这个范例是我在网上找到的，使用的应该是第2种方法。<br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_smilies_demo_140824791"
			class="flashmovie"
			width="600"
			height="400">
	<param name="movie" value="/wp-content/uploads/2009/08/smilies_demo.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="/wp-content/uploads/2009/08/smilies_demo.swf"
			name="fm_smilies_demo_140824791"
			width="600"
			height="400">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p><span style="color: red;">（2009年10月9日11:16:10更新）</span>再加一个范例：<br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_RichTextFieldTest_954413751"
			class="flashmovie"
			width="496"
			height="433">
	<param name="movie" value="/wp-content/uploads/2009/08/RichTextFieldTest.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="/wp-content/uploads/2009/08/RichTextFieldTest.swf"
			name="fm_RichTextFieldTest_954413751"
			width="496"
			height="433">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/721.htm/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>在关闭AIR程序窗口前显示Alert</title>
		<link>http://zengrong.net/post/631.htm</link>
		<comments>http://zengrong.net/post/631.htm#comments</comments>
		<pubDate>Sat, 28 Feb 2009 17:04:15 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.zengrong.net/?p=631</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/631.htm" title="在关闭AIR程序窗口前显示Alert"></a>?Download AIRClose.mxml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 &#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62; &#60;mx:WindowedApplication xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; layout=&#34;vertical&#34; showStatusBar=&#34;false&#34; closing=&#34;closeHandler(event)&#34;&#62; &#60;mx:Script&#62; &#60;![CDATA[ import org.zengrong.utils.Dialog; private function closeHandler(evt:Event):void { trace(evt.toString()); &#8230;<p class="read-more"><a href="http://zengrong.net/post/631.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/631.htm" title="在关闭AIR程序窗口前显示Alert"></a>
<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=631&amp;download=AIRClose.mxml">AIRClose.mxml</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p63111"><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
</pre></td><td class="code" id="p631code11"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mx:WindowedApplication</span> <span style="color: #000066;">xmlns:mx</span>=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> </span>
<span style="color: #009900;">						<span style="color: #000066;">layout</span>=<span style="color: #ff0000;">&quot;vertical&quot;</span> <span style="color: #000066;">showStatusBar</span>=<span style="color: #ff0000;">&quot;false&quot;</span></span>
<span style="color: #009900;">						<span style="color: #000066;">closing</span>=<span style="color: #ff0000;">&quot;closeHandler(event)&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mx:Script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #339933;">&lt;![CDATA[</span>
<span style="color: #339933;">			import org.zengrong.utils.Dialog;</span>
<span style="color: #339933;">			private function closeHandler(evt:Event):void</span>
<span style="color: #339933;">			{</span>
<span style="color: #339933;">				trace(evt.toString());</span>
<span style="color: #339933;">				evt.preventDefault();</span>
<span style="color: #339933;">				Dialog.confirm('确定退出？', _close);</span>
<span style="color: #339933;">			}</span>
&nbsp;
<span style="color: #339933;">			private function _close($yes:Boolean):void</span>
<span style="color: #339933;">			{</span>
<span style="color: #339933;">				if($yes) this.nativeApplication.exit();</span>
<span style="color: #339933;">			}</span>
&nbsp;
<span style="color: #339933;">		]]&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mx:Script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>	
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mx:WindowedApplication<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><span id="more-631"></span><br />
有关Dialog的用法与最新源码，详见<a href="http://code.google.com/p/zrong/" target="_blank">zrong&#8217;s Class</a>（下附源码）</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=631&amp;download=Dialog.as">Dialog.as</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p63112"><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="p631code12"><pre class="actionscript" style="font-family:monospace;">package org.<span style="color: #006600;">zengrong</span>.<span style="color: #006600;">utils</span>
<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: #0066CC;">import</span> mx.<span style="color: #006600;">controls</span>.<span style="color: #006600;">Alert</span>;
	<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">core</span>.<span style="color: #006600;">Application</span>;
	<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">events</span>.<span style="color: #006600;">CloseEvent</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Dialog
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">function</span> alert<span style="color: #66cc66;">&#40;</span>$info:<span style="color: #0066CC;">String</span>, $title:<span style="color: #0066CC;">String</span>=<span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span>$info, $title, <span style="color: #cc66cc;">4</span>, Application.<span style="color: #006600;">application</span> as Sprite<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;">/**
		* 弹出confirm确认对话框，根据用户的交互返回是否确认布尔值
		* @param $s	要显示的信息
		* @param $closeFun 关闭确认对话框时调用的函数
		*/</span>
		<span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> <span style="color: #000000; font-weight: bold;">function</span> confirm<span style="color: #66cc66;">&#40;</span>$s:<span style="color: #0066CC;">String</span>, $closeFun:<span style="color: #000000; font-weight: bold;">Function</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">var</span> __fun:<span style="color: #000000; font-weight: bold;">Function</span> = <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>evt:CloseEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
			<span style="color: #66cc66;">&#123;</span>
				$closeFun<span style="color: #66cc66;">&#40;</span>evt.<span style="color: #006600;">detail</span> == Alert.<span style="color: #006600;">YES</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
			Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span>$s, <span style="color: #ff0000;">''</span>, Alert.<span style="color: #006600;">YES</span><span style="color: #66cc66;">|</span>Alert.<span style="color: #006600;">NO</span>, Application.<span style="color: #006600;">application</span> as Sprite, __fun<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/631.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flash Player 10中关于TextField的textInput与change事件行为的改变</title>
		<link>http://zengrong.net/post/557.htm</link>
		<comments>http://zengrong.net/post/557.htm#comments</comments>
		<pubDate>Tue, 07 Oct 2008 08:51:14 +0000</pubDate>
		<dc:creator>zrong</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[FlashPlayer]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.zengrong.net/?p=557</guid>
		<description><![CDATA[<a href="http://zengrong.net/post/557.htm" title="Flash Player 10中关于TextField的textInput与change事件行为的改变"></a>偶尔发现原来写的打字测试有问题了，仔细研究了一下，发现是FlashPlayer的原因。 打字游戏中，对文字输入正确与否的判断，我采用的是TextField的textInput事件和change事件。问题就出在这里：将FlashPlayer升级到10以后，这两个事件的行为发生了改变。 在FlashPlaye r10以前，如果在TextField中输入整句的文字，文字有多少个，textInput事件和change事件就会发生多少次。而对于FlashPlayer来说，则是不论文字有多少个，只要是一次输入的，就只会发生一次。这种情况对于英文来说倒是无所谓，但对于中文来讲，由于常用的是词语输入，就会有很大影响。看下面的代码： ?Download type.mxml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 &#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62; &#60;mx:Application xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; layout=&#34;absolute&#34;&#62; &#60;mx:TextArea textInput=&#34;textInput(event)&#34; change=&#34;change(event)&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&#62; &#60;mx:Script&#62; &#60;![CDATA[ private function textInput(evt:TextEvent):void { trace(evt.text, &#8230;<p class="read-more"><a href="http://zengrong.net/post/557.htm">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://zengrong.net/post/557.htm" title="Flash Player 10中关于TextField的textInput与change事件行为的改变"></a><p>偶尔发现原来写的打字测试有问题了，仔细研究了一下，发现是FlashPlayer的原因。</p>
<p>打字游戏中，对文字输入正确与否的判断，我采用的是TextField的textInput事件和change事件。问题就出在这里：将FlashPlayer升级到10以后，这两个事件的行为发生了改变。</p>
<p>在FlashPlaye r10以前，如果在TextField中输入整句的文字，文字有多少个，textInput事件和change事件就会发生多少次。而对于FlashPlayer来说，则是不论文字有多少个，只要是一次输入的，就只会发生一次。这种情况对于英文来说倒是无所谓，但对于中文来讲，由于常用的是词语输入，就会有很大影响。看下面的代码：<br />
<span id="more-557"></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="left2">Download <a href="http://zengrong.net/wp-content/plugins/wp-codebox/wp-codebox.php?p=557&amp;download=type.mxml">type.mxml</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p55714"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p557code14"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mx:Application</span> <span style="color: #000066;">xmlns:mx</span>=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> <span style="color: #000066;">layout</span>=<span style="color: #ff0000;">&quot;absolute&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mx:TextArea</span> <span style="color: #000066;">textInput</span>=<span style="color: #ff0000;">&quot;textInput(event)&quot;</span> <span style="color: #000066;">change</span>=<span style="color: #ff0000;">&quot;change(event)&quot;</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;100%&quot;</span> <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;100%&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mx:Script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #339933;">&lt;![CDATA[</span>
<span style="color: #339933;">			private function textInput(evt:TextEvent):void</span>
<span style="color: #339933;">			{</span>
<span style="color: #339933;">				trace(evt.text, evt.target.length);</span>
<span style="color: #339933;">			}</span>
&nbsp;
<span style="color: #339933;">			private function change(evt:Event):void</span>
<span style="color: #339933;">			{</span>
<span style="color: #339933;">				trace(evt.target.text, evt.target.length);</span>
<span style="color: #339933;">			}</span>
<span style="color: #339933;">		]]&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mx:Script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mx:Application<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>以输入“白日依山尽”（整句输入）为例，在FlashPlayer 9中，trace的信息如下：</p>
<blockquote><p>白 0<br />
白 1<br />
日 1<br />
白日 2<br />
依 2<br />
白日依 3<br />
山 3<br />
白日依山 4<br />
尽 4<br />
白日依山尽 5</p></blockquote>
<p>在FlashPlayer 10中，trace的信息如下：</p>
<blockquote><p>白日依山尽 0<br />
白日依山尽 5</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://zengrong.net/post/557.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

