﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-twzheng's cppblog-文章分类-Flash ActionScript</title><link>http://www.cppblog.com/twzheng/category/4793.html</link><description>『站在风口浪尖紧握住鼠标旋转！』</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 14:03:40 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 14:03:40 GMT</pubDate><ttl>60</ttl><item><title>Flash中的颜色矩阵（ColorMatrixFilter）</title><link>http://www.cppblog.com/twzheng/articles/35510.html</link><dc:creator>爱在江城</dc:creator><author>爱在江城</author><pubDate>Tue, 30 Oct 2007 04:39:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/35510.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/35510.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/35510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/35510.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/35510.html</trackback:ping><description><![CDATA[<span class=bold><strong style="FONT-SIZE: 18pt">Flash中的颜色矩阵（ColorMatrixFilter）</strong></span><br>[摘自] <a href="http://www.webjx.com/" target=_blank>http://www.webjx.com</a><br>
<div style="FONT-SIZE: 12px">
<div>
<p><strong>颜色矩阵</strong></p>
<p>在flash中可以用矩阵方便的操作颜色。在flash8以前的版本，操作颜色的唯一途径就是通过修改颜色对象中红，绿，蓝三个通道的值，在Flash8，"颜色矩阵滤镜" ColorMatrixFilter (flash.filters.ColorMatrixFilter) 在颗粒等级上提供给你更好的控制方法。"颜色矩阵滤镜"为 4行5列的多维矩阵(20个元素的数组)。图 4 是 与"颜色矩阵滤镜"等同的矩阵。</p>
<p align=center><img alt=Flash中的颜色矩阵 src="http://www.webjx.com/upfiles/20060731/20060731013724_01.gif"><br><strong>图4.</strong> 与"颜色矩阵滤镜"等同的矩阵</p>
<p>红，绿，蓝通道的值由如下所示计算方法所决定：</p>
<p>CODE:</p>
<p><span class=code><font color=#000000>redResult = a[0] * srcR + a[1] * srcG + a[2] * srcB + a[3] * srcA + a[4]<br>greenResult = a[5] * srcR + a[6] * srcG + a[7] * srcB + a[8] * srcA + a[9]<br>blueResult = a[10] * srcR + a[11] * srcG + a[12] * srcB + a[13] * srcA + a[14]<br>alphaResult = a[15] * srcR + a[16] * srcG + a[17] * srcB + a[18] * srcA + a[19]</font></span></p>
<p>可以看出，第一行的值决定了红色值，第二行决定绿色，第三行蓝色，第四行是透明(Alpha)通道值。同样可以看出首四栏值是与红，绿，蓝，alpha通道值的乘积，而第五栏的值分别是和(偏移量)。注意每行的源值和结果值都是在0到255的区间内。因此即使各个通道的值小于0或大于255都会被强制到该区间内。我来举些例子说明它的原理。</p>
<p>果你想在红色通道加100(偏移量),将a[4]设置为100，如（图5） 。</p>
<p align=center><img alt=Flash中的颜色矩阵 src="http://www.webjx.com/upfiles/20060731/20060731013732_02.gif"><br><strong>图5.</strong> 红色值增加100</p>
<p>如果想使绿色通道加倍，将a[6]设为2,如（图6） </p>
<p align=center><img alt=Flash中的颜色矩阵 src="http://www.webjx.com/upfiles/20060731/20060731013740_03.gif"><br><strong>图6.</strong> 绿色加倍</p>
<p>如果你要使结果图像中的蓝色与原图的红色数量相等，将a[10]设为1， a[12]设为0 ，如（图7）</p>
<p align=center><img alt=Flash中的颜色矩阵 src="http://www.webjx.com/upfiles/20060731/20060731013748_04.gif"><br><strong>图7.</strong> 红色决定蓝色值</p>
<p>改变图像的<nobr><strong class=kgb style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: 0px; CURSOR: hand; COLOR: #8000ff; PADDING-TOP: 0px; BORDER-BOTTOM: 0px; TEXT-DECORATION: underline">亮度</strong></nobr>，你需要在每个颜色通道的值改变同样的数量。最简单的途径是在每个通道都设置相同的偏移量。偏移量为正时可以增加亮度为负时可以减小亮度。（图8） 是一个增加亮度的例子。 </p>
<p align=center><img alt=Flash中的颜色矩阵 src="http://www.webjx.com/upfiles/20060731/20060731013758_05.gif"><br><strong>图8.</strong> 增加亮度</p>
<p>你也可以通过将每个颜色通道与一个值相乘按比例的改变亮度，大于1的增加亮度小于1减小亮度。<br>按照原理，将图像转换为灰度图，你需要将每个通道的部分设为等值。因为有三个通道，你可以将每个通道乘以0.33并将它们相加得到结果值。如（图9）</p>
<p align=center><img alt=Flash中的颜色矩阵 src="http://www.webjx.com/upfiles/20060731/20060731013716_06.gif"><br><strong>图9.</strong>灰度图矩阵</p>
<p>由于不同颜色通道的相对屏幕发光度，但是 确实有特殊的提供更加真实的灰度图的"亮度系数"值 。例如在PS里创建一个纯绿色块然后把它放在一个纯蓝色块 ，然后将图像灰度化，你会看到原来绿色的地方的灰色会比原来蓝色的区域要亮。 </p>
<p>在Flash里使用这些矩阵，创建一个"颜色矩阵滤镜"的实例然后将它加入到一个影片剪辑(MovieClip)实例上。下面是一个使绿色加倍的例子：</p>
<p><strong>CODE:<br></strong><span class=code><font color=#000000>import flash.filters.ColorMatrixFilter;<br>var mat:Array = [ 1,0,0,0,0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,2,0,0,0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,0,1,0,0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,0,0,1,0 ];<br>var colorMat:ColorMatrixFilter = new ColorMatrixFilter(mat);<br>clip.filters = [colorMat];</font></span></p>
<p>"颜色矩阵滤镜"与一个已知的矩阵使用，你可以完成除了亮度和灰度之外复杂的颜色调整。调整对比度，饱和度和色相在 Flash 8种都成为了肯能。虽然在这里讨论这些话题与这篇文章有些远，但是足以说 Flash 8提供了一个以前任何版本都不能做到的颜色操作途径。</p>
<p>下面的flash可以看到在操作图像时结果矩阵是怎么改变的! <br><strong>Flash:</strong><br><a href="http://www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf"></a><span style="COLOR: #0000ff"><a href="http://www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf" target=_blank><span style="COLOR: #0000ff">http://</span><font color=#800080><span style="COLOR: #0000ff">www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf</span> </font></a></span></p>
</div>
</div>
<img src ="http://www.cppblog.com/twzheng/aggbug/35510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">爱在江城</a> 2007-10-30 12:39 <a href="http://www.cppblog.com/twzheng/articles/35510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RTMP协议概述</title><link>http://www.cppblog.com/twzheng/articles/35247.html</link><dc:creator>爱在江城</dc:creator><author>爱在江城</author><pubDate>Fri, 26 Oct 2007 08:55:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/35247.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/35247.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/35247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/35247.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/35247.html</trackback:ping><description><![CDATA[<p><strong><span class=bold>RTMP协议概述</span><br></strong><br><strong>介绍:</strong><br><br>RTMP协议是被Flash用于对象,视频,音频的传输.该协议建立在TCP协议或者轮询HTTP协议之上.<br>RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是FLV中的视/音频数据.<br>一个单一的连接可以通过不同的通道传输多路网络流.这些通道中的包都是按照固定大小的包传输的.<br><br><strong>网络连接(Connection)</strong><br><br>一个Actionscript连接并播放一个流的简单代码:<br><br></p>
<div class=msgheader>
<div class=right><a class=smalltxt href="http://www.openred5.com/bbs/viewthread.php?tid=188&amp;extra=page%3D1###"><font color=#800080><u>[Copy to clipboard]</u></font></a></div>
CODE:</div>
<div class=msgborder>var videoInstance:Video = your_video_instance;<br>var nc:NetConnection = new NetConnection();<br>var connected:Boolean = nc.connect("rtmp:/localhost/myapp");<br>var ns:NetStream = new NetStream(nc);<br>videoInstance.attachVideo(ns);<br>ns.play("flvName");</div>
<p><br>默认端口为1935<br><br><strong>握手</strong><br><br>Client &#8594; Server :向服务器发出握手请求.这不属于协议包一部分,该握手请求第一个字节为(0&#215;03),其后跟着1536个字节.经管看上去这部分的内容对于RTMP协议来说并不是至关重要的,但也不可随意对待.<br>Server &#8594; Client :服务器向客户端回应握手请求.这部分的数据仍然不属于RTMP协议的部分.该回应的其实字节仍然为(0x03),但是后边跟着个长度为1536个字节 (一共为3072 )的包块.第一个1536块看上去似乎可以是任意内容,甚至好像可以是Null都没有关系.第二个1536的代码块,是上一步客户端向服务器端发送的握手 请求的内容.<br>Client&#8594;Server:把上一步服务器向客户端回应的第二块1536个字节的数据块.<br><br>至此客户端与服务器端的握手结束,下面将发送RTMP协议的包内容.<br><br>Client &#8594; Server :向服务器发送连接包.<br>Server &#8594; Client :服务器回应.<br>... .... 等等... ...<br><br><strong>RTMP 数据类型<br><br></strong>
<table class=t_table align=center>
    <tbody>
        <tr>
            <td>0&#215;01 </td>
            <td>Chunk Size </td>
            <td>changes the chunk size for packets </td>
        </tr>
        <tr>
            <td>0&#215;02 </td>
            <td>Unknown </td>
            <td>anyone know this one? </td>
        </tr>
        <tr>
            <td>0&#215;03 </td>
            <td>Bytes Read </td>
            <td>send every x bytes read by both sides </td>
        </tr>
        <tr>
            <td>0&#215;04 </td>
            <td>Ping </td>
            <td>ping is a stream control message, has subtypes </td>
        </tr>
        <tr>
            <td>0&#215;05 </td>
            <td>Server BW </td>
            <td>the servers downstream bw </td>
        </tr>
        <tr>
            <td>0&#215;06 </td>
            <td>Client BW </td>
            <td>the clients upstream bw </td>
        </tr>
        <tr>
            <td>0&#215;07 </td>
            <td>Unknown </td>
            <td>anyone know this one? </td>
        </tr>
        <tr>
            <td>0&#215;08 </td>
            <td>Audio Data </td>
            <td>packet containing audio </td>
        </tr>
        <tr>
            <td>0&#215;09 </td>
            <td>Video Data </td>
            <td>packet containing video data </td>
        </tr>
        <tr>
            <td>0x0A - 0&#215;11 </td>
            <td>Unknown </td>
            <td>anyone know? </td>
        </tr>
        <tr>
            <td>0&#215;12 </td>
            <td>Notify </td>
            <td>an invoke which does not expect a reply </td>
        </tr>
        <tr>
            <td>0&#215;13 </td>
            <td>Shared Object </td>
            <td>has subtypes </td>
        </tr>
        <tr>
            <td>0&#215;14 </td>
            <td>Invoke </td>
            <td>like remoting call, used for stream actions too.</td>
        </tr>
    </tbody>
</table>
<strong><br>Shared Object 数据类型<br><br></strong>
<table class=t_table style="WIDTH: 538px; HEIGHT: 276px" align=center>
    <tbody>
        <tr>
            <td>0&#215;01 </td>
            <td>Connect </td>
        </tr>
        <tr>
            <td>0&#215;02 </td>
            <td>Disconnect </td>
        </tr>
        <tr>
            <td>0&#215;03 </td>
            <td>Set Attribute </td>
        </tr>
        <tr>
            <td>0&#215;04 </td>
            <td>Update Data </td>
        </tr>
        <tr>
            <td>0&#215;05 </td>
            <td>Update Attribute </td>
        </tr>
        <tr>
            <td>0&#215;06 </td>
            <td>Send Message </td>
        </tr>
        <tr>
            <td>0&#215;07 </td>
            <td>Status </td>
        </tr>
        <tr>
            <td>0&#215;08 </td>
            <td>Clear Data </td>
        </tr>
        <tr>
            <td>0&#215;09 </td>
            <td>Delete Data </td>
        </tr>
        <tr>
            <td>0x0A </td>
            <td>Delete Attribute </td>
        </tr>
        <tr>
            <td>0x0B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></td>
            <td>Initial Data</td>
        </tr>
    </tbody>
</table>
<strong><br>RTMP包结构<br><br></strong>RTMP包 包含一个固定长度的包头和一个最长为128字节的包体.包头可以是下面4种长度的任意一种:12, 8, 4, or 1 byte(s).<br>第一个字节的前两个Bit很重要,它决定了包头的长度.它可以用掩码0xC0进行"与"计算.下面的表格罗列了可能的包头长度:
<table class=t_table style="WIDTH: 540px; HEIGHT: 126px" align=center>
    <tbody>
        <tr>
            <td>Bits </td>
            <td>Header Length </td>
        </tr>
        <tr>
            <td>00 </td>
            <td>12 bytes </td>
        </tr>
        <tr>
            <td>01 </td>
            <td>8 bytes </td>
        </tr>
        <tr>
            <td>10 </td>
            <td>4 bytes </td>
        </tr>
        <tr>
            <td>11 </td>
            <td>1 byte</td>
        </tr>
    </tbody>
</table>
我们在这里讨论关RTMP包结构的问题并不是非常的详细.我们在以后有时间会讨论关于AMF的问题(敬请期待...),其实RTMP包结构就是使用了AMF格式.<br><br><strong>流</strong><br><br>关于流的操作我们需要进一步研究,在论坛中的<a href="http://www.openred5.com/bbs/viewthread.php?tid=175&amp;extra=page%3D1" target=_blank><u><font color=#810081>http://www.openred5.com/bbs/viewthread.php?tid=175&amp;extra=page%3D1</font></u></a>这篇文章研究的还是不错的,大家可以参考.不过下面可以列一个关于客户端向服务器端发送流的流程:<br><br>Client&#8594;Server :发送一个创建流的请求.<br>Server&#8594;Client :返回一个表示流的索引号.<br>Client&#8594;Server :开始发送.<br>Client&#8594;Server :发送视音频数据包(这些包在同一个频道(channel)并用流的索引号来唯一标识). <br><br>转自http://hi.baidu.com/needspeedboy/blog/item/c95689c4c5e0faab8226ac9c.html<br><span class=bold></span></p>
<img src ="http://www.cppblog.com/twzheng/aggbug/35247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">爱在江城</a> 2007-10-26 16:55 <a href="http://www.cppblog.com/twzheng/articles/35247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AS3加载机制</title><link>http://www.cppblog.com/twzheng/articles/35104.html</link><dc:creator>爱在江城</dc:creator><author>爱在江城</author><pubDate>Wed, 24 Oct 2007 16:36:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/35104.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/35104.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/35104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/35104.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/35104.html</trackback:ping><description><![CDATA[<div class=cnt>
<div class=t_msgfont>转载：<a href="http://space.flash8.net/bbs/thread-339422-1-1.html" target=_blank><u><font color=#0000ff>闪吧</font></u></a></div>
<div class=t_msgfont>摸了好一阵子,才弄明白AS3.0的加载机制.<br>还是坚持自己的原则,从适用的角度做记录!下面分别讲述AS3各加载事件与类!<br><strong>一: Loader类</strong><br>在AS3.0里把所有事件,属性,加载等都集中在某个对象上了.且加载对象与各触发事件也进行了分工,这和2.0时期,用onEnterFrame和不断检测加载百分比强多了!<br>Loader继承了基类DisplayObjectContainer,所以他可以也必须当作一个对象用addChild添加才能工作.<br>Loader 类可用于加载 SWF 文件或图像（JPG、PNG 或 静态GIF）文件。 使用 load() 方法来启动加载。 被加载的显示对象将作为 Loader 对象的子级添加。<br>例:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var loadimg: Loader = new Loader();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var url:String = "http://www.shch8.com/v2007/up/UploadFile/200769182617-1.gif"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var urlReq:URLRequest = new URLRequest();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; urlReq.url=url;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadimg.load(urlReq);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addChild(loadimg);<br>和2.0和比,还有一点区别,这里加载时要先把字符串地址转化为url加载对象,在程序中的第三行是直接设置加载对象的url属性的,也可以这样写urlReq = new URLRequest(url),除了url属性还有几个公共属性，一般很少用到如：method用来控制get还是post提交方式。<br>因为把加载当作一个对象了,所以就不需要象2.0时期一样,新建一个影片来装载加对的物体loadMovie(&#8220;myimg.jpg&#8221;,&#8221;mv&#8221;)，我们可以直接设置他的x/y轴或宽高。还有Loader对象是二进制方式加载swf了，在flash9之前我们做加载条是用影片的getBytesLoaded和getBytesTotal来检测的是否加载完成。这不是真正意义上的加载，只是判断帧的加载数，所以会出现类似情况，加载到20%停了很久突然跳到90%因为那一帧放了整个影片70%的数据。以前在蓝色里有讨论过这个话题，还有人说是MM在走江湖！呵，现在解决了！<br>Loader的所有方法：<br>1. Loader()<br>创建一个可用于加载文件（如 SWF、JPEG、GIF 或 PNG 文件）的 Loader 对象。<br>2. close(): void <br>取消当前正在对 Loader 实例执行的 load() 方法操作。<br>3.load(request: URLRequest, context: LoaderContext = null):void <br>将 SWF、JPEG、渐进式 JPEG、非动画 GIF 或 PNG 文件加载到此 Loader 对象的子对象中。<br>4.loadBytes(bytes:ByteArray, context: LoaderContext = null):void <br>从 ByteArray 对象中所存储的二进制数据中加载。<br>5.unload():void <br>删除此 Loader 对象中使用 load() 方法加载的子项。<br><strong>二: LoaderInfo事件机制</strong><br>LoaderInfo非常好用，他是继承EventDispatcher对象用来检测网络加载状态。可以把加载动作细细地解剖出来。<br>原来在flash9之前，我们绞尽脑汁去获取加载来的swf的宽度、高度、帧频、版本等数据，但一直没研究出好的方法现在LoaderInfo可以做到能获取加载对象的各属性，这点很好有时用swf来加载不确定swf时很有用，可以用那些属性来重新设置主swf。<br>加载对象所加载数据的实时检测上，PROGRESS事件可以取代以前用onEnterFrame的疯狂检测工作。当然2.0的也有自己的事件，只是很少人用！<br>LoaderInfo所继承的所有事件：<br>1.complete(事件参数Event. COMPLETE)<br>&nbsp;&nbsp; 成功加载数据后调度。&nbsp;&nbsp;<br>2.HttpStatus(事件参数HTTPStatusEvent.HTTP_STATUS)<br>&nbsp;&nbsp; 在通过 HTTP 发出网络请求并且 Flash Player 可以检测到 HTTP 状态代码时调度。&nbsp;&nbsp;<br>3. Init(事件参数Event.INIT)<br>&nbsp;&nbsp; 已加载的 SWF 文件的属性和方法可访问时调度。&nbsp;&nbsp;<br>4.IoError(事件参数IOErrorEvent.IO_ERROR)<br>&nbsp;&nbsp; 在发生导致加载操作失败的输入或输出错误时调度。&nbsp;&nbsp;<br>5.Open(事件参数Event.OPEN)<br>&nbsp;&nbsp; 在加载操作开始时调度。&nbsp;&nbsp;<br>6.Progress(事件参数ProgressEvent.PROGRESS)<br>&nbsp;&nbsp; 在下载操作过程中收到数据时调度。&nbsp;&nbsp;<br>7.Unload(事件参数Event.UNLOAD)<br>&nbsp;&nbsp; 每次使用 Loader 对象的 unload() 方法删除已加载对象时，或者当同一 Loader 对象执行第二次加载并且在加载开始之前删除了原始内容时，由&nbsp;&nbsp; 对象调度。<br>具体测试例子请看loadjpg.swf与loadswf.swf<br>LoaderInfo的获取swf属性时要等swf加载完才能获取，也就是在COMPLETE事件里获取<br>&nbsp;&nbsp;&nbsp;&nbsp; 如: loadswf.contentLoaderInfo.addEventListener(Event.COMPLETE, loadcom)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function loadcom(the:Event):void {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("AS版本:AS"+the.target.actionScriptVersion+".0")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("swf版本:flash"+the.target.swfVersion+".0")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("swf宽:"+the.target.width+"swf高:"+the.target.height)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trace("swf帧频:"+the.target.frameRate+"帧/秒")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>事件触发的各个顺序分别是<br>OPEN&gt;&gt;INIT&gt;&gt;HTTP&gt;&gt; COMPLETE<br>加载操作开始时调度&gt;&gt;进入事件 SWF 文件的属性和方法调度&gt;&gt;状态事件通过 HTTP 发出网络请求并且 Flash Player检测到 HTTP 状态代码&gt;&gt;加载完成<br><a href="http://www.shch8.com/v2007/show.asp?id=133" target=_blank><u><font color=#0000ff>例(需要flashPlay9.0播放器才能正常测试)</font></u></a>:<br><strong>三：跨域加载的安全机制</strong><br>你可以加载来自任何可访问源的内容。 <br>如果执行调用的 SWF 文件位于网络沙箱中并且要加载的文件是本地的，则不允许加载。 <br>如果加载的内容为用 ActionScript 3.0 编写的 SWF 文件，那么除非可以通过调用加载的内容文件中的 System.allowDomain() 或 System.allowInsecureDomain() 方法来允许跨脚本排列，否则另一个安全沙箱中的 SWF 文件不能对它执行跨脚本操作。 <br>如果被加载的内容为 AVM1 SWF 文件（用 ActionScript 1.0 或 2.0 编写），则 AVM2 SWF 文件（用 ActionScript 3.0 编写）不能对它执行跨脚本操作。 但是，可以通过使用 LocalConnection 类在两个 SWF 文件之间实现通信。 <br>如果被加载的内容为图像，则除非该 SWF 文件的域包含在该图像原始域的跨域策略文件中，否则安全沙箱之外的 SWF 文件无法访问其数据。 <br>在只能与本地文件系统的内容交互的沙箱中的影片剪辑不能对只能与远程内容交互的沙箱中的影片剪辑使用脚本，反之亦然。<br><strong>四：主场景加载条制作</strong><br>我们都知道，AS2.0是用_root. getBytesLoaded()和_root. getBytesTotal()来判断swf是否被加载完，但在3.0里面_root，_global，_parent等原来的&#8221;骨干职工&#8221;都被开除了！取代他的是stage，对于场影设置，他是一手遮天了如设置swf全屏，对齐方式，显视品质等。但stage只继承了DisplayObjectContainer一部分属性，可用的还太少了。<br>在做场影加载条时，我们要获取场影的加载情况。要想办法把上面讲的LoadInfo事件添加到主场景去，用stage是做不到的。但可以用显视类DisplayObject 添加，他继承了&nbsp;&nbsp; EventDispatcher，可以直接用他的属性指定主场景来添加，DisplayObject和属性和原来的movieClip还是很像的，只是前面不用加下划线作区分了如：root.loaderInfo.addEventListener()<br>用root调度loaderInfo：<br>&nbsp;&nbsp;&nbsp;&nbsp; root.loaderInfo.addEventListener(ProgressEvent.PROGRESS, loadshow)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function loadshow(the: ProgressEvent):void {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var loadnum:Number=int(the.bytesLoaded/the.bytesTotal*100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showtxt.text="load:"+loadnum + "%";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gotoAndStop(loadnum);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><strong>五：使用系统图片与加载条等组件写的加载类</strong><br>package myAs{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import fl.containers.UILoader;//图片加载组件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import fl.controls.Label;//文本组件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import fl.controls.ProgressBar;//进度条<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import flash.events.Event;//输入事件类,如果代码写在帧上,可不用输入<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import flash.events.ProgressEvent;//输入事, 件类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import flash.text.TextField;//引进文本类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import flash.net.URLRequest;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import fl.controls.ProgressBarMode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import flash.display.Sprite;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import flash.text.TextFieldAutoSize;//调整类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class loadimg extends Sprite {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private var url:String = "http://image.cnool.net/picn/2005/ompic030b.jpg"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private var loadbox: ProgressBar = new ProgressBar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private var imgbox: UILoader = new UILoader();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private var showtxt: Label = new Label();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private var titleTxt:TextField=new TextField();<br>//注意:上面的几个对象要声明在这里,不能放在主函数里声明,这样loadeven()等事件函数里才能认到<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public function loadimg() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; titleTxt.htmlText="图片加载示例:";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addChild(titleTxt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; titleTxt.x=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; titleTxt.y=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showtxt.autoSize = TextFieldAutoSize.LEFT;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showtxt.text = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showtxt.move(150, 10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addChild(showtxt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadbox.mode = ProgressBarMode.MANUAL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadbox.move(150, 30);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addChild(loadbox);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgbox.load(new URLRequest(url));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgbox.addEventListener(ProgressEvent.PROGRESS, loadeven);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgbox.addEventListener(Event.COMPLETE, loadend);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgbox.setSize(550,400);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgbox.move(0, 40);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addChild(imgbox);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function loadeven(event: ProgressEvent):void {//事件:加载进度显视<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var uiLdr:UILoader = event.currentTarget as UILoader;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var kbLoaded:String = Number(uiLdr.bytesLoaded / 1024).toFixed(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var kbTotal:String = Number(uiLdr.bytesTotal / 1024).toFixed(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showtxt.text = kbLoaded + "/" + kbTotal + " KB" + " (load:" + Math.round(uiLdr.percentLoaded) + "%)";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadbox.setProgress(event.bytesLoaded, event.bytesTotal);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function loadend(event: Event):void {//事件:加载完成 删除事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //showtxt.visible = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //loadbox.visible = false;//加载完成后隐藏进度条<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgbox.removeEventListener(ProgressEvent.PROGRESS, loadeven);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgbox.removeEventListener(Event.COMPLETE, loadend);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>使用组件就轻松多了,不用考虑那么多。只是开发出一个适用的产品最好不要去用官方的组件。自己去写过，写过适合自己的组件。不过CS3的Uiloader感觉很不错！</div>
</div>
<img src ="http://www.cppblog.com/twzheng/aggbug/35104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">爱在江城</a> 2007-10-25 00:36 <a href="http://www.cppblog.com/twzheng/articles/35104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flash AS3 中的反射 — Reflection</title><link>http://www.cppblog.com/twzheng/articles/33062.html</link><dc:creator>爱在江城</dc:creator><author>爱在江城</author><pubDate>Thu, 27 Sep 2007 15:09:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/33062.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/33062.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/33062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/33062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/33062.html</trackback:ping><description><![CDATA[<p><strong>什么是反射<br></strong>反射 (Reflection) 是指在程序在运行时 (run-time) 获取类信息的方式. 诸如实现动态创建类实例, 方法等. 在很语言中都有相关的的实现, 如 Java 和 c# 等</p>
<p><strong>反射有什么用<br></strong>在 as3 与 as2 不同, 类实例中任何元素, 如变量 (variable), 访问器 (accessor, 即 getter / setter), 方法 (method) 都是不可被 for..in 遍历的 (不是默认哦, 目前我还没找到办法可以让他被遍历),<br>并且不管你是否继承自 Object (默认继承就是 Object, 不写也一样), 是否把类声明为 dynamic.<br>或许有人会问自然是 Object 的子类, 不是可以用 setPropertyIsEnumerable 来设置是否隐藏变量么.<br>很遗憾的是经过的我的尝试, 在类里使用 setPropertyIsEnumerable("属性名") 编译器报告方法可能未定义.<br>随后尝试 super.setPropertyIsEnumerable("属性名"), 编译通过但抛运行时错误, 同样是方法未定义 -_-<br>而其他方法诸如 propertyIsEnumerable("属性名") 却可以正常使用</p>
<p>新建一个 ActionScript 项目, 分别创建下面 2 个类:</p>
<p><strong>Dummy.as</strong></p>
<p>代码拷贝框<br><textarea class=codeTextarea style="WIDTH: 522px; HEIGHT: 216px" rows=13 cols=73>package{public dynamic class Dummy extends Object{public var variable1:String;public function Dummy () {variable1 = "我是字符串";// 使用下面 2 个句子分别会报告编译时错误和运行时错误// setPropertyIsEnumerable("variable1");// super.setPropertyIsEnumerable("accessorOfVar1");}public function get accessorOfVar1 ():String {return "通过访问器访问, variable1 : " + variable1;}}}</textarea><br>[Ctrl+A 全部选择 然后拷贝]</p>
<p><strong>ReflectionSample.as</strong></p>
<p>代码拷贝框<br><textarea class=codeTextarea style="WIDTH: 521px; HEIGHT: 197px" rows=12 cols=73>package {import flash.display.Sprite;public class ReflectionSample extends Sprite{public function ReflectionSample () {testPropsEnumeration();}/** * 测试 for..in 遍历 *  */private function testPropsEnumeration ():void {trace("测试 for..in 循环, 遍历 Dummy 的实例");var dummy:Dummy = new Dummy();for (var i:String in dummy)trace( i + " : " + dummy[i] );}}}</textarea><br>[Ctrl+A 全部选择 然后拷贝]</p>
<p>最后测试 ReflectionSample, 记得用 debug 模式. 控制台中只会出现:</p>
<p><em><strong>QUOTE:</strong></em><br><strong>------------------------------------------------------------</strong><br>测试 for..in 循环, 遍历 Dummy 的实例<br><strong>------------------------------------------------------------</strong></p>
<p>显然 dummy 中的元素都没有被遍历出.</p>
<p>在 as1, 2 中很简单就可以实现的问题在 as3 得换个办法了, 谁让他们是传统的脚本语言呢.而在 as3 中, 就得通过反射来解决这个问题了. 方法会在文后介绍</p>
<p><strong>动态创建实例</strong></p>
<p>* 这部分内容帮助中已经有例子, 我摘要一些翻译一下, 不过我的 e 文很烂. 希望大家能看得懂.</p>
<p>as3 使用 flash.util.getDefinitionByName 动态获取类 (Class) 引用<br>帮助中该方法的描述 :</p>
<p><strong><em>QUOTE:</em><br>------------------------------------------------------------<br>public function getDefinitionByName(name:String):Object<br></strong>返回参数 name 中指定的类引用</p>
<p><strong>参数</strong>&nbsp; name:String - 类名称 <br><strong>返回</strong>&nbsp; Object - 返回参数 name 中指定的类引用<br><strong>错误</strong>&nbsp; ReferenceError - 找不到参数 name 对应的公共定义<br><strong>------------------------------------------------------------</strong></p>
<p><strong>使用方法如下</strong>: </p>
<p>获取类 flash.text.TextField 的引用. as 语句是无异常的类型转换. 如果转换失败那么目标变量将被设置成 null</p>
<p><span class=code>var ClassReference:Class = getDefinitionByName("flash.text.TextField") as Class;</span></p>
<p>实例化所引用的类, 并设置一些属性</p>
<p><span class=code>var instance:TextField = new ClassReference() as TextField;<br>instance.autoSize = "left";<br>instance.text = "我通过 getDefinitionByName 动态创建";</span></p>
<p>最后添加到场景中并显示</p>
<p><span class=code>addChild(instance);</span></p>
<p>修改后的 <strong>ReflectionSample.as</strong>:</p>
<p>代码拷贝框<br><textarea class=codeTextarea style="WIDTH: 520px; HEIGHT: 229px" rows=14 cols=73>package {import flash.display.Sprite;import flash.utils.getDefinitionByName;import flash.text.TextField;public class ReflectionSample extends Sprite{public function ReflectionSample () {getDefinitionByNameSample();}/** * 使用 flash.utils.getDefinitionByName 动态获取类 (Class) 并创建实例 *  */private function getDefinitionByNameSample ():void {var ClassReference:Class = getDefinitionByName("flash.text.TextField") as Class;var instance:TextField = new ClassReference() as TextField;instance.autoSize = "left";instance.text = "我通过 getDefinitionByName 动态创建";addChild(instance);}}}</textarea><br>[Ctrl+A 全部选择 然后拷贝]</p>
<p><strong>动态获取类名称, 超类 (Superclass) 名称</strong><br>有点像之前版本中的 typeof, 这个方法返回的是字符串</p>
<p><strong><em>QUOTE:<br></em>------------------------------------------------------------<br>public function getQualifiedClassName(value:*):String<br></strong>返回类的完全限定名 (fully qualified class name, qualified 我不知道怎么翻了..)</p>
<p><strong>参数</strong>&nbsp; value:* - 想要得到完全限定名的对象. 他可以是任何 ActionScript 类型, 对象实例, 简单类型如 uint 以及类类型.&nbsp; <br><strong>返回</strong>&nbsp; String - 包含类的完全限定名的字符串<br><strong>------------------------------------------------------------</strong></p>
<p><strong><em>QUOTE:</em><br>------------------------------------------------------------<br>public function getQualifiedSuperclassName(value:*):String<br></strong>返回目标对象基类的完全限定名, <br>本函数提供比 describeType 更简便的方法来获取基类的名称<br><strong>提示</strong>: 本函数限制只寻找实例的继承层次，而 describeType() 函数使用的是类对象继承.<br>调用 describeType() 函数时返回的是基于超类以的类继承结构. 而 getQualifiedSuperclassName() 将忽略类的继承结构直接返回最接近的继承对象<br>例如, 理论上 String 类继承自 Class, 但调用 getQualifiedSuperclassName(String) 时返回的是 Object. 换句话说, 不管你传递的是类还是类的实例, 他们的返回值都是一样的</p>
<p><strong>参数</strong>&nbsp; value:* - 任何值.&nbsp; <br><strong>返回</strong>&nbsp; String - 基类的完全限定名, 如果没有的话返回 null<br><strong>------------------------------------------------------------</strong></p>
<p><strong>例子:</strong></p>
<p>实例化新的 Sprite, 然后获取他的类名并输出</p>
<p><span class=code>var sprite1:Sprite = new Sprite();<br>var classNameOfSprite:String = getQualifiedClassName(Sprite);<br>trace("Sprite 的类名 : " + classNameOfSprite); // Sprite 的类名 : flash.display::Sprite</span></p>
<p>超类</p>
<p><span class=code>var superclassNameOfSprite:String = getQualifiedSuperclassName(Sprite);<br>trace("Sprite 的超类 (基类) 类名 : " + superclassNameOfSprite); // Sprite 的超类 (基类) 类名 : flash.display::DisplayObjectContainer</span></p>
<p>根据刚刚获取的类名使用 创建实例</p>
<p><span class=code>var SpriteClass:Class = getDefinitionByName(classNameOfSprite) as Class;<br>var sprite2:Sprite = new SpriteClass() as Sprite;<br>trace("sprite2 通过 getDefinitionByName 创建 Sprite 实例");</span></p>
<p>画一个 100 x 100 的矩形并显示</p>
<p><span class=code>sprite2.graphics.beginFill(0xFF00FF);<br>sprite2.graphics.drawRect(0, 0, 100, 100);<br>sprite2.graphics.endFill();<br>addChild(sprite2);</span></p>
<p><strong>修改后的 ReflectionSample.as</strong></p>
<p>代码拷贝框<br><textarea class=codeTextarea style="WIDTH: 514px; HEIGHT: 233px" rows=14 cols=71>package {import flash.display.Sprite;import flash.utils.getDefinitionByName;import flash.utils.getQualifiedClassName;import flash.utils.getQualifiedSuperclassName;public class ReflectionSample extends Sprite{public function ReflectionSample () {getClassNameSample();}/** * 使用 flash.utils.getQualifiedClassName 和 getQualifiedSuperclassName 获取类名称, 并动态创建该类 *  */private function getClassNameSample ():void {var sprite1:Sprite = new Sprite();var classNameOfSprite:String = getQualifiedClassName(Sprite);trace("Sprite 的类名 : " + classNameOfSprite);var superclassNameOfSprite:String = getQualifiedSuperclassName(Sprite);trace("Sprite 的超类 (基类) 类名 : " + superclassNameOfSprite);var SpriteClass:Class = getDefinitionByName(classNameOfSprite) as Class;var sprite2:Sprite = new SpriteClass() as Sprite;trace("sprite2 通过 getDefinitionByName 创建 Sprite 实例");sprite2.graphics.beginFill(0xFF00FF);sprite2.graphics.drawRect(0, 0, 100, 100);sprite2.graphics.endFill();addChild(sprite2);}}}</textarea><br>[Ctrl+A 全部选择 然后拷贝]</p>
<p><strong>获取类信息</strong></p>
<p><strong><em>QUOTE:</em><br>------------------------------------------------------------</strong><br><strong>public function describeType(value:*):XML</strong><br>生成一个 XML 对象来描述参数中指定的 ActionScript 对象, 这个方法使 ActionScript 实现了反射编程的概念.</p>
<p>如果参数 value 是某类的实例, 那么返回的 XML 对象包含了此类中所有的实例属性, 但是不会包含任何的静态属性.<br>这种情况下你可以通过检查标签 &lt;type&gt; 中的 isStatic 属性来判断他, 当参数为某类的实例时, 这个值为 false.</p>
<p>要获取类的静态属性, 可以通过传递类本身到参数 value, 这样返回的 XML 对象不仅包括了类的静态属性, 也包括所有的实例属性.<br>实例属性被包含在 &lt;factory&gt; 标签中使它们和静态属性区别开来. 在这种情况下, &lt;type&gt; 标签的 isStatic 属性为 true.</p>
<p><strong>提示</strong>: 如果你只需要获取对象的继承结构而不需要 describeType() 提供的其他信息, 可以使用 getQualifiedClassName() 和 getQualifiedSuperclassName() 来替代</p>
<p>下表描述了 describeType() 生成的 XML 的标签和属性 (按运行代码察看)<br><strong>------------------------------------------------------------</strong></p>
<p>运行代码框<br><span><textarea class=codeTextarea style="WIDTH: 520px; HEIGHT: 195px" rows=12 cols=72>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;html&gt;&lt;head&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;&lt;style type="text/css"&gt;* { font- size : 1em; }table, td, th { font-family : Verdana; border : 1px solid #000; border-collapse : collapse; background-color : #fefefe}th { background-color : #ccc; }&lt;/style&gt;&lt;/head&gt;&lt;body&gt;  &lt;table width="100%"&gt;      &lt;tr&gt;&lt;th&gt;标签&lt;/th&gt;&lt;th&gt;属性&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;type&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;XML 对象的根标签&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;ActionScript 对象 (ActionScript object) 类型&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;base&lt;/td&gt;&lt;td&gt;当前对象的直属超类, 如果当前 ActionScript 对象是类对象, 那那么该值为 &lt;code&gt;Class&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;isDynamic&lt;/td&gt;&lt;td&gt;如果当前 ActionScript 对象被定义为 dynamic, 那么该属性为 &lt;code&gt;true&lt;/code&gt;, 否则为 &lt;code&gt;false&lt;/code&gt;. 如果当前 ActionScript 对象是类对象, 那么该属性也为 &lt;code&gt;true&lt;/code&gt;, 因为 Class 类是 dynamic 的&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;isFinal&lt;/td&gt;&lt;td&gt;如果当前 ActionScript 对象被定义为 final, 那么该属性为 &lt;code&gt;true&lt;/code&gt;, 否则为 &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;isStatic&lt;/td&gt;&lt;td&gt;如果当前 ActionScript 是类对象或者构造函数, 那么该属性为 &lt;code&gt;true&lt;/code&gt;, 否则为 &lt;code&gt;false&lt;/code&gt;. 该属性被命名为 &lt;code&gt;isStatic&lt;/code&gt; 是因为如果值为 &lt;code&gt;true&lt;/code&gt; 的话, 任何标签都不会被嵌套到 &lt;code&gt;factory&lt;/code&gt; 标签中&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;extendsClass&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;使用 &lt;code&gt;extendsClass&lt;/code&gt; 标签分别存放当前 ActionScript 对象的超类&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;type&lt;/td&gt;&lt;td&gt;当前 ActionScript 对象所继承的超类的名字&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;implementsInterface&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;使用 &lt;code&gt;implementsInterface&lt;/code&gt; 标签分别存放当前 ActionScript 对象, 以及他的超类所实现的接口&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;type&lt;/td&gt;&lt;td&gt;当前 ActionScript 所实现的接口的名字&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;accessor&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;访问器是由 getter 和 setter 所定义的属性&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;该访问器的名字&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;access&lt;/td&gt;&lt;td&gt;该访问器的访问权限. 可能的值有 &lt;code&gt;readonly&lt;/code&gt;, &lt;code&gt;writeonly&lt;/code&gt;, 和 &lt;code&gt;readwrite&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;type&lt;/td&gt;&lt;td&gt;该属性的数据类型&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;declaredBy&lt;/td&gt;&lt;td&gt;指示由哪个类定义了该访问器&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;constant&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;常量是由 &lt;code&gt;const&lt;/code&gt; 所定义的属性&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;该常量的名称&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;type&lt;/td&gt;&lt;td&gt;该常量的数据类型&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;method&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;方法是由类定义的一部分公开的函数&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;方法名&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;declaredBy&lt;/td&gt;&lt;td&gt;指示该方法由哪个类定义&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;returnType&lt;/td&gt;&lt;td&gt;方法的返回类型&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;parameter&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;使用 &lt;code&gt;parameter&lt;/code&gt; 分别存放该方法的参数, 该标签被嵌套在 &lt;code&gt;&amp;lt;method&amp;gt;&lt;/code&gt; 中&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;index&lt;/td&gt;&lt;td&gt;一个数字指示当前参数被传递时所在函数中的位置, 如果是首个参数, 那么该值为 1&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;type&lt;/td&gt;&lt;td&gt;该参数的类型&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;optional&lt;/td&gt;&lt;td&gt;如果该参数为可选的话为 &lt;code&gt;true&lt;/code&gt;, 否则为 &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;variable&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;变量 (variable) 是由 var 语句所定义的变量&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;变量名&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;type&lt;/td&gt;&lt;td&gt;变量类型&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;factory&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&#xA0;&lt;/td&gt;&lt;td&gt;如果当前 ActionScript 对象是类对象或者构造函数, 所有的实例属性将会被嵌套进该标签. 如果 &lt;code&gt;&amp;lt;type&amp;gt;&lt;/code&gt; 标签的 &lt;code&gt;isStatic&lt;/code&gt; 属性为 &lt;code&gt;true&lt;/code&gt;, 所有属性 (properties) 和方法 (method) 将不会被嵌套进改标签中. 该标签只出现在当前 ActionScript 对象是类对象或者构造函数的情况下&lt;/td&gt;&lt;/tr&gt;  &lt;/table&gt;&lt;/body&gt;&lt;/html&gt;</textarea><br><input onclick=runCode() type=button value=运行代码> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</span></p>
<p><span>另外, 由 describeType() 返回的类描述信息中只会含有所有可被访问的元素, 即所有非定义为 private 的元素.</span></p>
<p><span></span><span>解释了这么多, 我们来看看返回的 XML 格式<br>flash 的内置类 flash.display.Sprite :</span></p>
<p><span class=code>trace(describeType(Sprite);</span></p>
<p><span>返回:</span></p>
<p><span>代码拷贝框<br><textarea class=codeTextarea style="WIDTH: 519px; HEIGHT: 188px" rows=11 cols=72>&lt;type name="flash.display::Sprite" base="Class" isDynamic="true" isFinal="true" isStatic="true"&gt;  &lt;extendsClass type="Class"/&gt;  &lt;extendsClass type="Object"/&gt;  &lt;accessor name="prototype" access="readonly" type="*" declaredBy="Class"/&gt;  &lt;factory type="flash.display::Sprite"&gt;    &lt;extendsClass type="flash.display::DisplayObjectContainer"/&gt;    &lt;extendsClass type="flash.display::InteractiveObject"/&gt;    &lt;extendsClass type="flash.display::DisplayObject"/&gt;    &lt;extendsClass type="flash.events::EventDispatcher"/&gt;    &lt;extendsClass type="Object"/&gt;    &lt;implementsInterface type="flash.display::IBitmapDrawable"/&gt;    &lt;implementsInterface type="flash.events::IEventDispatcher"/&gt;    &lt;accessor name="hitArea" access="readwrite" type="flash.display::Sprite" declaredBy="flash.display::Sprite"/&gt;    &lt;method name="startDrag" declaredBy="flash.display::Sprite" returnType="void"&gt;      &lt;parameter index="1" type="Boolean" optional="true"/&gt;      &lt;parameter index="2" type="flash.geom::Rectangle" optional="true"/&gt;    &lt;/method&gt;    &lt;accessor name="buttonMode" access="readwrite" type="Boolean" declaredBy="flash.display::Sprite"/&gt;    &lt;accessor name="graphics" access="readonly" type="flash.display::Graphics" declaredBy="flash.display::Sprite"/&gt;    &lt;accessor name="soundTransform" access="readwrite" type="flash.media::SoundTransform" declaredBy="flash.display::Sprite"/&gt;    &lt;method name="stopDrag" declaredBy="flash.display::Sprite" returnType="void"/&gt;    &lt;accessor name="dropTarget" access="readonly" type="flash.display::DisplayObject" declaredBy="flash.display::Sprite"/&gt;    &lt;accessor name="useHandCursor" access="readwrite" type="Boolean" declaredBy="flash.display::Sprite"/&gt;    &lt;method name="getChildAt" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject"&gt;      &lt;parameter index="1" type="int" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="addChild" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="swapChildren" declaredBy="flash.display::DisplayObjectContainer" returnType="void"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;      &lt;parameter index="2" type="flash.display::DisplayObject" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="getChildByName" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject"&gt;      &lt;parameter index="1" type="String" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="getObjectsUnderPoint" declaredBy="flash.display::DisplayObjectContainer" returnType="Array"&gt;      &lt;parameter index="1" type="flash.geom::Point" optional="false"/&gt;    &lt;/method&gt;    &lt;accessor name="textSnapshot" access="readonly" type="flash.text::TextSnapshot" declaredBy="flash.display::DisplayObjectContainer"/&gt;    &lt;method name="removeChildAt" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject"&gt;      &lt;parameter index="1" type="int" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="getChildIndex" declaredBy="flash.display::DisplayObjectContainer" returnType="int"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="areInaccessibleObjectsUnderPoint" declaredBy="flash.display::DisplayObjectContainer" returnType="Boolean"&gt;      &lt;parameter index="1" type="flash.geom::Point" optional="false"/&gt;    &lt;/method&gt;    &lt;accessor name="mouseChildren" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObjectContainer"/&gt;    &lt;method name="removeChild" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="setChildIndex" declaredBy="flash.display::DisplayObjectContainer" returnType="void"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;      &lt;parameter index="2" type="int" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="contains" declaredBy="flash.display::DisplayObjectContainer" returnType="Boolean"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="addChildAt" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;      &lt;parameter index="2" type="int" optional="false"/&gt;    &lt;/method&gt;    &lt;accessor name="numChildren" access="readonly" type="int" declaredBy="flash.display::DisplayObjectContainer"/&gt;    &lt;method name="swapChildrenAt" declaredBy="flash.display::DisplayObjectContainer" returnType="void"&gt;      &lt;parameter index="1" type="int" optional="false"/&gt;      &lt;parameter index="2" type="int" optional="false"/&gt;    &lt;/method&gt;    &lt;accessor name="tabChildren" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObjectContainer"/&gt;    &lt;accessor name="tabEnabled" access="readwrite" type="Boolean" declaredBy="flash.display::InteractiveObject"/&gt;    &lt;accessor name="doubleClickEnabled" access="readwrite" type="Boolean" declaredBy="flash.display::InteractiveObject"/&gt;    &lt;accessor name="contextMenu" access="readwrite" type="flash.ui::ContextMenu" declaredBy="flash.display::InteractiveObject"/&gt;    &lt;accessor name="accessibilityImplementation" access="readwrite" type="flash.accessibility::AccessibilityImplementation" declaredBy="flash.display::InteractiveObject"&gt;      &lt;metadata name="Inspectable"&gt;        &lt;arg key="environment" value="none"/&gt;      &lt;/metadata&gt;    &lt;/accessor&gt;    &lt;accessor name="mouseEnabled" access="readwrite" type="Boolean" declaredBy="flash.display::InteractiveObject"/&gt;    &lt;accessor name="focusRect" access="readwrite" type="Object" declaredBy="flash.display::InteractiveObject"/&gt;    &lt;accessor name="tabIndex" access="readwrite" type="int" declaredBy="flash.display::InteractiveObject"/&gt;    &lt;accessor name="mask" access="readwrite" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="scaleX" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="scaleY" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;method name="getRect" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;    &lt;/method&gt;    &lt;accessor name="mouseY" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="alpha" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="x" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="name" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="y" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="root" access="readonly" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="width" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="stage" access="readonly" type="flash.display::Stage" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="loaderInfo" access="readonly" type="flash.display::LoaderInfo" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="transform" access="readwrite" type="flash.geom::Transform" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="height" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;method name="localToGlobal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point"&gt;      &lt;parameter index="1" type="flash.geom::Point" optional="false"/&gt;    &lt;/method&gt;    &lt;accessor name="filters" access="readwrite" type="Array" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="blendMode" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="rotation" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;method name="hitTestObject" declaredBy="flash.display::DisplayObject" returnType="Boolean"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;    &lt;/method&gt;    &lt;accessor name="scale9Grid" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="accessibilityProperties" access="readwrite" type="flash.accessibility::AccessibilityProperties" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="scrollRect" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="cacheAsBitmap" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/&gt;    &lt;method name="globalToLocal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point"&gt;      &lt;parameter index="1" type="flash.geom::Point" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="getBounds" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle"&gt;      &lt;parameter index="1" type="flash.display::DisplayObject" optional="false"/&gt;    &lt;/method&gt;    &lt;accessor name="opaqueBackground" access="readwrite" type="Object" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="parent" access="readonly" type="flash.display::DisplayObjectContainer" declaredBy="flash.display::DisplayObject"/&gt;    &lt;method name="hitTestPoint" declaredBy="flash.display::DisplayObject" returnType="Boolean"&gt;      &lt;parameter index="1" type="Number" optional="false"/&gt;      &lt;parameter index="2" type="Number" optional="false"/&gt;      &lt;parameter index="3" type="Boolean" optional="true"/&gt;    &lt;/method&gt;    &lt;accessor name="visible" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/&gt;    &lt;accessor name="mouseX" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/&gt;    &lt;method name="willTrigger" declaredBy="flash.events::EventDispatcher" returnType="Boolean"&gt;      &lt;parameter index="1" type="String" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="removeEventListener" declaredBy="flash.events::EventDispatcher" returnType="void"&gt;      &lt;parameter index="1" type="String" optional="false"/&gt;      &lt;parameter index="2" type="Function" optional="false"/&gt;      &lt;parameter index="3" type="Boolean" optional="true"/&gt;    &lt;/method&gt;    &lt;method name="toString" declaredBy="flash.events::EventDispatcher" returnType="String"/&gt;    &lt;method name="addEventListener" declaredBy="flash.events::EventDispatcher" returnType="void"&gt;      &lt;parameter index="1" type="String" optional="false"/&gt;      &lt;parameter index="2" type="Function" optional="false"/&gt;      &lt;parameter index="3" type="Boolean" optional="true"/&gt;      &lt;parameter index="4" type="int" optional="true"/&gt;      &lt;parameter index="5" type="Boolean" optional="true"/&gt;    &lt;/method&gt;    &lt;method name="dispatchEvent" declaredBy="flash.events::EventDispatcher" returnType="Boolean"&gt;      &lt;parameter index="1" type="flash.events::Event" optional="false"/&gt;    &lt;/method&gt;    &lt;method name="hasEventListener" declaredBy="flash.events::EventDispatcher" returnType="Boolean"&gt;      &lt;parameter index="1" type="String" optional="false"/&gt;    &lt;/method&gt;  &lt;/factory&gt;&lt;/type&gt;</textarea><br>[Ctrl+A 全部选择 然后拷贝]</span></p>
<p><span>真是又臭又长啊. :o, 根据帮助中的描述, 所有的实例属性都被嵌套在了 &lt;factory&gt; 标签里.</span></p>
<img src ="http://www.cppblog.com/twzheng/aggbug/33062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">爱在江城</a> 2007-09-27 23:09 <a href="http://www.cppblog.com/twzheng/articles/33062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>组件封装为mxp文件的方法</title><link>http://www.cppblog.com/twzheng/articles/30686.html</link><dc:creator>爱在江城</dc:creator><author>爱在江城</author><pubDate>Thu, 23 Aug 2007 10:36:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/30686.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/30686.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/30686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/30686.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/30686.html</trackback:ping><description><![CDATA[<h3><span style="FONT-SIZE: 18pt">组件封装为mxp文件的方法</span></h3>
<br>１。必须安装extension&nbsp;manager（扩展管理器）。&nbsp;<br>２。将所有要打包的组件文件拷贝到一个&#8220;准备&#8221;区域（自定的文件夹），以便于打包。无需使所有文件位于文件夹层次结构的同一级别（您可以在MXI文件中使用&lt;file&gt;&nbsp;标记指定每个文件相对于安装文件的路径）；但是，如果您不打算将文件从它们的&#8220;配置&#8221;文件夹安装位置直接打包，则跟踪所有文件会更为简便。&nbsp;<br>３。为您的功能扩展创建一个功能扩展安装文件（文件名以&nbsp;.mxi&nbsp;结尾）。<br>４。在功能扩展管理器中，选择&#8220;文件&#8221;&gt;&#8220;将功能扩展打包&#8221;。&nbsp;<br>５。在随即出现的文件选择对话框中，浏览到您的功能扩展安装文件（文件名以&nbsp;.mxi&nbsp;结尾）并将其选定。单击&#8220;打开&#8221;。选择包文件的位置并指定它的名称（以&nbsp;.mxp&nbsp;结尾）。单击&#8220;保存&#8221;。&nbsp;<br>注意：功能扩展包文件的名称不得包含空格。它应该是在&nbsp;<a class=wordstyle href="http://www.newasp.cn/" target=_blank><u><font color=#0000ff>Windows</font></u></a>&nbsp;和&nbsp;Macintosh&nbsp;上均有效的文件名。&nbsp;<br>==============================================<br>　　备注：在扩展管理器应用程序文件夹内的&#8220;示例&#8221;文件夹中（Samples/<a href="http://www.cndownz.com/html/Dreamweaver" target=_blank><u><font color=#0000ff>Dreamweaver</font></u></a>、Samples/<a href="http://www.cndownz.com/html/Dreamweaver" target=_blank><u><font color=#0000ff>Dreamweaver</font></u></a>&nbsp;UltraDev&nbsp;和&nbsp;Samples/<a href="http://www.cndownz.com/html/Flash" target=_blank><u><font color=#810081>Flash</font></u></a>），有几个用于&nbsp;<a href="http://www.cndownz.com/html/Dreamweaver" target=_blank><u><font color=#0000ff>Dreamweaver</font></u></a>、UltraDev&nbsp;和&nbsp;<a href="http://www.cndownz.com/html/Flash" target=_blank><u><font color=#810081>Flash</font></u></a>&nbsp;的示例功能扩展安装文件。&nbsp;<br>　　功能扩展管理器将创建一个包文件，它包含该功能扩展使用的所有文件（包括安装文件）的压缩版本。&nbsp;<br>　　通过用功能扩展管理器安装该包文件来对其进行测试。当安装包文件后，试用该功能扩展并确保所有功能都按预期的方式运行。<br>&nbsp;&nbsp;&nbsp;mxi可以用记事本来编写，我里面有【】说明的地方就是提示你可以改的内容，你可以参考另一个mxi文件来改你的mxi文件，格式如下：<br>用记事本打开内容是:<br>&lt;macromedia-extension<br>&nbsp;&nbsp;&nbsp;&nbsp;name="【组件名称】"<br>&nbsp;&nbsp;&nbsp;&nbsp;version="【版本号】1.0.0"<br>&nbsp;&nbsp;&nbsp;&nbsp;type="<a href="http://www.cndownz.com/html/Flash" target=_blank><u><font color=#810081>Flash</font></u></a>&nbsp;Component"&nbsp;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;author&nbsp;name="【开发者】"&nbsp;/&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;products&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;product&nbsp;name="<a href="http://www.cndownz.com/html/Flash" target=_blank><u><font color=#810081>Flash</font></u></a>"&nbsp;version="6"&nbsp;primary="true"&nbsp;/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/products&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;description&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[<br>【组件介绍】<br>&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/description&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ui-access&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[<br>【组件使用说明】<br>&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ui-access&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;files&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;file&nbsp;source="【组件源文件】*.fla"&nbsp;destination="$flash/Components"&nbsp;/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;file&nbsp;source="【Actions/Reference说明】*.xml"&nbsp;destination="$flash/ActionsPanel/CustomActions"&nbsp;/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;file&nbsp;source="【内置窗口】*.swf"&nbsp;destination="$flash/<a class=wordstyle href="http://www.newasp.cn/" target=_blank><u><font color=#0000ff>WindowS</font></u></a>WF"&nbsp;/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/files&gt;<br><br>&lt;/macromedia-extension&gt; <br>
<img src ="http://www.cppblog.com/twzheng/aggbug/30686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">爱在江城</a> 2007-08-23 18:36 <a href="http://www.cppblog.com/twzheng/articles/30686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flash.system 函数 fscommand()</title><link>http://www.cppblog.com/twzheng/articles/30502.html</link><dc:creator>爱在江城</dc:creator><author>爱在江城</author><pubDate>Tue, 21 Aug 2007 03:31:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/30502.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/30502.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/30502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/30502.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/30502.html</trackback:ping><description><![CDATA[<strong style="FONT-SIZE: 18pt">flash.system 包中具有一个包级函数 <code><span class=searchhilite><code>fscommand</code></span>()</code>，可方便 SWF 文件与其容器之间的通信。</strong><br>
<div class=summarySection>
<div class=summaryTableTitle>公共 函数</div>
<table class="summaryTable " id=summaryTableMethod cellSpacing=0 cellPadding=3>
    <tbody>
        <tr>
            <th>&nbsp;</th>
            <th colSpan=2>函数</th>
            <th class=summaryTableOwnerCol>定义方</th>
        </tr>
        <tr class="" bgColor=#ffffff>
            <td class=summaryTablePaddingCol>&nbsp;</td>
            <td class=summaryTableInheritanceCol>&nbsp;</td>
            <td class=summaryTableSignatureCol>
            <div class=summarySignature><span class=searchhilite>fscommand</span>(command:String, args:String = ""):void </div>
            <div class=summaryTableDescription>使 SWF 文件能够与 Flash Player 或承载 Flash Player 的程序（如 Web 浏览器）进行通讯。</div>
            </td>
            <td class=summaryTableOwnerCol>flash.system</td>
        </tr>
    </tbody>
</table>
</div>
<div class=detailSectionHeader>函数详细信息 </div>
<table class=detailHeader cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td class=detailHeaderName><span class=searchhilite>fscommand</span></td>
            <td class=detailHeaderParens>()</td>
            <td class=detailHeaderType>函数</td>
        </tr>
    </tbody>
</table>
<div class=detailBody><code>public function <span class=searchhilite>fscommand</span>(command:String, args:String = ""):void</code>
<p>&#160;</p>
<table cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td style="WHITE-SPACE: nowrap" vAlign=top><strong>语言版本 :&nbsp;</strong></td>
            <td>ActionScript 3.0</td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td style="WHITE-SPACE: nowrap" vAlign=top><strong>Player 版本 :&nbsp;</strong></td>
            <td>Flash Player 9</td>
        </tr>
    </tbody>
</table>
<p>&#160;</p>
<p>使 SWF 文件能够与 Flash Player 或承载 Flash Player 的程序（如 Web 浏览器）进行通讯。 还可以使用 <code><span class=searchhilite><code>fscommand</code></span>()</code> 函数将消息传递给 Director，或是传递给 Visual Basic、Visual C++ 和其它可承载 ActiveX 控件的程序。
<p><code><span class=searchhilite><code>fscommand</code></span>()</code> 函数使 SWF 文件与 Web 页中的脚本能进行通讯。 不过，脚本访问是由 Web 页的 <code>allowScriptAccess</code> 设置控制的。 （您可以在嵌入 SWF 文件的 HTML 代码中设置此属性，例如，在 Internet Explorer 的 <code>PARAM</code> 标签或 Netscape 的 <code>EMBED</code> 标签中。） 当 <code>allowScriptAccess</code> 设置为 <code>"never"</code> 时，SWF 文件无法访问 Web 页脚本。 对于 Flash Player 7 及更高版本，当 <code>allowScriptAccess</code> 设置为 <code>"always"</code> 时，SWF 文件始终可以访问 Web 页脚本。 当 <code>allowScriptAccess</code> 设置为 <code>"sameDomain"</code> 时，只允许从与该 Web 页位于同一域中的 SWF 文件进行脚本访问；对于以前版本的 Flash Player，始终允许脚本访问。 如果在 HTML 页中未指定 <code>allowScriptAccess</code>，则默认情况下，对于第 8 版及更高版本的 SWF 文件，该属性设置为 <code>"sameDomain"</code>；对于第 7 版及更低版本的 SWF 文件，设置为 <code>"always"</code>。 </p>
<p>可以在包含 SWF 内容的 HTML 页中设置 <code>object</code> 和 <code>embed</code> 标签的 <code>allowNetworking</code> 参数，防止 SWF 文件使用此方法。</p>
</div>
<span class=label><strong>示例</strong>：</span><br>
<div class=detailBody>下例演示如何使用 <code><span class=searchhilite><code>fscommand</code></span>()</code> 来指示 Flash Player 进入全屏模式并且不允许缩放。 然后使用 <code>draw()</code> 将一个橙色框添加到舞台上。 在 <code>draw()</code> 中，指示 Flash Player 使用对 <code><span class=searchhilite><code>fscommand</code></span>().</code> 的另一个调用来退出，将 <code>click</code> 事件侦听器以名称 <code>clickHandler()</code> 添加进来，它对应于 <code>click</code> 事件。
<p><strong>注意：</strong>此示例应在独立的 Flash Player 中执行，而不是在 Web 浏览器中执行。</p>
<div class=listing>
<pre>package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.system.<span class=searchhilite>fscommand</span>;
import flash.events.MouseEvent;
public class <span class=searchhilite>FSCommand</span>Example extends Sprite {
private var bgColor:uint = 0xFFCC00;
private var size:uint = 100;
public function <span class=searchhilite>FSCommand</span>Example() {
<span class=searchhilite>fscommand</span>("fullscreen", "true");
<span class=searchhilite>fscommand</span>("allowscale", "false");
draw();
}
private function clickHandler(event:MouseEvent):void {
<span class=searchhilite>fscommand</span>("quit");
trace("clickHandler");
}
private function draw():void {
var child:Sprite = new Sprite();
child.graphics.beginFill(bgColor);
child.graphics.drawRect(0, 0, size, size);
child.graphics.endFill();
child.buttonMode = true;
addEventListener(MouseEvent.CLICK, clickHandler);
var label:TextField = new TextField();
label.text = "quit";
label.selectable = false;
label.mouseEnabled = false;
child.addChild(label);
addChild(child);
}
}
}</pre>
</div>
</div>
<br><br><br><br>1]全屏播放指令： <br>fscommand("fullscreen","true"); <br>效果：flashplayer播放器将以全屏方式进行影片播放。按键盘上的Esc键可跳转回窗口状态。 <br><br>[2]屏蔽右键菜单指令： <br>fscommand("showmenu","false"); <br>效果：当观众在flashplayer窗口中单击鼠标右键时，将不会出现快捷菜单。 <br><br>[3]禁止影片缩放： <br>fscommand("allowscale","false"); <br>效果：当影片中应用位图时，如果被放大或拉伸显示，将会出现图象模糊或锯齿，为了避免这些影响视觉的现象，使用此指令可以禁止影片尺寸被改变。 <br><br>[4]使键盘出入无效的指令： <br>fscommand("trapallkeys","true"); <br>效果：此指令用于锁定键盘输入，使所有设定的快捷键都失效，flashplayer播放器此时不识别任何键盘输入信号。（但注意：无法禁止Ctrl+Alt+Del三键组合） <br><br>[5]调用可执行文件指令： <br>fscommand("exec","command/程序名"); <br>效果：直接打开一个可执行文件，command/ 是一定要的，就是说EXE文件要放在这个目录下<br><br>[6]关闭播放器指令： <br>fscommand("quit"); <br>效果：结束放映，播放器窗口自动关闭，此ACTION适合添加到影片的最后一贞，当然也可以放到一个按钮上来实现&#8220;终止影片播放&#8221;功能。
<img src ="http://www.cppblog.com/twzheng/aggbug/30502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">爱在江城</a> 2007-08-21 11:31 <a href="http://www.cppblog.com/twzheng/articles/30502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flash按钮中的八个事件有什么区别？ </title><link>http://www.cppblog.com/twzheng/articles/30500.html</link><dc:creator>爱在江城</dc:creator><author>爱在江城</author><pubDate>Tue, 21 Aug 2007 03:09:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/30500.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/30500.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/30500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/30500.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/30500.html</trackback:ping><description><![CDATA[<p><a id=articleTitle><strong style="FONT-SIZE: 18pt">flash按钮中的八个事件有什么区别？</strong></a> <br>[摘自] http://www.flash8.net/<br><br>按钮中的八个事件有什么区别？<br><span class="titlered2 f-14">解决思路</span><br>在&#8220;影片控制&#8221;类的语句中还有一个与我们制做flash密切相关的on命令。这个命令是专门为按钮设计的，它提供了八种按钮的事件。分别是按下，滑过，释放，滑离，外部释放，拖过，拖离和按键。最后一种是定义键盘的事件。这八种时间在我们平时的制作中经常可以用到，每一种时间都有不同的效果，下面我们就结合事例给大家分析一下。<br><br><span class="titlered2 f-14">具体步骤</span><br>首先我们制作一个简单的移动渐变动画。为了直观地说明按钮的功能，我们在第1帧加入as：stop():。如图3.2.1.-11所示。</p>
<p><img alt="" src="http://www2.flash8.net/Uploadteach/2005/06/30/200563052531988.jpg" border=0><br>图3.2.1-11&nbsp;&nbsp;&nbsp;制作一个简单的动画<br>然后我们新建一层制作一个按钮，或者【窗口】|【公用库】|【按钮】，打开公用库按钮面板，从里面选择一个按钮拖放到图层2的第1帧。如图3.2.1-12所示。</p>
<p><img alt="" src="http://www2.flash8.net/Uploadteach/2005/06/30/200563052546970.jpg" border=0><br>图3.2.1-12&nbsp;&nbsp;拖放按钮到场景中<br>最后，也是非常重要的一点就是必须要在选中按钮的状态下，打开as面板。双击【动作】|【影片控制】中的on命令，右边会出现on的参数面板。如图3.2.1-13所示。</p>
<p><img alt="" src="http://www2.flash8.net/Uploadteach/2005/06/30/200563052629748.jpg" border=0><br>图3.2.1-13&nbsp;&nbsp;&nbsp;on的参数面板<br>下面我们就详细地向大家介绍一下这八种事件的使用。<br>1，&nbsp;&nbsp;按下：我们勾选&#8220;按下&#8221;框，然后选择动作语句，双击【动作】|【影片控制】中的play&nbsp;命令。完成！<br>完整的action是：<br>on(press){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设定鼠标事件为按下，然后执行大括号里面的语句。<br>play();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按钮响应后执行play（播放）动作<br>}<br>当然，在大括号里面还可以用其他的语句，比如说，gotoAndPlay(yourframe);&nbsp;&nbsp;//点击按钮后，就会从你设置的帧播放。<br>我们参考源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/Uploadteach/2005/07/01/20057194620233.fla" target=_blank><u><font color=#333333>on----1.fla</font></u></a>，体会一下它的效果。</p>
<p>
<object codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=400 width=550 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
</object><br>2，&nbsp;&nbsp;&nbsp;释放：这也是flash&nbsp;mx默认的按钮事件。我们勾选&#8220;释放&#8221;。与第一个事件相同加入play命令。完成的语句如下：on(release){&nbsp;&nbsp;&nbsp;&nbsp;//当鼠标按下释放的时候，执行下面的语句动作。<br>play();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按钮响应后执行play（播放）动作。<br>}<br>我们参考一下源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/Uploadteach/2005/07/01/20057194629593.fla" target=_blank><u><font color=#333333>on----2.fla</font></u></a>，可以看到，当鼠标左键按下按钮的时候，并没有激发播放动作，而是当鼠标左键放开的时候，执行了播放动作。这也是与&#8220;按下&#8221;事件不同的地方。</p>
<p>
<object codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=400 width=550 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
</object><br>3，&nbsp;&nbsp;外部释放：添加语句的方法同上。完整的语句如下：<br>on&nbsp;(releaseOutside)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当鼠标在按钮外部释放的时候执行下面的语句。<br>play();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按钮响应后执行播放动作。<br>}<br>通过这个例子我们知道，当鼠标左键在按钮上按住并移动到按钮以外的地方放开后，触发了按钮的动作。这是一个具有非常想象力的事件，大家可以利用on的这个事件来制作游戏。<br>参看源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/Uploadteach/2005/07/01/20057194639924.fla" target=_blank><u><font color=#333333>on----3.fla</font></u></a>。</p>
<p>
<object codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=400 width=550 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
</object><br>4，&nbsp;&nbsp;滑过：制作方法同上，完整的as语句为：<br>on(rollover){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当鼠标滑动到按钮上时执行下面的动作。<br>play();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按钮执行播放动作。<br>}<br>当鼠标从按钮上滑过的时候，动画就开始执行播放动作了，而不需要点击它。我们可以利用on的这个特点来制作一些图示板，非常简单有效。参看源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/Uploadteach/2005/07/01/20057194648229.fla" target=_blank><u><font color=#333333>on----4.fla</font></u></a>。</p>
<p>
<object codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=400 width=550 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
</object><br>5，&nbsp;&nbsp;滑离：制作方法同上，完整的as语句为：<br>on(rollOut){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当鼠标滑动到按钮上并离开时执行下面动作。<br>Play():&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按钮响应播放动作。<br>}<br>滑离与滑过并不是相同的，滑离是指鼠标滑动到按钮上并离开以后开始响应，而滑过是指只要鼠标滑到按钮上，就开始执行动作。参看源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/Uploadteach/2005/07/01/20057194656418.fla" target=_blank><u><font color=#333333>on----5.fla</font></u></a>。</p>
<p>
<object codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=400 width=550 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
</object><br>6，拖过：完整的as是：on(Drag&nbsp;Out){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当鼠标拖过的时候执行下面的动作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;play();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//执行播放动作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>拖过的效果是在按钮上点击并按住鼠标不放，移出按扭区，再移回按钮上释放的事件。注意：此例中是一个文字按钮，在做文字按钮的时候，应在文字的下方用一透明方块，以增加按钮的反应区域，或者在按钮的第4帧绘制一个矩形来增加反映区。参看源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/Uploadteach/2005/07/01/2005719474581.fla" target=_blank><u><font color=#333333>on----6.fla</font></u></a>。</p>
<p>
<object codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=400 width=550 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
</object><br>7，拖离：完整的as是：on&nbsp;(dragOut)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当鼠标拖离按钮时执行下面的动作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;play();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//执行播放动作<br>}<br>拖离与拖过有所不同，只要在按钮上按住鼠标左键然后移动到按钮外就会相应。他于滑离的区别在于拖离需要按住鼠标左键。我们可以参考一下源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/Uploadteach/2005/07/01/20057194714285.fla" target=_blank><u><font color=#333333>on----7.fla</font></u></a>来体会一下。<br>1，&nbsp;&nbsp;按键：我们勾选&#8220;按键&#8221;以后，右边的参数框就成可选状态。意思是利用键盘上面的按键来激发按钮执行动作。我们添入&#8220;k&#8221;。如图3.2.1-14所示。</p>
<p><img alt="" src="http://www2.flash8.net/Uploadteach/2005/06/30/200563052657321.jpg" border=0><br>图3.2.1-14&nbsp;&nbsp;&nbsp;&#8220;按键&#8221;参数设置<br>完整地as语句为：on&nbsp;(keyPress&nbsp;"z")&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当按下键盘中的&#8220;z&#8221;健时执行下面的动作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;play();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//执行播放动作<br>}</p>
<p>
<object codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=400 width=550 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
</object><br>参看源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/0/Pith/UploadPith/2005/07/01/20057194724885.fla" target=_blank><u><font color=#333333>on----8.fla</font></u></a>。<br>注&nbsp;&nbsp;意&nbsp;——在给动画作品添加按钮的时候应该放到单独一层，这样便于修改。<br>提&nbsp;&nbsp;示&nbsp;——on为按钮上的动作，所以我们必须首先要选中按钮，以后才可以添加on语句。有的朋友在论坛里面提问，&#8220;为什么我的on为灰色不可选状态？&#8221;原因就是你没有选中按钮。<br>技&nbsp;&nbsp;巧&nbsp;——在一般flash作品中，大家不会有意区分这些on的功能的，一般采用默认的语句。如果没有特殊说明，你使用了拖离，滑离等事件来制作&#8220;replay&#8221;按钮，会让人们摸不着头脑的。<br>试一试&nbsp;——我们了解了on得这么多的功能，利用这些功能可以轻易的制作出flash课件，flash游戏里面的效果，大家不妨试一试。<br>&nbsp;分&nbsp;&nbsp;析——on语句的功能与按钮息息相关，有按钮的地方一定会有on语句的使用。而有flash作品的地方，就会有按钮的出现，所以说on的重要作用不可忽视。今天向大家详细地介绍了on的各种功能，我们就可以结合按钮自身的特点，发挥他们的功能。<br><span class=titlered2>特别提示</span><br>on—1至on—8范例源文件中没有使用公用库中的按钮，目的在于让大家习惯自己制作按钮。按钮时一部完整的flash作品中不可缺少的部分，所以，同样需要我们来精心制作。<br></p>
<h4>特别说明</h4>
<br>这一节看起来内容比较多，但是知识比较容易掌握。例如on的八个事件中，一般经常使用释放，滑过的事情，而其它事件使用频率比较少。但如果我们制作课件或者游戏等作品还是会使用到的。<br>文字按钮的问题，我们在前一部分中已经讲过了。一定要注意文字按钮地反应区。
<p>
<object codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=400 width=550 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
</object><br><span class="titlered2 f-14">相关问题</span><br>1，&nbsp;&nbsp;如何制作永远也碰不到的按钮？<br>我们通过on语句中的滑过事件，配合goto语句来完成这个效果。我们制作一个按钮，拖放到主场景中。复制四帧，并改变第2帧，第3针，第4帧，第5帧中按钮的位置。回到第1帧，在帧上加入stop，让动画在第1帧停止。<br>在第1帧的按钮中添加as：on&nbsp;(rollOver)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当鼠标经过时执行下面的动作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gotoAndStop(2);&nbsp;&nbsp;&nbsp;&nbsp;//转到并停止在第2帧。<br>}<br>&nbsp;&nbsp;&nbsp;在第2帧的按钮中添加as：on&nbsp;(rollOver)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gotoAndStop(3);<br>}<br>&nbsp;&nbsp;&nbsp;在第3帧的按钮中添加as:&nbsp;on&nbsp;(rollOver)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gotoAndStop(4);<br>}<br>第4帧的按钮中添加as:&nbsp;&nbsp;on&nbsp;(rollOver)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gotoAndStop(5);<br>}<br>第5帧的按钮中添加as：on&nbsp;(rollOver)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gotoAndStop(1);<br>}<br>这样我们在这五帧中形成了一个循环，依次跳转，所以你永远也点击不到这个按钮。<br>参看源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/0/Pith/UploadPith/2005/07/01/20057194747141.fla" target=_blank><u><font color=#333333>on----9.fla</font></u></a>。</p>
<p>
<object codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=400 width=550 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
</object><br>2，&nbsp;&nbsp;如何停止flash中的声音？<br>在&#8220;影片控制&#8221;中还有最后一个语句，就是stopAllSound。意思是关闭声音。下面这个flash事例就是利用stopAllSound制作的关闭音乐的按钮。这条语句没有参数，可以加到帧上或者按钮上。事例中的完整as为：on&nbsp;(release)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;当按钮按下时执行下面语句。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopAllSounds();&nbsp;&nbsp;//停止所有声音<br>}<br>请参考源文件<img alt="" src="http://www2.flash8.net/Uploadteach/yuan.gif" border=0><a href="http://www2.flash8.net/0/Pith/UploadPith/2005/07/01/2005719481718.fla" target=_blank><u><font color=#333333>stopAllSound.fla</font></u></a>。</p>
<img src ="http://www.cppblog.com/twzheng/aggbug/30500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">爱在江城</a> 2007-08-21 11:09 <a href="http://www.cppblog.com/twzheng/articles/30500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FLASH与后台数据交换方法汇总</title><link>http://www.cppblog.com/twzheng/articles/29820.html</link><dc:creator>爱在江城</dc:creator><author>爱在江城</author><pubDate>Sun, 12 Aug 2007 03:18:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/29820.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/29820.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/29820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/29820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/29820.html</trackback:ping><description><![CDATA[<p id=fp><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/xiangxiang/archive/2006/09/19/508856.html"><span style="FONT-SIZE: 18pt"><strong>FLASH与后台数据交换方法汇总</strong></span></a><br>摘自：<span><a id=Header1_HeaderTitle href="http://www.cnblogs.com/xiangxiang/"><strong><font color=#1084ff>xiangxiang</font></strong></a>的cnblogs</span><br><br>目前据我所知,Flash与后台数据交互共有下列几种方法(如果你觉得不全,你可告知一下,我会添加上去了):<br>1.LoadVars(XML)<br>2.Flash&nbsp;Remoting<br>3.Webservice<br>4.XMLSocket<br>5.FlashCom（FMS）<br><br>一.LoadVars篇<br>我之所以把XML也放在这里说,是因为XML和LoadVars数据交互的方式大体相同,就是传递时的数据内容有点不一样而已!&nbsp;<br>我现在列出在开发过程最常用的"用户密码验证"实例,加以说明!<br><br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_7643')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_7643);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_7643);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_7643);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_7643 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">//=====================================================;&nbsp;<br>//&nbsp;Flash代码;&nbsp;<br>//=====================================================;<br>//定义LoadVars对象;<br>var&nbsp;data_lv&nbsp;=&nbsp;new&nbsp;LoadVars();&nbsp;<br>//提交的用户名变量和参数值;<br>data_lv.username&nbsp;=&nbsp;"kinglong";&nbsp;<br>//提交的密码变量和参数值;<br>data_lv.password&nbsp;=&nbsp;"king";&nbsp;<br>//提交后返回结果;<br>data_lv.onLoad&nbsp;=&nbsp;function(success){&nbsp;<br>//success,数据提交是否成功;&nbsp;<br>//这个只是表示数据传输是否成功,并不是用户验证的结果;&nbsp;<br>if(success){&nbsp;<br>trace("数据提交成功!");&nbsp;<br>//result也是用户验证返回的实际结果!&nbsp;<br>if(this.result=="true"){&nbsp;<br>trace("yes");&nbsp;<br>}else{&nbsp;<br>trace("no");<br>}<br>}else{<br>trace("数据提交失败!");<br>}<br>}<br>//数据提交方法调用;<br>//第一参数就是提交的页面地址;&nbsp;<br>//第二参数就是返回结果对象(只要是LoadVars对象就可以了);&nbsp;<br>//第三参数就是提交方式(这个和html中form表单类似,分为"post"和"get"两种方式)&nbsp;<br>data_lv.sendAndLoad("<a href="http://www.klstudio.com/save.asp%22" target=_blank><font color=#002c99><u>http://www.klstudio.com/save.asp"</u></font></a>,data_lv,"post");<br></div>
</div>
<br><br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_6266')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_6266);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_6266);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_6266);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_6266 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">//=====================================================;&nbsp;<br>//后台服务端页面处理及返回内容;&nbsp;<br>//=====================================================;<br>//接收flash提交过来的变量和接收一个页面提交过来的变量一致的;<br>Request("username")&nbsp;就是flash端username变量传过来的值"kinglong";<br>Request("password")&nbsp;就是flash端password变量传过来的值"kinglong";<br>....数据库验证.....&nbsp;<br>//如果用户验证通过<br>&amp;result=true<br>//如果用户验证失败<br>&amp;result=false&nbsp;<br>//整个页面返回内容就是上面那一行内容,&amp;result对应用着flash端的result变量;&nbsp;<br>//如果是多个返回值的话,就是&amp;result=xxx&amp;result1=xxx这种形式就可以了;</div>
</div>
<br><br>如有不清楚的地方,你可查看flash帮助文档!&nbsp;<br>至于XML的方式,请对应地查看flash帮助文档就可以了!<br>LoadVars方式的优点:<br>1.flash代码实现起来简单,方便.&nbsp;<br>2.服务端接收页面和接收一个表单过来的数据一样处理,不需要专门的技术,所有服务端程序都可以实现!&nbsp;<br><br>LoadVars方式的缺点:&nbsp;<br>1.传递的变量不宜过多.<br>2.变量传递的值不能过长.<br>3.变量传递值只能使用"字符串"这一种数据类型,数据类型单一.&nbsp;<br>4.数据返回值当中不能有"&amp;"字符,因此比较复杂的返回值都需进行URL编码处理.<br>5.其还有调试模块(NetConnection&nbsp;tConnection&nbsp;Debugger)<br><br><br>二、Flash&nbsp;Remoting篇<br>二、Flash&nbsp;Remoting<br>Flash&nbsp;Remoting这种数据接口是四个之中效率最高的！<br>其优点:<br><br>1.支持数据类型比较多(<a href="http://livedocs.macromedia.com/flashremoting/mx/Using_Flash_Remoting_MX/UseASData4.htm#1173664" target=_blank><font color=#002c99><u>Converting&nbsp;from&nbsp;application&nbsp;server&nbsp;data&nbsp;types&nbsp;to&nbsp;ActionScript</u></font></a>);<br>2.传递数据量比较大;<br>3.运行效率是现有几个当中最高的；<br>4.对各种后台的支持也比较好;<br>5.其还有调试模块(NetConnection&nbsp;Debugger)<br><img onmouseover="this.style.cursor='hand';" style="CURSOR: hand" onclick=window.open(this.src); height=168 alt="" src="http://www.blueidea.com/articleimg/2006/03/3250/fr_debugger.jpg" width=248 onload=javascript:DrawImage(this); border=0 pop="按此在新窗口打开图片"><br><br>其缺点：<br>1.需要flash端装<a href="http://www.macromedia.com/software/flashremoting/downloads/components/" target=_blank><font color=#002c99><u>Flash&nbsp;Remoting&nbsp;MX&nbsp;Components</u></font></a>(这个是免费提供的);<br>2.需要后台服务端装相应版本的Flash&nbsp;Remoting模块才可以使用,MM提供的模块有j2ee和.net两个版本是要收费的,好在网上还有两个开源的(<a href="http://www.openamf.org/" target=_blank><font color=#002c99><u>OpenAMF</u></font></a>,<a href="http://amfphp.org/" target=_blank><font color=#002c99><u>AMFPHP</u></font></a>);<br>3.好像Remoting对虚拟主机的支持不太好(可以去google搜索一下，有没有解决方法).<br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_6635')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_6635);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_6635);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_6635);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_6635 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">//=====================================================;<br>//Flash端代码说明：(我这里用as1.0版本为例，其他版本到MM站查找)<br>//=====================================================;<br>//加载Remoting&nbsp;Component代码,这个是必须的;<br>#include&nbsp;"NetServices.as"<br>//加载Remoting&nbsp;调试模块代码,这个是可选择的,用NetConnection&nbsp;Debugger查看调试信息;<br>#include&nbsp;"NetDebug.as"<br>if&nbsp;(inited&nbsp;==&nbsp;null){&nbsp;<br>inited&nbsp;=&nbsp;true;&nbsp;<br>//设置默认网关;<br>NetServices.setDefaultGatewayUrl("<a href="http://localhost:8500/flashservices/gateway%22);&nbsp;" target=_blank><font color=#002c99><u>http://localhost:8500/flashservices/gateway");&nbsp;</u></font></a><br>//建立网关连接;<br>gateway_conn&nbsp;=&nbsp;NetServices.createGatewayConnection();&nbsp;<br>//获取一个服务;<br>myService&nbsp;=&nbsp;gateway_conn.getService("myservice",&nbsp;this);&nbsp;<br>}<br><br>//定义调用方法的函数;<br>function&nbsp;getString(name){<br>//调用Remoting的getString方法;<br>myService.getString(name);<br>}&nbsp;<br>//定义返回结果的函数;<br>function&nbsp;getString_Result(result){<br>//result就为返回的结果;<br>trace(result);<br>}<br>//定义返回状态的函数,此为可选的;<br>function&nbsp;getString_Status(error){&nbsp;<br>trace("getString_Status");<br>trace(error.code);<br>trace(error.description);&nbsp;<br>trace(error.details);&nbsp;<br>}<br><br>//调用函数;<br>getString("kinglong");<br></div>
</div>
<br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_4316')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_4316);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_4316);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_4316);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_4316 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">//=====================================================;<br>//服务端方法定义(我这里以Coldfusion&nbsp;Component为例,其他版本请参考相应的资料)<br>//=====================================================;<br>&lt;!---文件名为myservice.cfc---&gt;<br>&lt;cfcomponent&nbsp;displayname="我的服务"&gt;&nbsp;<br>&lt;!---定义了getString方法,需将access设为remote,否则Flash&nbsp;remoting无法调用此方法---&gt;<br>&lt;cffunction&nbsp;name="getString"&nbsp;access="remote"&nbsp;returntype="string"&gt;&nbsp;<br>&lt;cfargument&nbsp;name="name"&nbsp;type="string"&nbsp;required="true"&gt;&nbsp;<br>&lt;cfset&nbsp;myResult&nbsp;=&nbsp;arguments.name&nbsp;&amp;&nbsp;",欢迎你!"&gt;&nbsp;<br>&lt;cfreturn&nbsp;myResult&gt;&nbsp;<br>&lt;/cffunction&gt;&nbsp;<br>&lt;/cfcomponent&gt;&nbsp;<br></div>
</div>
<br><br>另附上Flash&nbsp;Remoting的在线帮助文件(<a href="http://livedocs.macromedia.com/flashremoting/" target=_blank><font color=#002c99><u>Flash&nbsp;Remoting&nbsp;LiveDocs</u></font></a>),MM网站上的<a href="http://www.macromedia.com/cfusion/search/index.cfm?loc=en_us&amp;term=remoting" target=_blank><font color=#002c99><u>Remoting相关的资料</u></font></a>.<br><br>三&nbsp;WebService篇<br>个人觉得WebService的数据访问速度，仅次于Remoting，但WebService是一种通用型的接口，一般服务端技术都支持的!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebService的优点：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.WebService的接口支持比较广泛（Java，ASP.Net，PHP，Coldfusion-我下面举例用）；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.WebService是一个通用型的接口，所以服务端写的接口，不局限于Flash使用，其他程序也可以调用，"一举两得"!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.WebService和Remoting一样，支持多种数据类型！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.今天还发现FMS除了支持Remoting接口，也支持WebService接口了:)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebService的缺点：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flash客户端到是没有什么问题，Flash的开发工具就自带了(WebServiceConnector&nbsp;组件),但服务端虽说大多都支持这个接口技术，但除了Coldfusion生成WebService方便外，其他的实现都挺复杂的！<br><br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_4415')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_4415);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_4415);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_4415);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_4415 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">//=======================================;<br>//&nbsp;Flash客户端代码；<br>//&nbsp;对于代码不是很熟悉的可以直接使用WebServiceConnector&nbsp;组件，进行设置设置就可以了。<br>//&nbsp;我这里主要是写用代码来调用WebService方法。<br>//&nbsp;当然这个前提是你要把WebServiceConnector&nbsp;组件先放到库里，否则类就无法引用了。<br>//=======================================;<br>stop();<br>//引用WebService类;<br>import&nbsp;mx.services.WebService;<br>//定义WebService的路径;<br>var&nbsp;ws_url:String&nbsp;=&nbsp;<a href="http://localhost:8500/klstudio/myservice.cfc?wsdl;" target=_blank><font color=#002c99><u>http://localhost:8500/klstudio/myservice.cfc?wsdl;</u></font></a><br>//定义WebService对象;<br>var&nbsp;ws:WebService&nbsp;=&nbsp;new&nbsp;WebService(ws_url);<br>//调用WebService方法;<br>var&nbsp;callObject&nbsp;=&nbsp;ws.getSting("kinglong");<br>//设置返回结果对象；<br>callObject.onResult&nbsp;=&nbsp;function(result){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace("result:"+result);<br>}<br>//如果调用错误返回信息(这个是可选的)；<br>callObject.onFault&nbsp;=&nbsp;function(fault){<br>&nbsp;&nbsp;&nbsp;&nbsp;trace("fault:"+fault.faultstring);<br>}</div>
</div>
<br><br>注意：如果返回结果是一个数据集的话，那每个字段名都要用大写，不管你的服务端是否大写!<br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_8197')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_8197);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_8197);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_8197);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_8197 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">================================================================<br>&nbsp;&nbsp;服务端方法定义(我这里仍以Coldfusion&nbsp;Component为例,其他版本请参考上面提供的连接)<br>================================================================<br>&lt;!---文件名为myservice.cfc---&gt;<br>&lt;cfcomponent&nbsp;displayname="我的服务"&gt;&nbsp;<br>&nbsp;&nbsp;&lt;!---定义了getString方法,需将access设为remote,否则WebService无法调用此方法---&gt;<br>&nbsp;&nbsp;&lt;cffunction&nbsp;name="getString"&nbsp;access="remote"&nbsp;returntype="string"&gt;&nbsp;<br>&nbsp;&nbsp;&nbsp;&lt;cfargument&nbsp;name="name"&nbsp;type="string"&nbsp;required="true"&gt;&nbsp;<br>&nbsp;&nbsp;&nbsp;&lt;cfset&nbsp;myResult&nbsp;=&nbsp;arguments.name&nbsp;&amp;&nbsp;",欢迎你!"&gt;&nbsp;<br>&nbsp;&nbsp;&nbsp;&lt;cfreturn&nbsp;myResult&gt;&nbsp;<br>&nbsp;&nbsp;&lt;/cffunction&gt;&nbsp;<br>&lt;/cfcomponent&gt;&nbsp;</div>
</div>
<br><br>四、XMLSocket篇<br><br>XMLSocket主要用于与服务端进行即时通信，目前的应用领域主要是Flash文本聊天和Flash在线游戏等方面。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;XMLSocket的优点：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;1、能和服务端即时通信；<br><br>&nbsp;&nbsp;&nbsp;&nbsp;2、Flash&nbsp;Player&nbsp;5.0以上的版本内置类，不需另装组件或插件；<br><br>&nbsp;&nbsp;&nbsp;&nbsp;3、因为XMLSocket就是相当于一个Socket客户端，所以一般的中间件都支持的（如java，.Net等）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;XMLSocket的缺点：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;1、XMLSocket只能传字符串或xml格式的文本，数据类型单一；<br><br>&nbsp;&nbsp;&nbsp;&nbsp;2、XMLSocket服务端自行开发的话，需要对Socket技术比较了解才行，好在网上有现成的服务端软件（商业的XMLSocket&nbsp;Server&nbsp;有<a href="http://www.moock.org/unity/" target=_blank><font color=#002c99><u>Unity</u></font></a>、<a href="http://www.xadra.com/xadra_home.html" target=_blank><font color=#002c99><u>Fortress</u></font></a>；开源的Server&nbsp;有<a href="http://www.oregano-server.org/" target=_blank><font color=#002c99><u>Oregano&nbsp;Multiuser&nbsp;Server</u></font></a>）；<br><br>&nbsp;&nbsp;&nbsp;&nbsp;3、还有就是XMLSocket的80端口与flash安全策略问题。（<a href="http://www.riarock.com/serendipity/index.php?/archives/23-XMLSocket-socket-server-80-port.html" target=_blank><font color=#002c99><u>网上有一个解决方法</u></font></a>，不知是否可行，请自行验证）<br><br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_2112')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_2112);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_2112);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_2112);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_2112 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">//=======================================;<br><br>//&nbsp;Flash客户端（以Flash文本聊天为例）;<br><br>//=======================================;<br><br>var&nbsp;paramObj:Object&nbsp;=&nbsp;new&nbsp;Object();<br><br>//命令分隔符；<br><br>paramObj.CommandDelimiters&nbsp;=&nbsp;"-@@##@@-";<br><br>//用户列表分隔符；<br><br>paramObj.PeopleDelimiters&nbsp;=&nbsp;"-@#@-";<br><br>//建立XMLSocket对象；<br><br>var&nbsp;socket:XMLSocket&nbsp;=&nbsp;new&nbsp;XMLSocket();<br><br>//连接状态事件；<br><br>socket.onConnect&nbsp;=&nbsp;function(success)&nbsp;{<br><br>trace("socket.onConnect:"+success);<br><br>if&nbsp;(!success)&nbsp;{<br><br>trace("服务器连接失败,请检查网络状态!");<br><br>}<br><br>};<br><br>//关闭事件；<br><br>socket.onClose&nbsp;=&nbsp;function()&nbsp;{<br><br>trace("服务端已关闭！");<br><br>logoutChat();<br><br>};<br><br>//数据通信事件；<br><br>socket.onData&nbsp;=&nbsp;function(src)&nbsp;{<br><br>//trace("socket.onData:"+src);<br><br>doCommand(getCmdArrayByMsg(trim(src)));<br><br>};<br><br>//用户登录；<br><br>function&nbsp;loginChat():Void&nbsp;{<br><br>//连接Socket服务端；<br><br>socket.connect(&#8220;localhost&#8221;,&nbsp;&#8220;8888&#8221;);<br><br>sendSocket("INFO"+paramObj.CommandDelimiters+msg);<br><br>}<br><br>//用户注销；<br><br>function&nbsp;logoutChat(b:Boolean):Void&nbsp;{<br><br>sendSocket("QUIT");<br><br>}<br><br>//显示聊天信息；<br><br>function&nbsp;showChat(msg:String):Void&nbsp;{<br><br>trace(&#8220;聊天信息：&#8221;+msg);<br><br>}<br><br>//发送聊天信息；<br><br>function&nbsp;sendChat(msg:String):Void{<br><br>sendSocket("MSG"+paramObj.CommandDelimiters+msg+paramObj.CommandDelimiters+msg);<br><br>}<br><br>//向服务端发送信息；<br><br>function&nbsp;sendSocket(msg:String):Void&nbsp;{<br><br>socket.send(msg+"\r");<br><br>}<br><br><br>//处理服务端返回信息；<br><br>function&nbsp;getCmdArrayByMsg(msg:String):Array&nbsp;{<br>if&nbsp;(msg.charCodeAt(0)&nbsp;==&nbsp;13&nbsp;&amp;&amp;&nbsp;msg.charCodeAt(1)&nbsp;==&nbsp;10)&nbsp;{<br>msg&nbsp;=&nbsp;msg.substr(2);<br>}<br>return&nbsp;msg.split(paramObj.CommandDelimiters);<br>}<br><br><br>function&nbsp;doCommand(arr:Array):Void&nbsp;{<br><br>switch&nbsp;(arr[0])&nbsp;{<br><br>case&nbsp;"MSG"&nbsp;:<br><br>showChat(arr[1]);<br><br>break;<br><br>case&nbsp;"TAKEN"&nbsp;:<br><br>trace("你的登录名已经有了,请重新换一个登录名!");<br><br>break;<br><br>case&nbsp;"PEOPLE"&nbsp;:<br><br>doPeople(arr[1]);<br><br>break;<br><br>}<br><br>}<br><br>//显示在线用户列表；<br><br>function&nbsp;doPeople(msg:String):Void&nbsp;{<br><br>var&nbsp;people_arr:Array&nbsp;=&nbsp;msg.split(paramObj.PeopleDelimiters);<br><br>trace(people_arr);<br><br>}<br></div>
</div>
<br><br>//上面与XMLSocket有关的主要代码，显示方面自己添加相关组件就行了！<br><br>//有一个注意点，在flash向服务端发送的命令的最后一定要加上&#8220;\r&#8221;，否则服务端无法收到消息（我的服务端是用Java开发的）<br><br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_8085')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_8085);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_8085);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_8085);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_8085 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">//=======================================;<br><br>//&nbsp;服务端代码(我用java开发的，其他版本自行研究);<br><br>//&nbsp;ChatServer.java<br><br>//=======================================;<br><br>package&nbsp;com.klstudio.socket.chat;<br><br><br>import&nbsp;java.io.IOException;<br><br>import&nbsp;java.net.ServerSocket;<br><br>import&nbsp;java.net.Socket;<br><br>import&nbsp;java.util.Vector;<br><br><br>//import&nbsp;com.klstudio.util.Logger;<br><br><br>/**<br><br>*&nbsp;@author&nbsp;kinglong<br><br>*&nbsp;<br><br>*&nbsp;TODO&nbsp;要更改此生成的类型注释的模板，请转至窗口－首选项－&nbsp;Java&nbsp;－代码样式－代码模板<br><br>*/<br><br>public&nbsp;class&nbsp;ChatServer&nbsp;{<br><br>//private&nbsp;Logger&nbsp;logger;<br><br>private&nbsp;static&nbsp;Vector&nbsp;clients&nbsp;=&nbsp;new&nbsp;Vector();<br><br>private&nbsp;static&nbsp;ServerSocket&nbsp;server&nbsp;=&nbsp;null;<br><br>private&nbsp;static&nbsp;Socket&nbsp;socket&nbsp;=&nbsp;null;<br><br>public&nbsp;static&nbsp;String&nbsp;CommandDelimiters&nbsp;=&nbsp;"-@@##@@-";<br><br>public&nbsp;static&nbsp;String&nbsp;PeopleDelimiters&nbsp;=&nbsp;"-@#@-";<br><br><br>public&nbsp;ChatServer()&nbsp;{<br><br>}<br><br><br>public&nbsp;static&nbsp;void&nbsp;notifyRoom()&nbsp;{<br><br>StringBuffer&nbsp;people&nbsp;=&nbsp;new&nbsp;StringBuffer("PEOPLE"+CommandDelimiters+"所有的人");<br><br>for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;clients.size();&nbsp;i++)&nbsp;{<br><br>Client&nbsp;client&nbsp;=&nbsp;(Client)&nbsp;clients.elementAt(i);<br><br>people.append(PeopleDelimiters+client.getClientName());<br><br>}<br><br>sendClients(people);<br><br>}<br><br>public&nbsp;staticboolean&nbsp;checkName(Client&nbsp;newClient){<br><br>for(int&nbsp;i=0;i&lt;clients.size();i++){<br><br>Client&nbsp;client&nbsp;=&nbsp;(Client)&nbsp;clients.elementAt(i);<br><br>if(client&nbsp;!=&nbsp;newClient&nbsp;&amp;&amp;&nbsp;client.getClientName().equals(newClient.getClientName())){<br><br>return&nbsp;false;<br><br>}<br><br>}<br><br>return&nbsp;true;<br><br>}<br><br>public&nbsp;static&nbsp;void&nbsp;closeAll(){<br><br>while(clients.size()&gt;0){<br><br>Client&nbsp;client&nbsp;=&nbsp;(Client)&nbsp;clients.firstElement();<br><br>try&nbsp;{<br><br>client.getClientSocket().close();<br><br>}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br><br>//&nbsp;TODO&nbsp;自动生成&nbsp;catch&nbsp;块<br><br>//Logger&nbsp;logger&nbsp;=&nbsp;new&nbsp;Logger(System.out);<br><br>//logger.log("错误-"&nbsp;+&nbsp;e.toString());<br><br>}&nbsp;finally&nbsp;{<br><br>clients.removeElement(client);<br><br>}<br><br>}<br><br>}<br><br>public&nbsp;static&nbsp;synchronized&nbsp;void&nbsp;disconnect(Client&nbsp;client)&nbsp;{<br><br>client.send(new&nbsp;StringBuffer("QUIT"));<br><br>try&nbsp;{<br><br>client.getClientSocket().close();<br><br>}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br><br>//&nbsp;TODO&nbsp;自动生成&nbsp;catch&nbsp;块<br><br>//Logger&nbsp;logger&nbsp;=&nbsp;new&nbsp;Logger(System.out);<br><br>//logger.log("错误-"&nbsp;+&nbsp;e.toString());<br><br>}&nbsp;finally{<br><br>clients.removeElement(client);<br><br>}<br><br><br>}<br><br><br>public&nbsp;static&nbsp;synchronized&nbsp;void&nbsp;sendClients(StringBuffer&nbsp;sb)&nbsp;{<br><br>for(int&nbsp;i=0;i&lt;clients.size();i++){<br><br>Client&nbsp;client&nbsp;=&nbsp;(Client)&nbsp;clients.elementAt(i);<br><br>client.send(sb);<br><br>}<br><br>}<br><br><br>public&nbsp;static&nbsp;synchronized&nbsp;void&nbsp;sendClients(StringBuffer&nbsp;sb,String&nbsp;ownerName,String&nbsp;toName)&nbsp;{<br><br>for(int&nbsp;i=0;i&lt;clients.size();i++){<br><br>Client&nbsp;client&nbsp;=&nbsp;(Client)&nbsp;clients.elementAt(i);<br><br>if(toName.equals(client.getClientName())&nbsp;||&nbsp;toName.equals("所有的人")&nbsp;||&nbsp;ownerName.equals(client.getClientName())){<br><br>client.send(sb);<br><br>}<br><br>}<br><br>}<br><br><br>public&nbsp;static&nbsp;synchronized&nbsp;void&nbsp;sendClients(Client&nbsp;ownerClient)&nbsp;{<br><br>for(int&nbsp;i=0;i&lt;clients.size();i++){<br><br>Client&nbsp;client&nbsp;=&nbsp;(Client)&nbsp;clients.elementAt(i);<br><br>if(client.getClientName().equals(ownerClient.getClientName())){<br><br>client.send(new&nbsp;StringBuffer("MSG"+CommandDelimiters+"系统信息&gt;欢迎你进入!"));<br><br>}else{<br><br>client.send(new&nbsp;StringBuffer("MSG"+CommandDelimiters+"系统信息&gt;["+ownerClient.getClientName()+"]用户进入!"));<br><br>}<br><br>}<br><br>}<br><br>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<br><br>int&nbsp;port&nbsp;=&nbsp;8888;&nbsp;<br><br>if(args.length&gt;0){<br><br>port&nbsp;=&nbsp;Integer.parseInt(args[0]);<br><br>}<br><br>//Logger&nbsp;logger&nbsp;=&nbsp;new&nbsp;Logger(System.out);<br><br>//logger.log("信息-ChatServer["+port+"]服务正在启动...");<br><br>try&nbsp;{<br><br>server&nbsp;=&nbsp;new&nbsp;ServerSocket(port);<br><br>}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br><br>//&nbsp;TODO&nbsp;自动生成&nbsp;catch&nbsp;块<br><br>//logger.log("错误-"+e.toString());<br><br>}<br><br>while(true){<br><br>if(clients.size()&lt;5){<br><br>try&nbsp;{<br><br>socket&nbsp;=&nbsp;server.accept();<br><br>if(socket&nbsp;!=&nbsp;null){<br><br>//logger.log("信息-"+socket.toString()+"连接");<br><br>}<br><br>}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br><br>//&nbsp;TODO&nbsp;自动生成&nbsp;catch&nbsp;块<br><br>//logger.log("错误-"+e.toString());<br><br>}<br><br>int&nbsp;i=0;<br><br>do{<br><br>Client&nbsp;client&nbsp;=&nbsp;new&nbsp;Client(socket);<br><br>if(client.getClientName()&nbsp;!=&nbsp;null){<br><br>clients.addElement(client);<br><br>if(checkName(client)){<br><br>//logger.log("信息-"+"目前有["+clients.size()+"]个用户已连接");<br><br>sendClients(client);<br><br>client.start();<br><br>notifyRoom();<br><br>}else{<br><br>client.send(new&nbsp;StringBuffer("TAKEN"));<br><br>disconnect(client);<br><br>}<br><br>i++;<br><br>}<br><br>break;<br><br>}while(i&lt;clients.size());<br><br><br>}else{<br><br>try&nbsp;{<br><br>Thread.sleep(200);<br><br>}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br><br>//&nbsp;TODO&nbsp;自动生成&nbsp;catch&nbsp;块<br><br>//logger.log("错误-"+e.toString());<br><br>}<br><br>}<br><br>}<br><br>}<br><br>}</div>
</div>
<br><br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_8515')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_8515);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_8515);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_8515);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_8515 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">//=======================================;<br><br>//&nbsp;Client.java<br><br>//=======================================;<br><br>/*<br><br>*&nbsp;创建日期2005-10-10<br><br>*<br><br>*&nbsp;TODO&nbsp;要更改此生成的文件的模板，请转至<br><br>*&nbsp;窗口－首选项－&nbsp;Java&nbsp;－代码样式－代码模板<br><br>*/<br><br>package&nbsp;com.klstudio.socket.chat;<br><br><br>import&nbsp;java.io.BufferedReader;<br><br>import&nbsp;java.io.IOException;<br><br>import&nbsp;java.io.InputStreamReader;<br><br>import&nbsp;java.io.PrintStream;<br><br>import&nbsp;java.net.Socket;<br><br>//import&nbsp;com.klstudio.util.Logger;<br><br><br>/**<br><br>*&nbsp;@author&nbsp;kinglong<br><br>*&nbsp;<br><br>*&nbsp;TODO&nbsp;要更改此生成的类型注释的模板，请转至窗口－首选项－&nbsp;Java&nbsp;－代码样式－代码模板<br><br>*/<br><br>public&nbsp;class&nbsp;Client&nbsp;extends&nbsp;Thread&nbsp;{<br><br>private&nbsp;Socket&nbsp;clientSocket;<br><br>private&nbsp;String&nbsp;clientName;<br><br>private&nbsp;String&nbsp;clientIp;<br><br>private&nbsp;BufferedReader&nbsp;br;<br><br>private&nbsp;PrintStream&nbsp;ps;<br><br>//private&nbsp;Logger&nbsp;logger;<br><br>private&nbsp;ChatServer&nbsp;server;<br><br><br>public&nbsp;Client(Socket&nbsp;socket)&nbsp;{<br><br>//this.logger&nbsp;=&nbsp;new&nbsp;Logger(System.out);<br><br>this.clientSocket&nbsp;=&nbsp;socket;<br><br>try&nbsp;{<br><br>this.br&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;InputStreamReader(socket.getInputStream(),"utf-8"));<br><br>this.ps&nbsp;=&nbsp;new&nbsp;PrintStream(socket.getOutputStream(),true,"utf-8");<br><br>String&nbsp;info&nbsp;=&nbsp;this.br.readLine();<br><br><br>if(info!=null){<br><br>String[]&nbsp;info_arr&nbsp;=&nbsp;info.split(ChatServer.CommandDelimiters);<br><br>if(info_arr.length&gt;1){<br><br>this.clientName&nbsp;=&nbsp;info_arr[1];<br><br>}<br><br>this.clientIp&nbsp;=&nbsp;socket.getRemoteSocketAddress().toString();<br><br>}else{<br><br>socket.close();<br><br>}<br><br>}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br><br>//&nbsp;TODO&nbsp;自动生成&nbsp;catch&nbsp;块<br><br>//this.logger.log("错误-"&nbsp;+&nbsp;e.toString());<br><br>}<br><br>}<br><br><br>/**<br><br>*&nbsp;@return&nbsp;返回&nbsp;ip。<br><br>*/<br><br>public&nbsp;String&nbsp;getClientIp()&nbsp;{<br><br>return&nbsp;clientIp;<br><br>}<br><br>/**<br><br>*&nbsp;@return&nbsp;返回&nbsp;name。<br><br>*/<br><br>public&nbsp;String&nbsp;getClientName()&nbsp;{<br><br>return&nbsp;clientName;<br><br>}<br><br><br>/**<br><br>*&nbsp;@return&nbsp;返回&nbsp;socket。<br><br>*/<br><br>public&nbsp;Socket&nbsp;getClientSocket()&nbsp;{<br><br>return&nbsp;clientSocket;<br><br>}<br><br>public&nbsp;void&nbsp;send(StringBuffer&nbsp;msg){<br><br>this.ps.println(msg.toString()+"\0");<br><br>//this.ps.flush();<br><br>}<br><br>public&nbsp;void&nbsp;run()&nbsp;{<br><br>while&nbsp;(true)&nbsp;{<br><br>String&nbsp;line&nbsp;=&nbsp;null;<br><br>try&nbsp;{<br><br>line&nbsp;=&nbsp;this.br.readLine();<br><br>}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br><br>//&nbsp;TODO&nbsp;自动生成&nbsp;catch&nbsp;块<br><br>//this.logger.log("错误-"&nbsp;+&nbsp;e.toString());<br><br>ChatServer.disconnect(this);<br><br>ChatServer.notifyRoom();<br><br>return;<br><br>}<br><br>if&nbsp;(line&nbsp;==&nbsp;null)&nbsp;{<br><br>//this.logger.log("信息-["&nbsp;+&nbsp;this.clientName&nbsp;+&nbsp;this.clientIp&nbsp;+&nbsp;"]用户离开!");<br><br>ChatServer.disconnect(this);<br><br>ChatServer.notifyRoom();<br><br>if(this.clientName&nbsp;!=&nbsp;null){<br><br>ChatServer.sendClients(new&nbsp;StringBuffer("MSG"+ChatServer.CommandDelimiters+"系统信息&gt;["&nbsp;+&nbsp;this.clientName&nbsp;+&nbsp;"]用户离开!"));<br><br>}<br><br>return;<br><br>}<br><br>//this.logger.log("信息-"+line);<br><br>String[]&nbsp;cmd_arr&nbsp;=&nbsp;line.split(ChatServer.CommandDelimiters);<br><br>String&nbsp;keyword&nbsp;=&nbsp;cmd_arr[0];<br><br>keyword&nbsp;=&nbsp;keyword.substring(1);<br><br>if(keyword.equals("MSG")){<br><br>StringBuffer&nbsp;msg&nbsp;=&nbsp;new&nbsp;StringBuffer("MSG"+ChatServer.CommandDelimiters);<br><br>msg.append(this.clientName+"&gt;");<br><br>msg.append(cmd_arr[1]);<br><br>ChatServer.sendClients(msg,this.clientName,cmd_arr[2]);<br><br>}else&nbsp;if(keyword.equals("QUIT")){<br><br>//this.logger.log("信息-["&nbsp;+&nbsp;this.clientName&nbsp;+&nbsp;this.clientIp&nbsp;+&nbsp;"]用户离开!");<br><br>ChatServer.disconnect(this);<br><br>ChatServer.notifyRoom();<br><br>ChatServer.sendClients(new&nbsp;StringBuffer("MSG"+ChatServer.CommandDelimiters+"系统信息&gt;["&nbsp;+&nbsp;this.clientName&nbsp;+&nbsp;"]用户离开!"));<br><br>this.stop();<br><br>return;<br><br>}<br><br>}<br><br>}<br><br>}<br></div>
</div>
<br><br>五、FlashCom（FMS）篇<br>FlashCom（FMS）主要用于与服务端进行流媒体通信，目前应用领域就是Flash流媒体播放，Flash在线直播，Flash视频音频聊天，Flash视频会议，Flash在线游戏等。<br>FlashCom的运行环境(FMS的运行环境)：<br><br>1、Windows操作系统：Windows&nbsp;2000&nbsp;Server或者Windows&nbsp;NT&nbsp;4.0&nbsp;Server（sp6）；<br>2、Linux操作系统：Red&nbsp;Hat&nbsp;Linux&nbsp;7.3&nbsp;或者&nbsp;8.0；<br>3、服务器的CPU是Pentium&nbsp;III&nbsp;500&nbsp;MHz或者更高（推荐值是双个Pentium&nbsp;4&nbsp;CPU）；<br>4、服务器的内存是256M&nbsp;RAM&nbsp;或者更高（推荐值是512M）。<br>FlashCom（FMS）的优点：<br>1、能够实现即时视频音频通信（当然它也支持文本通信的）；<br>2、能够流媒体同步播放（也叫在线直播）；<br>3、能够通过Flash&nbsp;Player（6.0以上版本）录制视频音频，无需其他客户端；<br>4、能够实现客户端实现之间的控制（如会议主持人权限）。<br>FlashCom（FMS）的缺点：<br>1、FlashCom（FMS）服务端软件是MM公司的产品，需要花银子去买的（一笔不小的投入），好在现在有一个正在完善中的开源项目——RED5；<br>2、由于是流媒体服务端软件，所以对服务器的带宽，内存，以及CPU也是很高的要求的（上面已经作说明了）；<br>3、同时在线视频通信的人数不能太多。<br><br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_7671')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_7671);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_7671);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_7671);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_7671 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HE