﻿<?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>Sun, 14 Mar 2010 19:03:05 GMT</lastBuildDate><pubDate>Sun, 14 Mar 2010 19:03:05 GMT</pubDate><ttl>60</ttl><item><title>求windows xp 繁体版</title><link>http://www.cppblog.com/twzheng/articles/109710.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sun, 14 Mar 2010 16:05:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/109710.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/109710.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/109710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/109710.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/109710.html</trackback:ping><description><![CDATA[求windows xp 繁体版，最好是台湾版的，要能一步步的手动安装(想装双系统)<br><br>找了好几天了，很多资源都下不动<br><br>今天好不容易下了一个，但是香港版的，且安装到选择盘符时，键盘所有键都不能使用，所以还是无法安装<br><br>谢谢各位大哥大姐帮帮忙，小弟感激不尽！<img src ="http://www.cppblog.com/twzheng/aggbug/109710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">谭文政</a> 2010-03-15 00:05 <a href="http://www.cppblog.com/twzheng/articles/109710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>1</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; HEIGHT: 150px">//=======================================;<br>//&nbsp;Flash客户端（以简单的在线录制视频为例）<br>//=======================================;<br>stop();<br>var&nbsp;nc:NetConnection&nbsp;=&nbsp;new&nbsp;NetConnection();<br>var&nbsp;ns:NetStream;<br>var&nbsp;cam:Camera&nbsp;=&nbsp;Camera.get();<br>var&nbsp;mic:Microphone&nbsp;=&nbsp;Microphone.get();<br>//预览本地摄像头视频;<br>video_box.attachVideo(cam);<br>//初始化NetStream;<br>function&nbsp;initNetStream():Void&nbsp;{<br>ns&nbsp;=&nbsp;new&nbsp;NetStream(nc);<br>//设置2秒的缓冲时间;<br>ns.setBufferTime(2);<br>//使用NetStream加载视频和音频对象;<br>ns.attachVideo(cam);<br>ns.attachAudio(mic);<br>//NetStream状态信息;<br>ns.onStatus&nbsp;=&nbsp;function(info:Object)&nbsp;{<br>trace("ns.onStatus:"+info.code);<br>};<br>}<br>//录制视频音频;<br>function&nbsp;recordStream(){<br>ns.publish("kinglong","record");<br>}<br>//停止录制;<br>function&nbsp;stopStream(){<br>ns.close();<br>}<br>//删除视频音频文件;<br>function&nbsp;deleteStream(){<br>nc.call("clearStream",null,"kinglong");<br>}<br>//NetConnection状态信息;<br>nc.onStatus&nbsp;=&nbsp;function(info:Object)&nbsp;{<br>trace("nc.onStatus:"+info.code);<br>switch&nbsp;(info.code)&nbsp;{<br>case&nbsp;"NetConnection.Connect.Success"&nbsp;:<br>initNetStream();<br>break;<br>}<br>};<br>//连接FlashCom服务器<br>nc.connect("rtmp:/"+"recordstream");</div>
</div>
<br><br>
<script type=text/javascript>window.attachEvent("onload",function (){AutoSizeDIV('CODE_2362')})</script>
<div>
<div class=code_head align=right><a href="javascript:CopyText(document.all.CODE_2362);"><font color=#002c99><u>[复制]</u></font></a>&nbsp;&nbsp;<a href="javascript:runCode(document.all.CODE_2362);"><font color=#002c99><u>[运行]</u></font></a>&nbsp;&nbsp;<a href="javascript:saveCode(document.all.CODE_2362);"><font color=#002c99><u>[保存]</u></font></a></div>
<div class=code_main id=CODE_2362 style="OVERFLOW-Y: auto; OVERFLOW-X: hidden; HEIGHT: 150px">//=======================================;<br>//&nbsp;FlashCom（FMS）服务端代码<br>//将下列代码存成main.asc文件（此文件名固定），在FlashCom的applications目录下建立一个recordstream目录（对应着客户端的&#8221;recodstream&#8221;），并将main.asc放在这个目录中。<br>//=======================================;<br>application.onAppStart&nbsp;=&nbsp;function(){<br>}<br>application.onAppStop&nbsp;=&nbsp;function(){<br>}<br>application.onConnect&nbsp;=&nbsp;function(client){<br>application.acceptConnection(client);<br>}<br>application.onDisconnect&nbsp;=&nbsp;function(client){<br>}<br>//=======================================;<br>//获取flv文件时间长度；<br>function&nbsp;getStreamLength(name)&nbsp;{<br>return&nbsp;Stream.length(name);;<br>}<br>//=======================================;<br>//删除flv文件；<br>function&nbsp;clearStream(name)&nbsp;{<br>trace("clearStream("+name+");");<br>var&nbsp;stream&nbsp;=&nbsp;Stream.get(name);<br>return&nbsp;stream.clear();<br>}<br>//=======================================;<br>//设置Client.prototype;<br>//=======================================;<br>Client.prototype.getStreamLength&nbsp;=&nbsp;getStreamLength;<br>Client.prototype.clearStream&nbsp;=&nbsp;clearStream</div>
</div>
<br><br>FMS官方中文网站相关资料地址:<br><a href="http://www.macromedia.com/cn/software/flashmediaserver/productinfo/pricing" target=_blank><font color=#002c99><u>http://www.macromedia.com/cn/software ... er/productinfo/pricing</u></font></a> 
<img src ="http://www.cppblog.com/twzheng/aggbug/29820.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-12 11:18 <a href="http://www.cppblog.com/twzheng/articles/29820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于FMS的在线录制例子... </title><link>http://www.cppblog.com/twzheng/articles/29818.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sun, 12 Aug 2007 02:52:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/29818.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/29818.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/29818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/29818.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/29818.html</trackback:ping><description><![CDATA[<div class=postTitle>[转] <a class=postTitle2 id=viewpost1_TitleUrl href="http://www.cnblogs.com/gdgzboy/archive/2007/01/20/625802.html"><u><font color=#810081>基于FMS的在线录制例子...</font></u></a> </div>
在FMS安装目录下的appliaction目录下建立test1文件夹...<br><br>然后打开flash 8插入以下代码...<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;Record()<br></span><span style="COLOR: #008080">&nbsp;&nbsp;2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;video_r._visible&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;video_p._visible&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;play_bt.enabled&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;record_bt.label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">停止</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rapStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">recording</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;videoinfo.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文件信息：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;videoName&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.flv</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rap_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前状态：正在录制</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;netStream.publish(videoName,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">record</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;RecordInterval&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;setInterval(RecordTime,&nbsp;</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;12</span>&nbsp;<span style="COLOR: #000000">}&nbsp;<br></span><span style="COLOR: #008080">&nbsp;13</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;RecordStop()<br></span><span style="COLOR: #008080">&nbsp;14</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rap_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前状态：录制完成</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;record_bt.label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">录制</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;play_bt.enabled&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;clearInterval(RecordInterval);<br></span><span style="COLOR: #008080">&nbsp;19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;timeNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;netStream.close();<br></span><span style="COLOR: #008080">&nbsp;21</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rapStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">recordstop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;22</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;videolist.addItem({label:&nbsp;videoName});<br></span><span style="COLOR: #008080">&nbsp;23</span>&nbsp;<span style="COLOR: #000000">}&nbsp;<br></span><span style="COLOR: #008080">&nbsp;24</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;RecordTime()<br></span><span style="COLOR: #008080">&nbsp;25</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;26</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">timeNum;<br></span><span style="COLOR: #008080">&nbsp;27</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rap_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前状态：录制中&nbsp;-&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;Math.floor(timeNum&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">分</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;timeNum&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">秒</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;28</span>&nbsp;<span style="COLOR: #000000">}&nbsp;<br></span><span style="COLOR: #008080">&nbsp;29</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;PlayVideo()<br></span><span style="COLOR: #008080">&nbsp;30</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;31</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;video_r._visible&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;32</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;video_p._visible&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;33</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;record_bt.enabled&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;34</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;play_bt.label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">停止</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;35</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;playvideo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;videolist.selectedItem.label;<br></span><span style="COLOR: #008080">&nbsp;36</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;video_p.attachVideo(netStream);<br></span><span style="COLOR: #008080">&nbsp;37</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rapStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">playing</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;38</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;netStream.play(playvideo);<br></span><span style="COLOR: #008080">&nbsp;39</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;netStream.onStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;(PlayInfo)<br></span><span style="COLOR: #008080">&nbsp;40</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;41</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(PlayInfo.code&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">NetStream.Play.Stop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">&nbsp;42</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;43</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rapStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">playstop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;44</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netStream.close();<br></span><span style="COLOR: #008080">&nbsp;45</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rap_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前状态：播放完毕</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;46</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;play_bt.label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">播放</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;47</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record_bt.enabled&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;48</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="COLOR: #008080">&nbsp;49</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;};<br></span><span style="COLOR: #008080">&nbsp;50</span>&nbsp;<span style="COLOR: #000000">}&nbsp;<br></span><span style="COLOR: #008080">&nbsp;51</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;PlayStop()<br></span><span style="COLOR: #008080">&nbsp;52</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;53</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;video_r._visible&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;54</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;video_p._visible&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;55</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;video_r.attachVideo(my_cam);<br></span><span style="COLOR: #008080">&nbsp;56</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;record_bt.enabled&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;57</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;play_bt.label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">播放</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;58</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rapStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">playstop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;59</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;netStream.close();<br></span><span style="COLOR: #008080">&nbsp;60</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rap_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前状态：播放停止</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;61</span>&nbsp;<span style="COLOR: #000000">}&nbsp;<br></span><span style="COLOR: #008080">&nbsp;62</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;ser_url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">rtmp://192.168.1.68/r_p</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;63</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;rec_date&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Date();<br></span><span style="COLOR: #008080">&nbsp;64</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;videoName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;String(rec_date.getFullYear())&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;String(rec_date.getMonth()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;String(rec_date.getDate())&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;String(rec_date.getHours())&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;String(rec_date.getMinutes())&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;String(rec_date.getSeconds())&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;String(rec_date.getMilliseconds());<br></span><span style="COLOR: #008080">&nbsp;65</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;netConn&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;NetConnection();<br></span><span style="COLOR: #008080">&nbsp;66</span>&nbsp;<span style="COLOR: #000000">netConn.connect(ser_url);<br></span><span style="COLOR: #008080">&nbsp;67</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;netStream&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;NetStream(netConn);<br></span><span style="COLOR: #008080">&nbsp;68</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;my_cam&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Camera.get();<br></span><span style="COLOR: #008080">&nbsp;69</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(my_cam&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">&nbsp;70</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;71</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;rap_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前状态：没有找到MAC</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;72</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">&nbsp;73</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;74</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;75</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;video_r.attachVideo(my_cam);<br></span><span style="COLOR: #008080">&nbsp;76</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;my_cam.setQuality(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;77</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;my_cam.setKeyFrameInterval(</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;78</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;my_cam.setLoopback(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;79</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;my_cam.setMode(</span><span style="COLOR: #000000">320</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">240</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;80</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;netStream.attachVideo(my_cam);<br></span><span style="COLOR: #008080">&nbsp;81</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;my_cam.onStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(infoObj:Object)<br></span><span style="COLOR: #008080">&nbsp;82</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;83</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(my_cam.muted)&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;84</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;If&nbsp;user&nbsp;is&nbsp;denied&nbsp;access&nbsp;to&nbsp;their&nbsp;Camera,&nbsp;you&nbsp;can&nbsp;display&nbsp;an&nbsp;error&nbsp;message&nbsp;here.&nbsp;You&nbsp;can&nbsp;display&nbsp;the&nbsp;user's&nbsp;Camera/Privacy&nbsp;settings&nbsp;again&nbsp;using&nbsp;System.showSettings(0);&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;85</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">User&nbsp;denied&nbsp;access&nbsp;to&nbsp;Camera</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;86</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.showSettings(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;87</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">&nbsp;88</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">&nbsp;89</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;my_mic&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Microphone.get();<br></span><span style="COLOR: #008080">&nbsp;90</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(my_mic&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">&nbsp;91</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;92</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rap_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前状态：没有找到MIC</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;93</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">&nbsp;94</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;95</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;96</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netStream.attachAudio(my_mic);<br></span><span style="COLOR: #008080">&nbsp;97</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_mic.onStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(infoObj:Object)<br></span><span style="COLOR: #008080">&nbsp;98</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;99</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(my_mic.muted)&nbsp;{<br></span><span style="COLOR: #008080">100</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;If&nbsp;user&nbsp;is&nbsp;denied&nbsp;access&nbsp;to&nbsp;their&nbsp;Camera,&nbsp;you&nbsp;can&nbsp;display&nbsp;an&nbsp;error&nbsp;message&nbsp;here.&nbsp;You&nbsp;can&nbsp;display&nbsp;the&nbsp;user's&nbsp;Camera/Privacy&nbsp;settings&nbsp;again&nbsp;using&nbsp;System.showSettings(0);&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">101</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">User&nbsp;denied&nbsp;access&nbsp;to&nbsp;Camera</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">102</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.showSettings(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">103</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">104</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">105</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">106</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">107</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;rapStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">free</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">108</span>&nbsp;<span style="COLOR: #000000">netConn.onStatus&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;(info)<br></span><span style="COLOR: #008080">109</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">110</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(info.code&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">NetConnection.Connect.Success</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">111</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">112</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">连接状态:&nbsp;连接成功</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">113</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">114</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">115</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">116</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">连接状态:&nbsp;连接错误</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">117</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">118</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">119</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;timeNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">120</span>&nbsp;<span style="COLOR: #000000">record_bt.onRelease&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;()<br></span><span style="COLOR: #008080">121</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">122</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rapStatus&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">free</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;rapStatus&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">recordstop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">123</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">124</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Record();<br></span><span style="COLOR: #008080">125</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">126</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rapStatus&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">recording</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">127</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">128</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RecordStop();<br></span><span style="COLOR: #008080">129</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br></span><span style="COLOR: #008080">130</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">131</span>&nbsp;<span style="COLOR: #000000">play_bt.onRelease&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;()<br></span><span style="COLOR: #008080">132</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">133</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rapStatus&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">free</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;rapStatus&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">playstop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;rapStatus&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">recordstop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">134</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">135</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">trace(videolist.length);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">136</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(videolist.length&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">137</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">138</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlayVideo();<br></span><span style="COLOR: #008080">139</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">140</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">141</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">142</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rap_status.text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">当前状态：没有视频</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">143</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">144</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">145</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rapStatus&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">playing</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">146</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">147</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlayStop();<br></span><span style="COLOR: #008080">148</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">149</span>&nbsp;<span style="COLOR: #000000">};</span></div>
<br><br>其中conn_status,rap_status,videoinfo为testarea...<br><br>play_bt,record_bt为按钮...<br><br>videolist为list...<br><br>video_r,video_p为视频元件(建立方法为:按ctrl+L,然后右击,新建视频,命名,拖到场景中,把实例改为前面的名称就可以了)...<br><br>剩下的...自己试吧...<br><br>参考例子的声明:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Powerd&nbsp;By:Cincn.com<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Create&nbsp;By:KeeRula;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;此教程及附带源文件仅做网友个人交流学习使用.请勿用于商业用途.需要商业版请联系MSN:Myproductgroup@hotmail.com.<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;FLASH技术交流学习群:25448796.<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;版权保护:北联科技.</span></div>
<img src ="http://www.cppblog.com/twzheng/aggbug/29818.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-12 10:52 <a href="http://www.cppblog.com/twzheng/articles/29818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ActionScript3.0概要</title><link>http://www.cppblog.com/twzheng/articles/29377.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sun, 05 Aug 2007 03:37:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/29377.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/29377.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/29377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/29377.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/29377.html</trackback:ping><description><![CDATA[<p>ActionScript3.0概要</p>
<p>ActionScript 3.0 演变成一门强大的面向对象的编程语言意味着flash平台的重大变革。这种变化也意味着 ActionScript 3.0 将创造性地将语言理想地迅速地建立出适应网络的丰富应用程序, 成为丰富网络应用(Rich Internet Application)项目的本质部分。比较早期的ActionScript版本就已经提供了这种要求为创造真实地参与在线体验的力量和灵活性。ActionScript 3.0 将促进和发展这种性能, 提供发展强大表现和舒适的先进的高度复杂应用, 结合大型数据库以及可移值性的面象对象的代码。拥有 ActionScript 3.0, 开发者可能达到高效执行效率和表现同一的平台。</p>
<p>ActionScript 3.0 基于ECMAScript, ECMAScript是所有编程语言的国际规范化的语言。ActionScript 3.0 同样遵从ECMAScript语言规范。</p>
<p>ActionScript 由嵌入在flash player的ActionScript虚拟机 (AVM)执行。AVM1, 是执行以前版本的ActionScript的虚拟机, 今天变的更加强大的flash平台使得可能创造出交互式媒体和丰富的网络应用。然而, AVM1却在挤压着开发者们的极限―― 他们的项目现在到了要求它变革的时刻了。ActionScript 3.0 带来了一个更加高效的ActionScript 执行虚拟机―AVM2, 它将彻底的脱胎换骨于AVM1 。 它将意味着, ActionScript 3.0执行效率将比以前的ActionScript执行效率高出至少10倍。</p>
<p>新的AVM2 虚拟机将会嵌入于flash player8.5当中, 它将成为执行ActionScript的首先虚拟机。当然旧的AVM1将继续嵌入在flash player8.5当中以兼容以前的ActionScript。</p>
<p>有众多的产品把自身的展示和应用表现于flash player当中，这些产品的动画也经常应用到ActionScript 以增加互动和行为表现他们的产品。 在Macromedia 产品家族, 专业设计师和也许使用 ActionScript 在几个产品当中, 譬如Macromedia flash, Flex, 和Flash media servers创造出内容和应用表现在flash player当中。在Flex2 产品家族, 包括最新的基于Eclipe―的Flex Builder 2 IDE,会是系列产品中第一个应用ActionScript 3.0 的新体验的产品。</p>
<p>ActionScript 3.0的目标</p>
<p>我们需要ActionScript 3.0 提供一个先进的, 与编程模型一致的, 服从业界标准, 以及表现将数量级大于我们过去的执行效能。虽然ActionScript 3.0 代表着flash平台一个新的编程模型,它也将会是一个让开发者熟悉的基础的面对对象的编程语言。</p>
<p>ActionScript3.0的出现将展现出如下目标</p>
<p>安全 ? 它支持一定的安全以使得能够让开发者写出明白的, 容易的可维护的代码。<br>朴素 - 这种语言的直观程度使开发者能够直接读和写项目,而不需要经常参考手册<br>表现 - 这种语言使开发者写出高效率的和表现性强的复杂项目。<br>兼容性 - 这种语言抛弃不规范的语言标准以及提供向前兼容以及有意义的交替以符合业界标准。ActionScript 3.0 是规范化了的ActionScript 2.0, 增 加了ECMAScript 其中的XML应用(E4X) ,使得这 种语言融入ECMAScript整体连为一贯。</p>
<p>ActionScript 3.0的特征</p>
<p>ActionScript 3.0 包括二部分: 核心语言和flash player API 。核心语言用于定义编程语言的结构, 譬如声明, 表示, 条件, 循环, 和类型 。flash player API是 由一系列精确定义flash player功能的类组成。</p>
<p>ActionScript 3.0 拥有尽可能的挖掘出计算机剩余性能的新特点。规则表示支持使操作性更加强大的XML。 ECMAScript for XML (E4X) 使得XML 成为通用数据类型, 将大大地简化XML 处理。新的Display ListAPI将使虚拟对象更加的协调一致。 规范化的DOM 事件模型使得那些对象的表示和响应结合的更加强劲。当然这些只是ActionScript3.0许多新的体验当中的一部分。</p>
<p>actionscript3.0语言特点</p>
<p>ActionScript 3.0 的出现是ActionScript 2.0 的核心语言方面融入ECMAScript 以遵守其标准和引入新的改进的一些功能区域的结合。所有这些特点在ActionScript 3.0 语言参考中都有详细的介绍和讨论, 可得到试用版正在Macromedia 实验室。下面是一些其开发者对其方便的地方和用法总结的一些新特点。</p>
<p>增强处理运行错误的能力</p>
<p>应用ActionScript 2.0时, 许多表面上&#8220;完美无暇&#8221;的运行错误无法得到记载。这使得flash player无法弹出提示错误的对话框, 就象javascript语言在早期的浏览器中所表现的一样。也就是说, 这些缺少的错误报告使得我们不得不花更多精力去调试ActionScript 2.0程序。ActionScript 3.0 引入在编译当中容易出现的更加广泛的错误的情形, 改进的调试方式使得能够健壮地处置应用项目当中的错误。提示的运行错误提供足够的附注（例出出错的源文件）和以数字提示的时间线, 帮助开发者迅速的定位产生错误的位置。</p>
<p>对运行错误的处理方式</p>
<p>在ActionScript 2.0中，运行错误的注释主要提供给开发者一个帮助，所有的帮助方式都是动态的。而在ActionScript且是3.0中, 这些信息将被保存到一定的数量，Flash player将提供时间型检查以提高系统的运行安全。这些信息将记录下来用于监视变量在电脑中的运行情况, 以使得开发者能够让自己的应用项目得到改进以减少对内存的使用。</p>
<p>密封的类</p>
<p>ActionScript 3.0 将引入密封的类的概念。在编译时间内的的密封类拥有唯一固定的特征和方法，其它的特征和方法不可能被加入。这使得比较严密的编译时间检查成为可能, 创造出健壮的项目。因而它当然可以提高对内存的使用效率, 因为不需要为每一个对象实例增加内在的杂乱指令。当然动态类依然可以使用只要声明为dynamic的关键字。</p>
<p>代理方式</p>
<p>在ActionScript 3.0中事件处理变的更加简化归功于它的嵌入式代理方式。而在ActionScript 2.0中, 方法关闭后并没有记住什么对象事例引用了它们, 当调用已经关闭的方法时将导致意想不到的后果。 Mx.utils.Delegate 类经常被使用，使用它时, 你写了代码如下:<br>myButton.addEventListener(&#8220;click&#8221;, Delegate.create(this, someMethod)); Delegate.create(this, someMethod) <br>在AS3.0中，这个类不再需要被引入, 当方法关闭时将自动地记住它的原始对象实例。现在, 你可以简单地写为: myButton.addEventListener(&#8220;click&#8221;, someMethod); </p>
<p>ECMAScript 中的 XML (E4X)</p>
<p>ActionScript 3.0 特点之一是全面支持ECMAScript中的 XML (E4X), 最新的规范标准为ECMA-357 。E4X 提供一种自然, 流利的语言使得能够快速的构造XML 。而不是象传统XML的解析接口一样, E4X使得XML成为通用的数据类型。E4X 简化操作XML将大大的减少相当 数量的代码以适用应用项目需要的发展。在这个网站你能学到更多关于E4X 的规格：<br>www.ecma-international.org/publications/files/ECMA-ST/ECMA-357.pdf </p>
<p>规范的表达方式</p>
<p>ActionScript 3.0 引入支持通用规则使得能够迅速搜寻和快速的操作字符(串)。ActionScript 3.0实施规则定义在第三版的ECMAScript 语言说明书当中(ECMA-262) 。</p>
<p>命名空间(Namespaces) </p>
<p>Namespaces 是一种创新新机制用以控制声明的可见性。 Namespaces 与传统通过指定类型用以控制声明(公开的, 私有的, 保护的)是相似的 。他们本质是通过自定义路径, 能够使用你所选择的名字。Flex, 例如, 使用一mx_internal 命名空间为它的内部数据来源。命名空间使用统一的资源标识符(URI)以避免冲突 ,当与E4X一起使用时同样可以使用XML命名空间。</p>
<p>新的整数类型</p>
<p>ActionScript 2.0用Number定义有单精度数字类型和双精度浮点数字类型。受欢迎的新的Int数据类型将加入到ActionScript3.0当中。int是一个32位有符号整型数据类型, 使得CPU将提高ActionScript代码中处理整数运算的能力,int将提高循环运算以及几乎其它不带小数点的整数运算。另一个新的数据类型是uint, 一个与int相似的无符号32位整数型 。uint 主要用于表现象索颜色和其它一些int所不能很好工作的领域。</p>
<p>Flash Player 接口的特点</p>
<p>Flash player API 由一组类和功能组成以增强flash player容纳actionscript语言的能力。这种功能是在ActionScript 核心语言和空余的flash平台间建立起了一座桥梁。这将能大大的提高flash应用程序的能力以及对于核心语言来说将起到重要的补充作用。这里没有足够的空间来对API的细节进行详细的描述, 但这里有一张短名单列出一些新的和有趣的功能：</p>
<p>(1)：DOM3 Event Model <br>DOM3事件模型提供一个标准方式发生和处置事件消息以使得对象在应用之间能够互动和通信, 维护状态和对变化产生回应。仿造 W3C DOM3 事件规格, 这个事件模型能够带来比早期的ActionScript版本中的系统事件更加清晰和高效的机制。 Flex程序构架应用和flash player API相同的DOM3事件模型,以至于系统事件从flash平台的顶端走到了末路。</p>
<p>(2)：Display List API<br>显示屏的接口(API)由一组相关的能够表现出简单而生动flash动画的类组成。<br>新的(Sprite:调皮的，精灵之意。暂且译为闪灵) 闪灵类是一个轻量级选手,与MovieClip类相似，但比较适合于作为UI组件的基本类。新的形状类将取代旧的矢量形状。这些新的类能够应用新的操作方式自然的表现并且能够在任何时候都比自己的前辈（指旧的类和旧的方式）展现的更加有活力。<br>不再需要为对象指定深度。深度管理现在在flash player当中是自动建立的。新方法提供了可以为对象指定和管理Z轴。</p>
<p>当然, 这个ActionScript 3.0 概要只概述一些扣人心弦 的API的介绍 以及语言特色。当你更加深入学习AS3.0的时候你将发现更多 。当你想学习ActionScrip3.0如何实现应用项目设计时&lt;&lt;ActionScript 3.0编程 &gt;&gt;一书里将是你好的开始。 当然&lt;&lt;ActionScript 3.0 语言参考&gt;&gt; ActionScript 3.0 Language Reference&nbsp;)是AS3.0核心语言完整描述和flash player API细述的权威资料. 当然, 如果你已经对 ActionScript 1.0 或2.0比较熟悉,请查阅《学习ActionScript3.0捷径》(( Tips for Learning ActionScript 3.0.&nbsp; ) 。</p>
<p>Flash player的开发者非常兴奋能够在第一时间传递出这份语言预览, 它的新能力和改进的表现性能通过了Macromedia 实验室的试验。你能够嗅觉到 ActionScript 3.0将带入到Flex Builder 2,Flex Framework以及Flash Player 8.5当中。</p>
<img src ="http://www.cppblog.com/twzheng/aggbug/29377.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-05 11:37 <a href="http://www.cppblog.com/twzheng/articles/29377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入Flash Remoting MX框架基本原理</title><link>http://www.cppblog.com/twzheng/articles/29176.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Thu, 02 Aug 2007 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/29176.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/29176.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/29176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/29176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/29176.html</trackback:ping><description><![CDATA[<p>摘自：《.NET for Flash动态网站开发手札》&nbsp;&nbsp;&nbsp;作者：张亚飞&nbsp;&nbsp;&nbsp;电子工业出版社<br></p>
<p><br><br></p>
<h2 style="MARGIN-LEFT: 47.7pt; TEXT-INDENT: -47.7pt"><span style="COLOR: #000000">17.1&nbsp; 应用Flash Remoting MX构建的Flash影片<br>应用程序架构</span></h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;应用Flash Remoting MX构建Flash影片应用程序和其他&#8220;客户端/服务器&#8221;应用程序极为相似（包括基于浏览器的网络应用程序，所以我们不时使用&#8220;客户端/服务器&#8221;这样的术语）。例如，Flash影片应用程序一般位于一个浏览器窗口中，嵌入在一个HTML页内，实际上也是作为HTML页内的一个动态元素。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另外，Flash影片应用程序中&#8220;控件（组件）&#8221;可以用来显示文本和图形，用户还可以键入文字信息并和远程服务器进行通信，从这一点上来说非常像HTML页。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flash影片应用程序也可以创建服务端方法，请求调用远程服务，服务端方法调用由客户端发起，一般是一个异步事件：Flash影片应用程序请求调用远程服务，远程服务端处理请求，返回结果；作为宿主的Flash Player不会等待这一结果返回，但是当结果返回时会处理该结果。<br><br></p>
<h3>17.1.1&nbsp; 理解Flash Remoting MX开发环境架构</h3>
<p>因为Flash Remoting MX连接两个截然不同、相互独立的运行时环境，所以在使用Flash Remoting MX构建Flash影片应用程序时就必须使用两种开发语言：ActionScript和应用服务器使用的开发语言。因此，使用Flash Remoting MX构建Flash影片应用程序至少要求有两个不同开发环境的知识。</p>
<p>Flash可以用来创建使用Flash Remoting MX的Flash影片应用程序：</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以使用Flash来设计用户界面</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以使用Flash编写客户端ActionScript脚本代码</p>
<p>应用服务器有很多种，使用的开发语言也很多：ColdFusion使用ColdFusion开发语言；Java就是使用Java语言；.NET则支持的语言很多，包括VB、C#等。开发工具也多种多样，你可以使用文本编辑器也可以选择集成开发环境（IDE）。集成开发环境一般支持相关的程序语言及其API。Dreamweaver是一个不错的IDE，它支持ColdFusion、JSP和ASP.NET。本书主要是使用VB.NET开发的ASP.NET作为应用服务器技术。</p>
<p>因为客户端和服务端环境相互独立，所以在使用Flash Remoting MX构建Flash影片应用程序时，可以把它作为一个工程组。一般而言，一个网络应用程序需要设计人员和开发人员协同工作。设计人员创建用户界面，开发人员编写客户端ActionScript脚本代码和应用服务器逻辑。</p>
<p>在使用Flash Remoting MX构建Flash影片应用程序时，把服务端开发、客户端开发和客户端设计明确地组织起来，定义好各自的角色是非常重要的。从工作分工而言，客户端设计人员创建Flash影片应用程序用户界面，工作包括页面布局、动画、效果等；客户端开发人员编写ActionScript脚本代码连接到远程服务，并处理结果；最后，服务端开发人员在应用服务器上创建业务逻辑作为远程服务。</p>
<p>这是应用Flash Remoting MX技术开发Flash影片应用程序工程的架构设计模式，下面我们就来了解一下Flash Remoting MX的设计模式。</p>
<br>
<h3>17.1.2&nbsp; 使用Flash Remoting MX设计模式</h3>
<p>Flash Remoting MX技术被设计成可以和选定的（现有的）设计模式及框架集成在一起，这正是它的特点，用户也可以由此降低成本。对于Flash影片应用程序和.NET这两个现有的运行框架而言，Flash Remoting MX在中间执行的是一个非常有效率的结构化设计模式。除了可以提高开发效率、减少由于设计方面的欠缺导致的误解外，该模式可以用来强制检查&#8220;客户端/服务器&#8221;之间的交互，提高应用程序的性能和稳定性。</p>
<h4>1．Model-View-Controller设计模式</h4>
<p>现今，用户界面向导型的应用程序风靡世界，程序软件开发一般使用Model-View- Controller（MVC）方式，这种方式根据用途组织应用程序代码。在使用Flash Remoting MX构建Flash影片应用程序时，就是使用的这种方式。</p>
<p>MVC程序软件开发方式包含下面的几个元素：</p>
<p>（1）Model。Model（模型）代表应用程序数据和数据的处理，以及其他的逻辑。在一个网络应用程序中，就是应用服务器程序和数据库。</p>
<p>（2）View。View（查看）代表用户界面，一般包含用户控制和信息显示（动态的和静态的）两个元素。</p>
<p>（3）Controller。Controller（控制）代表着处理用户输入，根据输入改变模型然后查看的逻辑。根据应用程序设计的不同，Controller 可以位于客户端也可以位于服务端，或者两者结合起来。为了将网络信息交换减少到最小，充分利用Flash Player运行时，一般应当在Flash影片应用程序中完成Controller。</p>
<p>如图17-1所示揭示了Flash Remoting MX环境应用中的MVC架构。</p>
<p align=center><img height=227 src="http://book.csdn.net/BookFiles/192/img/image002.jpg" width=300></p>
<p align=center>图17-1&nbsp; Flash Remoting MX环境应用中的MVC架构</p>
<p>在图17-1中，Flash Remoting MX使得controller和model相互分离，它实际是在Flash影片应用程序和应用服务器（或者Web Service）之间起到一个通信通道的作用。</p>
<h4>2．其他的Flash Remoting MX设计模式</h4>
<p>除前面介绍的模式外，也有其他的设计模式，主要是为了减少远程服务方法调用，例如value object模式。Flash Remoting MX能从一个远程服务返回结果，并将结果作为一个ActionScript对象。ActionScript对象可以用来打包远程服务数据，仅返回一个对象给Flash影片应用程序，这样就避免了无数的、频繁的单个调用。</p>
<p>为了简化远程服务API以适用于Flash影片应用程序，你可以使用facade设计模式，这种模式在Flash影片应用程序和远程服务之间提供一个缓冲层。facade设计模式规定了一个服务端应用程序经纪人，用来接收Flash影片应用程序远程调用，并传递方法到相应的服务器资源。这就给了你更多的适应性：你可以改变远程服务架构，而不需改变Flash影片应用程序。</p>
<p>如图17-2所示揭示了Flash Remoting MX环境应用中的facade设计模式。</p>
<p align=center><img height=233 src="http://book.csdn.net/BookFiles/192/img/image003.jpg" width=258></p>
<p align=center>图17-2&nbsp; Flash Remoting MX环境应用中的facade设计模式</p>
<p>ColdFusion组件、JavaBeans，以及.NET 程序集都可以用做facade。它们都可以接收所有来自Flash影片应用程序的功能请求，并将这些请求分配给相应的应用服务器资源或者根据请求进行网络服务调用，在本书前面的章节已经为您详细地介绍过怎样使用Flash Remoting MX从Flash影片应用程序调用.NET程序集了。</p>
<!-- page --><br>
<h3>17.1.3&nbsp; 理解Flash Remoting MX for .NET 目录结构</h3>
<p>要为应用Flash Remoting MX技术而使用一个ASP.NET应用程序，必须将Flash Remoting MX程序集（FlashGateway.dll）放置在应用程序的本地程序集缓存中（bin目录下），并在应用程序的 web.config文件中注册该程序集。在最简单的ASP.NET表单应用程序中，ASP.NET应用程序的目录结构如图17-3所示。</p>
<p align=center><img height=220 src="http://book.csdn.net/BookFiles/192/img/image004.jpg" width=347></p>
<p align=center>图17-3&nbsp; ASP.NET应用程序的目录结构</p>
<p>如图17-3所示，在我们前面介绍的helloWorld例子中，3JK目录中的本地程序集缓存包含有Flash Remoting MX程序集（flashgateway.dll）。要使Flash影片应用程序连接到一个远程服务，必须引用Web根目录下应用程序目录中的物理资源。</p>
<p>Flash Remoting MX自动安装了一个名为gateway.aspx的空ASPX文件，但是你也可以使用应用程序目录中的任何ASPX文件，在这里我们使用了默认的gateway.aspx。</p>
<p>web.config文件包含有flashgateway.dll程序集的注册信息。HttpModule配置模块可以处理对ASP.NET资源的所有Web请求。所以我们要在web.config文件中添加下面的一段配置语句：</p>
<p>&lt;httpModules&gt;</p>
<p>&lt;add name="GatewayController" type= </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "FlashGateway.Controller.GatewayController,flashgateway" /&gt;</p>
<p>&lt;/httpModules&gt;</p>
<p>如果对服务端方法的请求中包含着AMF信息，Flash Remoting MX就会解释AMF信息并使请求继续下去。</p>
<p>技巧与提示</p>
<p>注意，在安装Flash Remoting MX for .NET时，会在Web根目录下创建一个名为flashremoting的目录。在该目录下，你可以发现一个本地程序集缓存（bin目录），以及一个Samples目录，该目录下存放了Flash影片应用程序的例子。<br><br></p>
<h3>17.2&nbsp; 深入Flash Remoting MX网关和服务适配器</h3>
<p class=MsoNormal style="TEXT-INDENT: 21pt">Flash Remoting MX将进入的请求映射到对应的服务适配器，这就可以直接连接到一个特定的应用服务器。</p>
<p class=MsoNormal style="TEXT-INDENT: 21pt">当一个HTTP请求到达服务器时，它包含了AMF信息，Flash Remoting MX根据名称将该请求映射到对应的服务适配器。要避免名称冲突，可以在ActionScript脚本代码中定义目录结构、充分授权的类名或包名，或者是描述Web服务的WSDL URL地址。</p>
<br>
<h3>17.2.1&nbsp; 应用Flash Remoting MX for .NET</h3>
<p>Flash Remoting MX将ASP.NET技术作为Flash影片应用程序的一个远程服务，因而可以被当作ActionScript的一项功能，这样就能被Flash影片应用程序识别。</p>
<p>能够作为远程服务的Microsoft.NET技术有很多，包括ASP.NET网页、Web服务、程序集方法。Flash开发人员编写ActionScript脚本代码可以使用一个称为NetServices或Service的功能类库连接到一个远程.NET服务器，或者引用一个远程服务，调用远程服务的功能。</p>
<p>为了通过HTTP传输信息， Flash Remoting MX使用一个称为Action Message Format （AMF）的二进制信息格式，它模拟了Web服务执行时使用的Simple Object Access Protocol （SOAP）协议。它允许使用HTTP在Internet上发送各种数据类型，包括记录集和其他的原始数据类型（如整数、字符串、XML文档和日期等）。</p>
<p>Flash Remoting MX网关是ASP.NET运行时的一个前端控件，它处理从ActionScript到.NET Common Language Runtime （CLR）的数据类型转换。在网关收到服务请求之前，该请求必须先通过过滤装置处理串行数据、日志和安全检验，最后到达一个服务适配器，服务适配器被用来处理服务和启动类型。</p>
<p>对于Microsoft.NET技术，Flash Remoting MX包含四个服务适配器：</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASP.NET适配器</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADO.NET数据绑定适配器</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web服务适配器</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序集适配器（*.dll）</p>
<p>Flash Remoting MX for .NET要求安装.NET Framework SDK，要检查是否安装了.NET Framework SDK，可打开Windows控制面板，双击&#8220;添加/删除应用程序&#8221;选项，查看有没有Microsoft.NET Framework SDK。如果没有看到，就要下载一个安装上。（下载地址http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/000/976/msdncompositedoc.xml）</p>
<h4>Flash Remoting MX怎样融入Microsoft.NET框架</h4>
<p>当Flash影片应用程序和Flash Remoting MX服务器控件被嵌入在ASPX网页中时，使用Flash Remoting MX的Flash影片应用程序就成为 .NET应用程序中客户端内容中的一部分。Flash Remoting MX在 ASP.NET网页和.NET网络表单应用程序中可以用做一个自定义服务器控件，或者也可以在一个.NET 程序集（DLL）文件中用做一个命名空间，还可以用在一个代码隐藏类文件和Web服务中。一个 .NET 程序集（flashgateway.dll）位于ASP.NET应用程序本地程序集缓存中，它提供了Flash Remoting MX的功能。</p>
<br><br>
<h3>17.2.2&nbsp; 关于AMF</h3>
<p>如果您对生物学非常熟悉的话，有可能知道AMF，它是一种极其罕见的植物名，名为丛枝内生菌根菌，是菌根菌的一种。绝大部分植物都能从阳光中获取赖以生存的食物，但是菌根菌靠吸取寄生植物的劳动果实成活。</p>
<p>在Flash Remoting MX中，AMF正是这样一种事物，只不过它是一种信息编码格式。它本身并不产生信息数据，而是对通过HTTP在Flash影片应用程序和远程服务之间传递的数据进行编码和解码来产生信息数据。</p>
<p>由于AMF是专为ActionScript对象模型设计的信息编码格式，所以对于使用Flash Remoting MX的Flash影片应用程序来说非常高效。</p>
<p>AMF的全称是Action Message Format，它采用二进制格式，专为ActionScript对象模型设计，要从远程服务发送和接收信息，Flash Remoting MX就使用Action Message Format。使用AMF，Flash Remoting MX可以编码和解码通过HTTP在Flash影片应用程序和远程服务之间传递的数据。</p>
<p>AMF符合Simple Object Access Protocol（SOAP）协议格式，它使用信息包格式分段传送信息。一个AMF信息包包含下面5个部分：</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信息包头，这一部分包含了AMF版本信息</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上下关系头计数</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上下关系头配置。上下关系头包含了一个一个独立的AMF信息应当怎样被处理的描述信息</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信息计数</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信息配置</p>
<p>在客户端，服务端的方法请求被使用NetServices类或Service类的方法自动序列化为AMF格式；在服务端，Flash Remoting MX逆序列化AMF信息。当服务端处理完成时，结果又被序列化为AMF格式，并发回Flash影片应用程序。服务端创建的AMF信息格式与客户端创建的AMF信息格式相同。单独的AMF信息包主体内，包含了错误或响应对象，它们被表述成一个ActionScript对象。</p>
<br><br>
<h3>17.2.3&nbsp; Flash Remoting MX和数据类型</h3>
<p>当应用Flash Remoting MX技术，从Flash影片应用程序向应用服务器发送数据和应用服务器返回数据给Flash影片应用程序时，数据被进行了两次转换：</p>
<p>（1）在客户端的Flash影片应用程序中，在ActionScript数据类型和Action Message Format（AMF）两种数据类型之间转换：发送时从ActionScript数据类型转换成AMF格式；返回的数据从AMF数据格式转换成ActionScript数据类型；</p>
<p>（2）在服务器网关中，是在.NET语言（C#、Visual Basic）数据类型和Action Message Format（AMF）两种数据类型之间转换：向应用服务器发送时从AMF数据格式转换成.NET语言（C#、Visual Basic）数据类型；从应用服务器返回的数据从.NET语言（C#、Visual Basic）数据类型转换成AMF数据格式。</p>
<p>如图17-4所示显示了这两次数据类型的转换。</p>
<p align=center><img height=123 src="http://book.csdn.net/BookFiles/192/img/image005.jpg" width=351></p>
<p align=center>图17-4&nbsp; Flash Remoting MX的两次数据类型转换</p>
<p>这两次数据类型转换使得Flash Remoting MX可以不依赖服务器系统的数据编码方法，从而可以非常有效地与各种应用服务器技术相结合，包括Microsoft.NET应用服务器技术。</p>
<p>Flash Remoting MX可以自动识别数据类型并进行相应的数据类型转换。大多数情况下，数据类型转换是非常直接简单的，你只需将ActionScript数据作为参数传递给应用服务器，然后在结果处理方法中处理返回的结果即可。但是也有少数的情况必须考虑数据类型转换，否则，程序会出现不可预知的后果。</p>
<p>下面我们来详细介绍一下.NET语言（Visual Basic）的数据类型和ActionScript数据类型之间转换的对应关系。</p>
<h4>1．从ActionScript数据类型向.NET数据类型转换</h4>
<p>表17-1列出了ActionScript数据类型和相应的应用程序服务器中支持的数据类型。</p>
<p>表17-1&nbsp; ActionScript数据类型和相应的VB.NET数据类型</p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=491 border=1>
    <tbody>
        <tr>
            <td vAlign=top>
            <p>ActionScript数据类型</p>
            </td>
            <td vAlign=top>
            <p>VB.NET数据类型</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>Number（简单数据类型）</p>
            </td>
            <td vAlign=top>
            <p>任何数值数据类型，包括Decimal、Double（双精度浮点型）、Integer和Long（长整型）</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>boolean（简单数据类型）</p>
            </td>
            <td vAlign=top>
            <p>Boolean</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>String（简单数据类型）</p>
            </td>
            <td vAlign=top>
            <p>String</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>ActionScript（AS）对象</p>
            </td>
            <td vAlign=top>
            <p>FlashGateway.IO.ASObject</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>Object（作为参数被传递到远程服务方法的对象，该对象是由name/value形式构成的）</p>
            </td>
            <td vAlign=top>
            <p>FlashGateway.IO.ASObject</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>null</p>
            </td>
            <td vAlign=top>
            <p>Nothing</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>undefined</p>
            </td>
            <td vAlign=top>
            <p>Nothing</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>Array（索引是连续的数值）</p>
            </td>
            <td vAlign=top>
            <p>System.Collections.ArrayList</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>Associative Array（索引是名称标示）</p>
            </td>
            <td vAlign=top>
            <p>System.Collections.Hashtable</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>Date</p>
            </td>
            <td vAlign=top>
            <p>Date</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>XML</p>
            </td>
            <td vAlign=top>
            <p>System.Xml.XmlDocument</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>RecordSet（不能发送）</p>
            </td>
            <td vAlign=top>
            <p>无对应项</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>在从ActionScript数据类型向VB.NET数据类型转换时还要注意以下几个重要的问题：</p>
<p>（1）只要是可能，Flash Remoting MX都会把ActionScript Number转换成.NET数值数据类型。但是，如果数值不能转换成相应的应用服务器数据类型（例如，ActionScript数值超出了应用服务器数据类型一个整形数值类型的范围），Flash Remoting MX就会在服务器上抛出一个错误，因此在开发应用程序时要注意应用服务器数据类型的取值范围。</p>
<p>如表17-2所示列出了VB.NET数值数据类型的取值范围。</p>
<p>表17-2&nbsp; VB.NET数值数据类型的取值范围</p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=491 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="22%">
            <p>Decimal</p>
            </td>
            <td vAlign=top width="77%">
            <p>0 到 +/-79 228 162 514 264 337 593 543 950 335之间不带小数点的数；</p>
            <p>0 到 +/-7.922&nbsp;816&nbsp;251&nbsp;426&nbsp;433&nbsp;759&nbsp;354&nbsp;395&nbsp;033&nbsp;5 之间带 28 位小数的数；</p>
            <p>最小非零数为+/-0.000&nbsp;000&nbsp;000&nbsp;000&nbsp;000&nbsp;000&nbsp;000&nbsp;000&nbsp;000&nbsp;1 (+/-1E-28)。 </p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="22%">
            <p>Double</p>
            <p>（双精度浮点型）</p>
            </td>
            <td vAlign=top width="77%">
            <p>负数取值范围为-1.797&nbsp;693&nbsp;134&nbsp;862&nbsp;31E+308到 -4.940&nbsp;656&nbsp;458&nbsp;412&nbsp;47E-324；</p>
            <p>正值取值范围为 4.940&nbsp;656&nbsp;458&nbsp;412&nbsp;47E-324到 1.797&nbsp;693&nbsp;134&nbsp;862&nbsp;31E+308。 </p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="22%">
            <p>Integer</p>
            </td>
            <td vAlign=top width="77%">
            <p>-2&nbsp;147&nbsp;483&nbsp;648 到 2&nbsp;147&nbsp;483&nbsp;647。</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="22%">
            <p>Long（长整型）</p>
            </td>
            <td vAlign=top width="77%">
            <p>-9&nbsp;223&nbsp;372&nbsp;036&nbsp;854&nbsp;775&nbsp;808 到 9&nbsp;223&nbsp;372&nbsp;036&nbsp;854&nbsp;775&nbsp;807。</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>（2）Flash Remoting MX在处理复合数组（Associative Array）时与对待连续数组不同。有一些ActionScript数组包含了不连续的索引（例如，仅包含索引0，2和3 ，而不包含索引1的数组），有一些ActionScript数组既包含数字又包含字符串，这些数组称为复合数组。Flash Remoting MX在处理复合数组时会将索引值转换成键值，但是当数值作为键值时是字符串类型（例如，"0"，"1"，"2"）。</p>
<h4>2．从.NET数据类型向ActionScript数据类型转换</h4>
<p>如表17-3所示列出了应用程序服务器数据类型和相应的ActionScript中支持的数据类型：</p>
<p>表17-3&nbsp; VB.NET数据类型和相应的ActionScript数据类型</p>
<div align=center>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=287>
            <p>VB.NET数据类型</p>
            </td>
            <td vAlign=top width=178>
            <p>ActionScript数据类型</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>Nothing</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>null</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>Boolean</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>Boolean</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>任何数值数据类型，包括Decimal、Double、Integer和Long</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>Number</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>Char String</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>String</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>Date</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>Date</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p>System.Collections.ICollection</p>
            </td>
            <td vAlign=top width=178></td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>object[]</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>Array</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p>System.Collections.Hashtable</p>
            </td>
            <td vAlign=top width=178></td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>System.Collections.IDictionary</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>Associative array</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>Sytem.Data.DataSet</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>由RecordSet对象组成的复合数组</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>System.Data.DataTable</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>RecordSet</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p>FlashGateway.IO.ASObject</p>
            </td>
            <td vAlign=top width=178></td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>System.Exception</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>Object</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>FlashGateway.IO.ASObject（定义了Type属性）</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>Typed Object</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=287>
            <p align=left>System.Xml.XmlDocument</p>
            </td>
            <td vAlign=top width=178>
            <p align=left>XML</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h5>（1）在从应用程序服务器数据类型向ActionScript数据类型转换时的注意事项</h5>
<p>①如果应用服务器上的字符串数据表示的是一个数字，那么，在ActionScript中，如果需要的话，Flash将会将该字符串自动转换成数字。 </p>
<p>②如果使用setType方法为应用服务器上的flashgateway.io.ASObject对象定义对象类型，并且对象类型名与ActionScript内建的对象类名相同，Flash Remoting MX将会在ActionScript脚本中创建一个该类的实例。</p>
<p>③要返回大量且相互独立的数据给Flash影片应用程序，可以定义一个复杂的应用服务器变量来包含这些数据，例如，一个变量可以转换成一个ActionScript对象，也可以是数组或者复合数组，仅仅返回一个变量，但是在Flash影片应用程序中可以使用该变量中的多个元素。</p>
<h5>（2）处理对象</h5>
<p>当在远程服务方法调用中传递一个Flash对象时，对象的属性被传递给网关。在.NET环境中，FlashGateway.IO.ASObject类（它执行ICollection接口）的一个实例就相当于一个Flash对象。因此，你可以向任何接受Map或ICollection的方法传递Flash对象。</p>
<p>因为Flash Remoting MX仅仅是传输数据，在服务器上对象方法是不适用的，同样，对象的属性也必须是Flash Remoting MX能够处理的类型。例如，你不能在一个将传递给远程服务方法的对象中包含Flash RecordSet对象，因为Flash Remoting MX不能将RecordSet对象转换成服务器上的一种数据类型。</p>
<p>当从服务器返回一个对象给Flash时，Flash Remoting MX将对象数据属性信息作为Flash对象发送给Flash。在Flash中，你可以将该对象的属性转换成Flash数据类型的。</p>
<h5>（3）处理ActionScript typed对象</h5>
<p>如果你在ActionScript脚本中使用Object.RegisterClass方法注册一个对象的话，你就创建了一个typed对象。Typed对象在Flash影片应用程序中是非常有用的，它可以用来创建Flash对象的子类。</p>
<p>在对Flash Remoting服务方法的调用中，你可以使用typed对象。</p>
<p>在一个服务方法调用中使用typed对象的一个实例，在服务器端，Flashgateway.IO. ASObject对象代表参数，它包含了对象的type名。</p>
<p>例如，下面的ActionScript脚本创建了一个typed对象，并在一个服务方法中使用该对象：</p>
<p>//创建一个类(也就是类的构造器)</p>
<p>myClass = function()</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; this.Value1 = "Test1";</p>
<p>}</p>
<p>//注册类</p>
<p>Object.registerClass("testClass", myClass);</p>
<p>//将一个类的实例发送到远程应用服务器Flash Remoting网关</p>
<p>myService.myFunction(new testClass());</p>
<p>应用服务器上的服务方法接收到该请求，参数是一个type对象，在Java和ColdFusion中是flashgateway.io.ASObject，在 .NET环境中是FlashGateway.IO.ASObject。服务方法可以访问该类的type名：testClass（在Java和ColdFusion中使用对象的getType方法，在.NET环境中使用ASType属性）。</p>
<p>当服务方法创建了一个新的typed对象返回Flash Remoting MX时，在Java和ColdFusion中，它实际是创建了一个type flashgateway.io.ASObject对象；在.NET环境中，它实际是创建了一个type FlashGateway.IO.ASObject对象。服务方法使用对象的构造器（在.NET环境中使用ASType属性）为在ActionScript脚本中使用Object.registerClass方法指定的type设置类名。</p>
<p>当Flash客户端从服务方法中接收到typed对象时，Flash运行type的构造器，并粘附该对象所有的prototype方法。</p>
<br><br>
<h3>17.3&nbsp; 调用远程服务方法和处理远程服务调用结果</h3>
<p class=MsoNormal>使用Flash Remoting MX调用一个应用服务就像是在调用一个Web服务，或者是在做一个远程过程调用（RPC）。因为，当你对远程服务做一个调用时，你会从该服务获得一个回应。当使用Web服务和RPC时，远程服务上的数据先从其自身数据类型被转换成用于网络传输的数据，这种数据只是一种表示法。</p>
<p class=MsoNormal style="TEXT-INDENT: 21pt">与RPC或者Web服务请求不同，使用Flash Remoting MX进行的调用不直接接收远程服务的结果，而是编写一个结果处理程序来处理返回的数据。由于远程服务调用和结果处理程序是相互独立的，所以远程服务调用和结果处理是异步进行的。也就是说，远程服务请求就像是一个没有返回结果的方法调用，而远程服务请求的结果回应就像是一个Flash事件，你是为该事件编写了一个事件处理方法。<br><br></p>
<h3>17.3.1&nbsp; 调用远程服务方法</h3>
<p>要调用存在于一个服务对象中的方法，可以使用服务对象名，后面跟一个应用服务器方法名，就像下面的一行脚本语句：</p>
<p>weatherSvc.getTemperature("New York");</p>
<p>在本例中，方法getTemperature是位于应用服务器上的一个公共方法或应用程序网页 ，并且该方法也可以传递字符串格式的参数：New York。也可以使用远程服务方法传递多个参数，只需使用&#8220;逗号（,）&#8221;将参数隔开，例如下面的脚本代码：</p>
<p>weatherSvc.getTemperature("New York", 1998, "average");</p>
<p>在本例中，远程服务方法传递了三个参数：一个城市名（New York）、一个年份值（1998）和一个命令（average）。该方法用来求取1998年New York的平均气温。</p>
<p>注意：远程服务方法中的参数必须按照固定顺序排列。</p>
<p>如果没有在创建Service类实例时定义结果处理方法，那么可以在调用远程服务方法时定义一个Responder（回应）对象，用做结果处理的回应对象；如果在创建Service类实例时已经定义了结果处理方法，那么就不要在调用远程服务方法时再定义Responder对象了。</p>
<p>因此，定义Responder对象时，一般有两种方法：</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为一个Service类实例的所有方法定义同一个Responder对象</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为每一个方法定义不同的Responder对象</p>
<p>注意：在使用Connection对象的getService方法时定义了Responder对象后，就不要同时使用远程服务方法定义Responder对象。如果这样做的话，Flash Remoting MX就会将远程服务方法中定义的Responder对象作为一个参数传递给远程服务方法，这样程序就会出问题。</p>
<p>要为一个特定的远程服务方法定义结果处理方法，可以在定义方法的参数时将结果处理方法作为该方法的第一个参数，例如下面的脚本：</p>
<p>weatherSvc.getTemperature( new temperatureResult(), "New York", 1998, "average" );</p>
<p>在该例中，名为temperatureResult的结果处理方法就用来接收和处理返回的调用结果，还包括getTemperature 远程服务方法的出错信息。<br><br><br></p>
<h3>17.3.2&nbsp; 定义远程服务方法</h3>
<p>为了使用Flash Remoting MX，你必须在应用服务器上为Flash Remoting MX定义应用远程服务方法。根据应用服务器的种类不同，应用远程服务方法也不相同，并且同一种类服务器所能够应用的应用服务器方法名也不相同，在本书中仅介绍在.NET应用服务器上为使用Flash Remoting MX创建应用服务器的方法。</p>
<p>前面我们已经简单地介绍了 .NET应用服务器上可以作为Flash Remoting MX应用服务器方法的Microsoft.NET技术，包括ASP.NET网页、Web服务和程序集方法。</p>
<p>下面，我们再次强调一下，把这三种技术列在表17-4中。</p>
<p>表17-4&nbsp; 可以作为Flash Remoting MX应用服务器方法的Microsoft.NET技术</p>
<div align=center>
<table cellSpacing=0 cellPadding=0 width=491 border=1>
    <tbody>
        <tr>
            <td vAlign=top>
            <p>ASP.NET网页（.aspx）</p>
            </td>
            <td vAlign=top width=131>
            <p>网络根目录所在的目录</p>
            </td>
            <td vAlign=top width=209>
            <p>ASP.NET网页</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>DLL文件（.dll）</p>
            </td>
            <td vAlign=top width=131>
            <p>充分授权的类名</p>
            </td>
            <td vAlign=top width=209>
            <p>Public方法</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>.NET Web服务</p>
            </td>
            <td vAlign=top width=131>
            <p>命名空间</p>
            </td>
            <td vAlign=top width=209>
            <p>使用WSDL描述的网络服务器方法</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><!-- page --><br><br></p>
<h3>17.3.3&nbsp; 处理远程服务方法调用结果</h3>
<p>当应用服务器返回远程服务方法调用的结果时，事件处理方法就会应用返回的数据，或者处理返回的出错信息。</p>
<p>例如，结果处理方法可以在Flash影片应用程序中显示调用结果，而出错处理方法可以在Flash影片应用程序中设置trace方法显示出错信息。</p>
<p>对于使用Service类创建到远程服务的连接并调用远程服务方法的，以及可以使用RelayResponder 构造器直接指定对象和事件处理方法的，你可以直接使用这里定义的对象和事件处理方法处理返回的结果或出错信息。</p>
<p>对于使用NetServices类和Connection类创建到远程服务的连接，并调用远程服务方法的，则有更多的选择，你可以定义结果处理层级。</p>
<h4>1．结果处理层级</h4>
<p>Flash Remoting MX支持下列事件处理层级：</p>
<p>（1）如果在使用Connection对象的getService方法时定义了Responder对象，那么Flash Remoting MX就会做下列事件：</p>
<p>①如果Responder对象中有一个形如functionName_Result的方法，并且functionName是调用的远程服务方法名，Flash Remoting MX就会将该方法调用的结果返回给与该方法同名的_Result方法。</p>
<p>②如果Responder对象中有一个名为onResult的方法，Flash Remoting MX就会将该方法调用的结果返回给该方法。</p>
<p>（2）如果在调用远程服务方法时定义了Responder对象，那么Flash Remoting MX就会将结果返回给该对象的onResult方法。</p>
<p>注意：在使用Connection对象的getService方法定义了Responder对象后，就不要同时使用远程服务方法定义Responder对象。如果这样做的话，Flash Remoting MX就会将远程服务方法中定义的Responder对象作为一个参数传递给远程服务方法，这样程序就会出问题。</p>
<p>（3）当在Flash创作环境开发阶段测试应用程序时，没有定义一个Responder对象，那么Flash Remoting MX就会在&#8220;输出&#8221;面板中显示调用结果。</p>
<h4>2．结果处理策略</h4>
<p>不同的结果处理程序为开发人员提供了各种不同的结果处理策略，开发人员可以使用不同的策略来适应应用程序的需要。</p>
<p>下面我们来详细介绍一下开发过程中要应用的结果处理策略。</p>
<h5>（1）使用getService方法定义Responder对象</h5>
<p>如果使用gatewayConnection.getService方法定义Responder对象，那么可以应用下面的技术：</p>
<p>①在gatewayConnection.getService方法中定义一个对象（一般是主时间轴this）作为Responder对象，然后在主时间轴中为每一个远程服务方法创建一个单独的_Result处理方法。</p>
<p>一般在满足下列条件时使用该技术：</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对一个方法调用的_Result方法应与对另一个方法调用的_Result方法不同</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于所有远程服务中的所有方法来说，每个一方法都有一个独一无二的方法名。例如，你不能在两个远程服务调用中使用相同名字的方法：myFirstService. myFunction和myOtherService.myFunction，这样就会出问题，因为两个结果需要不同的处理过程</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个远程服务中对一个特定方法的调用可以使用一个Responder对象处理</p>
<p>②在gatewayConnection.getService方法中定义一个对象（一般是主时间轴this）作为Responder对象，然后在主时间轴中创建一个onResult方法处理所有的远程服务方法调用结果。</p>
<p>这种技术只有在对所有远程服务方法的所有请求的结果可以使用一个方式进行处理时才适用。</p>
<p>③使用前两种方法的结合。在gatewayConnection.getService方法中定义一个对象（一般是主时间轴this）作为Responder对象，然后在主时间轴中为一些远程服务方法创建单独的_Result方法，然后为其他的远程服务方法创建一个onResult方法处理这些远程服务方法调用的结果。</p>
<p>一般在满足下列条件时使用该技术：</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一些远程服务方法的调用结果的处理机制与其他远程服务方法调用结果的处理机制不同</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 处理机制不同的所有远程服务调用中的方法有一个独一无二的方法名</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一些远程服务方法虽然方法名不同，但其调用结果的处理机制相同</p>
<p>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对一个特定方法的不同调用，其调用结果可以使用一个Responder对象处理</p>
<p><strong>使用处理层级的例子</strong></p>
<p>下面的例子揭示了怎样使用主时间轴作为Responder对象，并且为一些远程服务方法定义一个onResult结果处理方法，以及为其他的一些远程服务方法定义特定的functionName_Result结果处理方法。</p>
<p>在该例中，有两个方法用于特定的functionName_Result结果处理方法，它们是getTemperature_Result和getForecast_Result（这两个方法用来显示返回的temperature和forecast）。而onResult结果处理方法用来在一个信息文本框中显示结果：</p>
<p>//初始化连接</p>
<p>if (inited == null) {</p>
<p>&nbsp;&nbsp;&nbsp; inited = true;</p>
<p>&nbsp;&nbsp;&nbsp; NetServices.setDefaultGatewayURL</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;("http://localhost/flashservices/gateway.aspx"); </p>
<p>&nbsp;&nbsp;&nbsp; gatewayConnection = NetServices.createGatewayConnection();</p>
<p>&nbsp;&nbsp;&nbsp; //定义主时间轴作为默认的Responder对象</p>
<p>&nbsp;&nbsp;&nbsp; weatherService = gatewayConnection.getService("flashExamples.weatherStation",</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;this);</p>
<p>}</p>
<p>//结果处理方法</p>
<p>function getTemperature_Result(temperature) {</p>
<p>&nbsp;&nbsp;&nbsp; temperatureIndicator.text = temperature;</p>
<p>}</p>
<p>function getForecast_Result(forecast) {</p>
<p>&nbsp;&nbsp;&nbsp; forecastIndicator.text = forecast;</p>
<p>}</p>
<p>//默认的回应处理方法</p>
<p>function onResult(result) {</p>
<p>&nbsp;&nbsp;&nbsp; generalMessageBox.text = result;</p>
<p>}</p>
<p>//调用远程服务方法</p>
<p>weatherService.getTemperature("New York");</p>
<p>weatherService.getForecast("Chicago");</p>
<p>weatherService.getServiceStatus("San Francisco");</p>
<p>weatherService.getUsageStats();</p>
<h5>（2）使用远程服务方法定义Responder对象</h5>
<p>如果要在调用远程服务方法时定义Responder对象，可以使用下面的技术：</p>
<p>①定义一个Responder对象。使用结果处理方法将结果值赋给一个Responder对象，可以将Responder对象的一个实例作为gatewayConnection.getService方法的一个参数传递给它。</p>
<p>使用这种技术比使用this作为Responder对象更加面向对象，这允许你使用更加结构化的代码。</p>
<p>②定义几个不同的Responder对象。使用结果处理方法将结果值赋给不同的Responder对象，可以将每一个Responder对象的一个实例作为serviceName.functionName调用时的一个参数传递给它。</p>
<p>该技术允许开发人员为特定Responder对象创建方法，在这种情况下，一些service应有相同的方法名，但是返回的数据不同；该技术也允许开发人员为一个远程服务方法创建几个不同的结果处理方法。</p>
<p>③使用上述两种方法的结合。为一些远程服务方法使用多个Responder对象；为另一些远程服务方法使用单独的一个Responder对象。</p>
<p>下面是在远程服务方法调用中为每一方法定义一个result对象的例子，与前面介绍的例子目的基本相同，但是我们在该例的远程服务方法调用中为每一调用定义了回应处理对象。</p>
<p>在该例中，有三个回应处理对象，它们是tempResult、forecastResult和generalResult（这三个回应处理对象分别用来显示返回的temperature、forecast和其他的远程服务方法）。每一个回应处理对象中有一个onResult结果处理方法用来处理远程服务方法调用返回的结果：</p>
<p>//初始化连接</p>
<p>if (inited == null) {</p>
<p>&nbsp;&nbsp;&nbsp; inited = true;</p>
<p>&nbsp;&nbsp;&nbsp; NetServices.setDefaultGatewayURL</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;("http://localhost/flashservices/gateway.aspx"); </p>
<p>&nbsp;&nbsp;&nbsp; gatewayConnection = NetServices.createGatewayConnection();</p>
<p>&nbsp;&nbsp;&nbsp; //在创建Service类实例时不要定义默认的Responder对象</p>
<p>&nbsp;&nbsp;&nbsp; weatherService = gatewayConnection.getService</p>
<p>&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;("flashExamples.weatherStation");</p>
<p>}</p>
<p>//Temperature的结果处理对象</p>
<p>function tempResult() {</p>
<p>&nbsp;&nbsp;&nbsp; this.onResult = function(temperature) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temperatureIndicator.text = temperature;</p>
<p>&nbsp;&nbsp;&nbsp; };</p>
<p>}</p>
<p>//Forecast的结果处理对象</p>
<p>function forecastResult() {</p>
<p>&nbsp;&nbsp;&nbsp; this.onResult = function(forecast) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; forecastIndicator.text = forecast;</p>
<p>&nbsp;&nbsp;&nbsp; };</p>
<p>}</p>
<p>//General的结果处理对象</p>
<p>function generalResult() {</p>
<p>&nbsp;&nbsp;&nbsp; this.onResult = function(result) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; generalMessageBox.text = result;</p>
<p>&nbsp;&nbsp;&nbsp; };</p>
<p>}</p>
<p>//调用远程服务方法，并指定结果处理方法的一个实例作为第一个参数</p>
<p>weatherService.getTemperature(new tempResult(), "New York");</p>
<p>weatherService.getForecast(new forecastResult(), "Chicago");</p>
<p>weatherService.getServiceStatus(new generalResult(), "San Francisco");</p>
<p>weatherService.getUsageStats(new generalResult());</p>
<p><!-- page --><br><!-- page --><!-- page --></p>
<img src ="http://www.cppblog.com/twzheng/aggbug/29176.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-02 10:32 <a href="http://www.cppblog.com/twzheng/articles/29176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 将flash与asp.net结合进行web开发</title><link>http://www.cppblog.com/twzheng/articles/28924.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sun, 29 Jul 2007 03:12:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/28924.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/28924.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/28924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/28924.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/28924.html</trackback:ping><description><![CDATA[Macromedia Flash* 已广泛应用于互联网，它能够增强网站的展示内容。Macromedia Flash的最新版本已明确显示了，Macromedia 公司非常重视使 Flash 成为 Web 应用开发的一种理想界面选择。作为界面，Flash 是一个功能强大的选择；然而，它不能取代业务逻辑、查询管理以及安全性。为增强性能和企业能力，您需要使用 .NET*。对于 Web 开发人员而言，具备强大演示支持的 Flash 与微软公司的 .NET 技术能够进行有效的结合。<br><br>Flash 带有 ActionScript*（一种脚本语言），能为电影添加交互能力。最初在 Flash 5 中引入 ActionScript 时，Macromedia 公司就将其从简单的脚本语言发展成为一种带有可靠但有限的编程特性的脚本语言。在 Flash MX 2004 中，Macromedia 公司引入了 ActionScript 2.0，该脚本语言支持以全新的能力和方式构建并处理代码。为了充分理解本文内容，您需要首先阅读并理解用于创建一个 Flash 站点的 <a href="http://www.macromedia.com/support/flash/action_scripts/actionscript_tutorial/" target=_new><font color=#0860a8><u>ActionScript 基础知识</u></font></a>&nbsp;<img alt="" src="http://cache-www.intel.com/plt/cd/ineng_cn.gif" border=0>*。<br><br>
<div class=heading xmlns=""><font color=#006400>将 Flash 与外部数据相连</font></div>
<div class=mb xmlns=""></div>
<p xmlns="">有三种方法可以将外部数据与 Flash 电影连接在一起：<strong>FlashVars</strong>、 <strong>LoadVars</strong> 以及全新的 FlashRemoting 技术。其中最简单的方法是利用 <strong>FlashVars</strong> 传递代码 HTML 部分中的变量，将外部数据从一个 .aspx 页面传递至 Web 页面中嵌入的 Flash 电影。利用 <strong>FlashVars</strong> 设置的变量值可在 Flash 电影的根级别上使用。必须在 <tt><strong>OBJECT</strong></tt> 和 <tt><strong>EMBED</strong></tt> 标签中为 <strong>FlashVars</strong> 属性赋值，这是为了确保它能在所有的浏览器中使用。</p>
<p xmlns="">以下代码显示的是使用 <tt><strong>OBJECT</strong></tt> 标签的 <strong>FlashVars</strong></p>
<p xmlns="">&nbsp;&nbsp;&nbsp;&nbsp;<tt>&lt;PARAMName="FlashVars"Value="init=yes&amp;check=true"&gt;</tt></p>
<p xmlns="">以下显示的是使用 <tt><strong>EMBED</strong></tt> 标签的 <strong>FlashVars</strong></p>
<p xmlns="">&nbsp;&nbsp;&nbsp;&nbsp;<tt>&lt;EMBEDsrc="test.swf"FlashVars="init=yes&amp;check=true"&gt;&lt;/EMBED&gt;</tt></p>
<p xmlns="">欲了解更多关于 <strong>FlashVars</strong> 的知识，请参阅 Macromedia 公司的文章：</p>
<p xmlns=""><a href="http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_16417" target=_new><font color=#0860a8><u>http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_16417</u></font></a>&nbsp;<img src="http://cache-www.intel.com/plt/cd/ineng_cn.gif">*</p>
<br>
<div class=heading xmlns="">让 Flash 与数据库通信</div>
<div class=mb xmlns="">Flash 不能直接访问数据库。但是，Flash 可通过任意服务器端技术（如 ASP 或 ASP.NET）与数据库进行通信。有几种方法可实现该操作。在本文中，我们将讨论 <strong>LoadVariables</strong> 方法和 <strong>sendAndLoad</strong> 方法。<br><br><strong>利用来自电影剪辑的 loadVariables 方法</strong><br><br>电影剪辑的 <strong>loadVariables</strong> 方法从外部文件或 URL 中读出数据，并为电影剪辑的变量设置值。当电影剪辑完成初始化后，启动电影剪辑 <strong>onClipEvent</strong> 事件处理程序的 <strong>load</strong> 活动。当启动电影剪辑时，能够调用 <strong>loadVariables</strong> 方法来加载变量。<strong>loadVariables</strong> 方法为异步调用，Flash 不会等待调用的结果。当在 <strong>loadVariables()</strong> 活动中接收数据时，会启动电影剪辑 <strong>onClipEvent</strong> 事件处理程序的 <strong>data</strong> 活动。<br><br>为了演示如何使用该方法，下面的示例根据 Flash 电影中选择的 ID，从数据库中检索用户的姓名和年龄。在下图的代码中，使用电影的 <strong>loadVariables</strong> 方法，将数据从 .aspx 页面（<strong>getUserData.aspx</strong>）加载至电影剪辑中。ActionScript 将用户的 <strong>id</strong> 作为查询字符串传递至.aspx 页面，由此在 Flash 电影中显示出对应 <strong>id</strong> 的 <strong>name</strong> 和 <strong>age</strong>。<br><br><img alt="" src="http://cache-www.intel.com/cd/00/00/22/01/220198_220198.gif" border=0><br><br><strong>getUserData.aspx</strong> 页面从查询字符串中获取 <strong>id</strong> 值，如下图所示：<br><br><img alt="" src="http://cache-www.intel.com/cd/00/00/22/01/220199_220199.gif" border=0><br><br>现在，ASP.NET 能够将该 <strong>id</strong> 值传递至 .NET 业务组件。下面的示例用来检索用户的 <strong>name</strong> 和 <strong>age</strong>：<br><br><img alt="" src="http://cache-www.intel.com/cd/00/00/22/02/220200_220200.gif" border=0><br><br>如本节开始所述，当在 <strong>loadVariables()</strong> 活动中接收数据时，启动电影剪辑 <strong>onClipEvent</strong> 事件处理程序的 <strong>data</strong> 活动。在 Flash 电影中声明以下动态变量: <strong>flashName</strong> 和 <strong>flashAge</strong>。下图显示 Flash 电影的事件 <strong>onClipEvent</strong> 处理程序使用的 ActionScript 代码，来检索从 .aspx 页面返回的值。<br><br><strong>注意：</strong>非常重要的一点是，在 Flash 电影中存取的变量与在 .aspx 页面中设置的变量是相同的。在此处演示的示例中，Flash 电影中存取的变量值为&#8220;<strong>name</strong>&#8221;，该值与在 .aspx 页面（<strong>Response.Write(&#8220;name=&#8221; &amp; User.name)</strong> ）中设置的值相同。<br><br><img alt="" src="http://cache-www.intel.com/cd/00/00/22/02/220201_220201.gif" border=0><br><br>现在，可将这些值应用于 Flash 电影中。<br><br><strong>使用电影剪辑的 sendAndLoad 方法</strong><br><br>在当今的互联网中，XML 作为通用转换格式，支持不同种类的应用平稳地交换数据，它实现了其作为文档系统的尽可能多的承诺。XML 提供一个网关，用于在应用（甚至在显著不同的系统上）之间进行通信。当应用能够共享数据（通过 HTTP（超文本传输协议）、文件共享或其它机制）并具有 XML 解析器的时候，则这些应用可共享易于处理的结构化信息。<br><br>Flash MX 支持 XML Data Transfer（数据传输），并具有几种与服务器技术（如 ASP* 和 ASP.NET）交换 XML 的方式。Flash MX 能够利用 XML 类（<strong>load</strong>、 <strong>send</strong> 和<strong>sendAndLoad</strong>）或 Flash MX 的新型 <strong>XMLConnector</strong> 发送和接收 XML 数据包。通过 HTTP 并将数据包捆绑至 Flash 中 UI 组件的方式，<strong>XMLConnector</strong> 可用来发送和接收这些数据包。<br><br>本节讨论 Flash XML 对象的 <strong>sendAndLoad</strong> 方法。在 XML 数据通信、异常处理以及性能有关的架构方面，这是一种首选的方法。我们使用如下简单的示例：从 Flash 客户端中，将用户的得分情况记入数据库，并将&#8220;通过&#8221;或&#8220;未通过&#8221;的消息返回 Flash 客户端。<br><br><em>在 Flash 中创建一个 XML 包</em><br><br>能够轻松地在 Flash 中创建 XML 数据包，如下所示：<br><br><strong>var sendXML:XML = new XML(&#8220;&lt;userid&gt;123456&lt;/userid&gt;&#8221;);</strong><br><br><em>发送一个 XML 包至&#8220;服务器端&#8221;页面，该页面利用 ASP/ASP.NET，并处理返回的 XML 数据包。</em><br><br>使用：<br><br></div>
<blockquote xmlns="">
<p><strong>xmlObject.sendAndLoad (URL: String, targetXMLObject: XML): Void</strong><br><br>&#8216;<strong>xmlObject</strong>&#8217; 为 XML 对象实例，该实例对需要传递至 .aspx 页面的 XML 进行压缩。</p>
<p>&#8216;<strong>URL</strong>&#8217; 为指定 XML 对象的目标 URL。</p>
<p>&#8216;<strong>targetXMLObject</strong>&#8217; 为从服务器接收返回信息的 XML 对象。</p>
</blockquote>
<p xmlns=""><strong>sendAndLoad</strong> 方法是这样一个工作方式：发送 XML 包至服务器端模板，并接收 XML 包作为响应，该方法不同于 XML 类的 <strong>send</strong>方法，后者仅发送 XML 包，并不作出任何种类的响应。每种方法在各自的方式下工作都非常有效，但它们之间有一个显著的区别：XML 类 <strong>send</strong> 方法将目标 XML 包作为参数，允许您打开一个新的浏览器窗口或替换当前的浏览器窗口中的内容，而 <strong>sendAndLoad</strong> 方法虽然将目标 XML 包作为参数，但不能启动新的浏览器窗口。因为 <strong>send</strong> 方法打开一个新的浏览器窗口，我们可以看到浏览器窗口自身的输出情况，这对于调试可能会非常有用。</p>
<p xmlns=""><strong>注意</strong>： 如果调用 <strong>sendAndLoad</strong> 的 Flash 文件正运行于 Web 浏览器，那么，目标 URL 应该与 Flash 电影位于相同的域中。如果您仍需与不同域中的应用进行通信，则请在<a href="http://www.macromedia.com/" target=_blank><font color=#0860a8><u>www.macromedia.com</u></font></a>&nbsp;<img src="http://cache-www.intel.com/plt/cd/ineng_cn.gif">* 的&#8220;跨域数据加载（Cross Domain Data Loading）&#8221;中查看更多的信息。</p>
<p xmlns="">下图显示了如何使用 XML 对象的 sendAndLoad 方法与一个 .aspx 页面进行通信，以及如何处理从服务器返回的 XML：</p>
<p xmlns=""><img src="http://www.intel.com/cd/ids/developer/apac/zho/downloads/220202.htm"><br><br></p>
<br xmlns="">
<div class=mb xmlns="">以上代码进行如下操作：<br><br></div>
<div class=mb xmlns="">
<ul class=tempul>
    <li>将 XML 字符串加载至 XML 对象&#8220;<strong>userscore_xml</strong>&#8221;中。该实例保留将发送至远程服务器端 ASP.NET 页面的 XML。
    <li>为 XML 对象&#8220;<strong>ResponseXMLObj_xml</strong>&#8221;设置 <strong>ignoreWhite</strong> 的属性。该 XML 对象实例保留从服务器返回的 XML 包。
    <li>调用 XML 对象（&#8220;userscore_xml&#8221;）的 <strong>sendAndLoad</strong> 方法来发送 XML 至服务器端 .aspx 页面（<strong>http://localhost/MyTestApp/scoring.aspx</strong>）并将返回的 XML 包存储至 XML 对象实例&#8220;ResponseXMLObj_xml&#8221;中。
    <li>设置 XML 对象&#8220;<strong>ResponseXMLObj_xml</strong>&#8221;的 onLoad 方法。Flash 接收从服务器端 .aspx 页面返回的 XML 响应，该 XML 响应在 XML 对象的 <strong>onLoad</strong> 方法中进行处理。</li>
</ul>
</div>
接着，该方法对接收的 XML 包进行解析，以便在 Flash 客户端显示出必要的消息。<br><br><em>接收从 ASPX 页面中的 Flash 发出的 XML 包</em><br><br>下图显示了实现这一操作的代码：<br><br><img src="http://www.intel.com/cd/ids/developer/apac/zho/downloads/220203.htm"><br><br><br><br>以上代码进行如下操作：<br><br>
<ul class=tempul>
    <li>接收从 Flash 客户端发送的 XML。（<strong>xmlDoc.Load(Request.InputStream)</strong>）
    <li>解析接收的 XML，并将其传递至业务组件，从而插入数据库。
    <li>构成将其传递回 Flash 客户端的 XML 消息。相应地处理业务层中产生的 <strong>Success</strong> 和 <strong>Exception</strong> 条件，并将其转换为相应的 XML 消息传递回 Flash 客户端。Flash 客户端接收这些 XML 消息并相应地显示出</li>
</ul>
<hr id=null>
<p><br><br>以下是一些技术文章：<br><br></p>
<p>传统网络程序的开发是基于页面的、服务器端数据传递的模式，把网络程序的表示层建立于HTML页面之上，而HTML是适合于文本的，传统的基于页面的系统已经渐渐不能满足网络浏览者的更高的、全方位的体验要求了，这就是被Macromedia公司称之为的&#8220;体验问题&#8221;（"Experience Matters"），而丰富互联网应用程序（Rich Internet Applications，缩写为RIA）的出现也就是为了解决这个问题。</p>
<p>http://www.flash-db.com/Board/index.php<br><a href="http://www.capescience.com/"><font color=#0000ff><u>http://www.capescience.com/</u></font></a></p>
<p>Consuming Amazon with Flash Remoting<br><a href="http://www.oreillynet.com/pub/a/javascript/2003/01/09/flash.html"><font color=#0000ff><u>http://www.oreillynet.com/pub/a/javascript/2003/01/09/flash.html</u></font></a></p>
<p>JS/Flash 整合开发工具包下载 <br><a href="http://www.cnblogs.com/MarkStudio/archive/2005/06/26/181370.html"><font color=#0000ff><u>http://www.cnblogs.com/MarkStudio/archive/2005/06/26/181370.html</u></font></a></p>
<p>为flash构建asp.net Webservice <br><a href="http://www.blueidea.com/tech/multimedia/2003/1094.asp"><font color=#0000ff><u>http://www.blueidea.com/tech/multimedia/2003/1094.asp</u></font></a></p>
<p>ASP.NET Topic Center<br><a href="http://www.macromedia.com/devnet/dotnet/"><font color=#0000ff><u>http://www.macromedia.com/devnet/dotnet/</u></font></a></p>
<p>FLEX,Central,AS 2.0,MXML,SWC,<br><a href="http://blog.joycode.com/eric/category/379.aspx"><font color=#0000ff><u>http://blog.joycode.com/eric/category/379.aspx</u></font></a></p>
<p>FLEX<br><a href="http://www.macromedia.com/cn/software/flex/"><font color=#0000ff><u>http://www.macromedia.com/cn/software/flex/</u></font></a></p>
<p>flash组件体系<br><a href="http://www.cahf.net.cn/blog/library/component/Help/"><font color=#0000ff><u>http://www.cahf.net.cn/blog/library/component/Help/</u></font></a></p>
<p>flash MX 2004 PRO+COLDFUSION+PHP+MYSQL PROVECT<br><a href="http://www.cahf.net.cn/blog/library/"><font color=#0000ff><u>http://www.cahf.net.cn/blog/library/</u></font></a></p>
<p><a href="http://www.cahf.net.cn/blog/"><font color=#0000ff></font></a>&nbsp;</p>
<p>7yue Weblog<br><a href="http://www.7yue.com/"><font color=#0000ff><u>http://www.7yue.com/</u></font></a></p>
<p>RIA演示<br><a href="http://www.macromedia.com/resources/business/rich_internet_apps/overview/"><font color=#0000ff><u>http://www.macromedia.com/resources/business/rich_internet_apps/overview/</u></font></a></p>
<p>flashanywhere<br><a href="http://www.flashanywhere.net/mxna/"><font color=#0000ff><u>http://www.flashanywhere.net/mxna/</u></font></a></p>
<p><br>Flash MX 2004及RIA相相关工具下载收集<br><a href="http://www.netbei.com/Article/pic/Flash/flash8/200409/2492.html"><font color=#0000ff><u>http://www.netbei.com/Article/pic/Flash/flash8/200409/2492.html</u></font></a></p>
<p>flash数据开发教程<br><a href="http://download.macromedia.com/pub/documentation/cn/flash/mx2004/data_tutorials.pdf"><font color=#0000ff><u>http://download.macromedia.com/pub/documentation/cn/flash/mx2004/data_tutorials.pdf</u></font></a></p>
<p><span id=firstpostad align="center"><br></span>&nbsp;</p>
<img src ="http://www.cppblog.com/twzheng/aggbug/28924.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-07-29 11:12 <a href="http://www.cppblog.com/twzheng/articles/28924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Flash初学者123个常见问题收集整理</title><link>http://www.cppblog.com/twzheng/articles/28895.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sat, 28 Jul 2007 06:24:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/28895.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/28895.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/28895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/28895.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/28895.html</trackback:ping><description><![CDATA[<p><font size=2>1,FLASH是什么? <br>FLASH电影是专为网页服务的画像或动画(当然，也可用于其它用途)。主要含有矢量图形，但是也可以包含导入的位图和音效，还可以把浏览者输入的信息同交互性联系起来，从而产生交互效果，也可以生成非线性电影动画。该动画可以同其它的WEB程序产生交互作用。网页设计师可以利用FLASH来创建导航控制器、动态LOGOS、含有同步音效的长篇动画、甚至可以产生完整的、富于敏感性的网页。 </font></p>
<p><font size=2>2,怎样做一个简单地FLASH动画? <br>首先,打开你的FLASH软件,绘制一个圆形(左面地圆形工具可以直接绘制),然后按F8添加为一个Symbol,再图层第十祯地位置按F6键添加一个关键祯,并适当移动该Symbol的位置,最后在第一祯位置点鼠标右键选择Motion就行了. </font></p>
<p><font size=2>3,什么叫矢量图? <br>矢量图可以任意缩放而不影响Flash的画质，位图图像一般只作为静态元素或背景图，Flash并不擅长处理位图图像的动作，应避免位图图像元素的动画。 </font></p>
<p><font size=2>4,如何迅速地对齐不同Frame中的物件? <br>用 Inspector &#8220;Ctrl+Alt+I&#8221; 直接输入坐标。 <br>或是工具栏〉〉窗口〉〉面板〉〉排列&#8220;Ctrl+K&#8221; 调出排列面板来。图例 </font></p>
<p><font size=2>5,怎样调节一个Symbol/MC地透明度? <br>选中Symbol/MC,菜单栏找到Modify(修改) 〉〉 Instance (实例)〉〉Color effect (效果)〉〉 Alpha(透明度) 调整就可以了 </font></p>
<p><font size=2>6,做好地Flash放在html上面以后,它老是循环,怎么能够让它不进行循环？ <br>最后一个祯地Action设置成Stop(停止) </font></p>
<p><font size=2>7,怎样给我的FLASH做一个预加载地LOADING? <br>用Action语法地if frame is loaded来实现,新建一层，这层专门放Action, <br>第一帧， <br>ifFrameLoaded ("场景", frame) {//假如场景中地祯数已经载入 <br>goto and play() //跳至并播放某某祯(自己设定) <br>} <br>第二帧， <br>goto and play("场景1", 1)//跳至并播放第一祯循环 <br>再加上一个load地MC循环播放在这两帧的中间，就OK了。 </font></p>
<p><font size=2>什么?你要非常详细地LOADING?那就当这个源码吧,够详细了. <br>源码下载 </font></p>
<p><font size=2>8,怎样点击一个按钮打开一个页面html而不是一个祯. <br>制作一个按钮,上面地AS直接写: <br>on (release) { <br>getURL ("***.html"); <br>} <br>这里地***.html就是你要打开地页面文件名,当然也可以是某某URL地址,比如说http://www.flash8.net/ </font></p>
<p><font size=2>9,我在按钮地OVER祯放置了一个很大地MC,为什么我要没有点击到按钮鼠标就变成了手地状态? <br>按钮真正激活区是在HIT(按下)祯地位置,如果想控制按钮的位置为一定值,可以在HIT祯绘制一个透明地图形来判断. </font></p>
<p><font size=2>10,如果屏蔽鼠标右键?FS命令都是什么意思? <br>fscommand ("fullscreen", "true/false");（全屏设置，TRUE开，FALSE关） </font></p>
<p><font size=2>fscommand ("showmenu", "true/false");（右键菜单设置，TRUE显示，FALSE不显示） </font></p>
<p><font size=2>fscommand ("allowscale", "true/false");（缩放设置，TRUE自由缩放，FALSE调整画面不影响影片本身的尺寸） </font></p>
<p><font size=2>fscommand ("trapallkeys", "true/false");（快捷键设置，TRUE快捷键开，FALSE快捷键关） </font></p>
<p><font size=2>fscommand ("exec");（EXE程序调用） </font></p>
<p><font size=2>fscommand ("quit");（退出关闭窗口）<br><br></p>
<p><font size=2>11,在FLASH中的字体总是很模糊,用变清晰地办法吗? <br>写好文本以后CTRL+T打开文本设置面板,在最后地文本框选项那里框选使用设计字体就行了.(注意最好使用宋体,尺寸为12或者8,这样比较工整) </font></p>
<p><font size=2>12,我想做一个MTV,怎么导入声音呀? <br>很简单,CTRL+R导入你地声音文件就行了. </font></p>
<p><font size=2>13,我制作地MTV声音和歌词总是不同步. <br>CTRL+F打开祯控制面板,右边找到声音选项卡,调整声音地同步效果为STREM(音频数据流)模式就行了. </font></p>
<p><font size=2>14,为什么我做出来地MTV文件很大呀? <br>参看这篇贴子 </font></p>
<p><font size=2>15,FLASH地发布设置都有些什么?透明背景怎样设置? <br>图解图1图2图3 <br>在Dreamewaver中地设置： <br>图解 <br>（由FLASHWEB提供图材） </font></p>
<p><font size=2>16,怎样可以做出很漂亮地字体特效? <br>用第三方软件Swish和Swfx这些,闪吧地软件资源有下载. </font></p>
<p><font size=2>17,如何优化我地FLASH? <br>参看这篇贴子 </font></p>
<p><font size=2>18,我在ACTION面板地高级模式为什么字体总是很小? </font></p>
<p><font size=2><br>19,如何加载一个SWF文件 <br>loadMovieNum地技巧 <br>添加一个空地MC。实体名为ok，ACTION： <br>loadMovie ("dr/test.swf", "_root.ok"); </font></p>
<p><font size=2>控制这个MC的位置，大小等相对属性（Property）就会影响调入SWF的位置和大小。 <br>setProperty ("mc", _xscale, "****"); <br>setProperty ("mc", _yscale, "****"); <br>setProperty ("mc", _x, "****"); <br>setProperty ("mc", _y, "****"); <br>setProperty ("mc", _Alpha, "****"); ............ </font></p>
<p><font size=2>20,如何导入一个背景透明度效果比较好地位图？ <br>推荐使用PNG格式（FIREWORK），FLASH对PNG位图地融合透明效果支持相当好。 <br><br></p>
<p><font size=2>21.问： 如何用actionscript将页面设为首页和加入收藏夹？ <br>答： 一，用getURL的方法： </font></p>
<p><font size=2>设为首页： <br>on (release) { <br>getURL("javascript:void(document.links[0].style.behavior='url(#default#homepage)');void document.links[0].setHomePage('http://www.flashempire.com/');", "_self", "POST"); <br>} </font></p>
<p><font size=2>加入收藏夹： <br>on (release) { <br>getURL("javascript:void window.external.AddFavorite('http://www.flash8.net','闪吧');", "_self", "POST"); <br>} </font></p>
<p><font size=2>二，用fscommand的方法，有点复杂 </font></p>
<p><font size=2>1，先在flash的按钮上添加代码： </font></p>
<p><font size=2>首页： <br>on (release) { <br>fscommand("setHomePage", "http://www.flash8.net"); <br>} </font></p>
<p><font size=2>收藏夹： <br>on (release) { <br>fscommand("addFavorite", "http://www.flash8.net|闪吧"); <br>} </font></p>
<p><font size=2>然后在发布设置中选择flash with fscommand，发布成html </font></p>
<p><font size=2>2，修改html： </font></p>
<p><font size=2>找到 <br>// Handle all the the FSCommand messages in a Flash movie <br>function sethomepage_DoFSCommand(command, args) { <br>} <br>这一段，修改成： <br>// Handle all the the FSCommand messages in a Flash movie <br>function sethomepage_DoFSCommand(command, args) { <br>var sethomepageObj = InternetExplorer ? sethomepage : document.sethomepage; <br>if (command == "setHomePage") { <br>document.links[0].style.behavior = "url(#default#homepage)"; <br>document.links[0].setHomePage(args); <br>} else if (command == "addFavorite") { <br>args = args.split("|"); <br>window.external.AddFavorite(args[0], args[1]); <br>} <br>} </font></p>
<p><font size=2>最后，如果html里一个链接都没有，还需在&lt;SCRIPT LANGUAGE=javascript&gt;这句的前面添加一句&lt;a href="javascript:"&gt;&lt;/a&gt; </font></p>
<p><font size=2>22.问： 怎么让动画放完后自动关闭? <br>答： 在最后一桢的ACTION里选FSCOMMOND一项，然后在右边选中QUIT，就可以了 </font></p>
<p><font size=2>23。问： 怎样引入透明的位图? <br>答： 最好输入png文件。png是fireworks文档。当然你也可以输入GIF89a格式的透明GIF图片。 </font></p>
<p><font size=2>24。问： 如何在Flash中打开一个定制的浏览器新窗口？ <br>答： 这个问题，很常见，也讨论过无数次，以前的一些有用的帖子找不到了，现在重新整理如下： <br>常用也是很简单的方法是用类似 <br>Get URL ("javascript:window.open('new.htm','newwin','width=320,height=320');") <br>这样的一句，但有很多问题，比如打开了新窗口后，原窗口的内容也被替代了。 </font></p>
<p><font size=2>1、在Flash中需要执行打开新窗口动作的地方插入以下语句： <br>FS Command ("open_window", "filename.htm;newwin;toolbar=no,location=no,status=no, <br>menubar=no,scrollbars=no,resizable=no,width=320,height=200") <br>其中Arguments: <br>filename.htm 要打开的文件名 <br>newwin 新窗口的名字 <br>toolbar=no,location=no,status=no, <br>menubar=no,scrollbars=no,resizable=no,width=320,height=200 新窗口的有关属性，包括尺寸 <br>注意以上三部分要用分号";"分隔 </font></p>
<p><font size=2>2、在File&gt;Publish setting...中设定 <br>HTML中的Tempalte : Flash with FSCommand <br>发布 </font></p>
<p><font size=2>3、编辑发布生成的html文件，找到以下一段： </font></p>
<p><font size=2>code:--------------------------------------------------------------------------------&lt;SCRIPT LANGUAGE=javascript&gt; <br>&lt;!-- <br>var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1; <br>// Handle all the the FSCommand messages in a Flash movie <br>function Movie1_DoFSCommand(command, args) { <br>var Movie1Obj = InternetExplorer ? Movie1 : document.Movie1; <br>// <br>// Place your code here... <br>// <br>} <br>... <br>-------------------------------------------------------------------------------- </font></p>
<p><font size=2>改为： </font></p>
<p><font size=2>code:--------------------------------------------------------------------------------&lt;SCRIPT LANGUAGE=javascript&gt; <br>&lt;!-- <br>var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1; <br>// Handle all the the FSCommand messages in a Flash movie <br>function Movie1_DoFSCommand(command, args) { <br>var Movie1Obj = InternetExplorer ? Movie1 : document.Movie1; <br>// Place your code here... <br>if (command == "open_window") <br>{ <br>arg_array=args.split(";"); <br>window.open(arg_array[0],arg_array[1],arg_array[2]); <br>} <br>} <br>... <br>-------------------------------------------------------------------------------- </font></p>
<p><font size=2>OK! <br>如果是插入现有的html页，可以先发布，再copy相应的代码到html文件。 </font></p>
<p><font size=2>25。问： 如何用action控制倒放？ <br>答： 做一个mc放在合适的地方，里面有两帧 <br>第一帧： <br>If (GetProperty ("/a",_currentframe)&lt;=1) <br>Begin Tell Target ("/a") <br>Go to and Stop (GetProperty ("/a",_totalframes)) <br>End Tell Target <br>Else <br>Begin Tell Target ("/a") <br>Go to and Stop (GetProperty ("/a",_currentframe)-1) <br>End Tell Target <br>End If <br>第二帧： <br>Go to and Play (1) </font></p>
<p><font size=2>这样就可以让/a倒放 </font></p>
<p><font size=2>但是还有一个问题无法解决： <br>如果我只想停一段呢？[/color] <br>比如说，我在第十个关键帧处加了一个STOP，在第三十个关键帧处加了一个STOP，现在想倒到STOP处停下来，却没有办法做到。 </font></p>
<p><font size=2>If (GetProperty ("/a",_currentframe)&lt;=1) <br>Begin Tell Target ("/a") <br>Go to and Stop (GetProperty ("/a",_totalframes)) <br>End Tell Target <br>Else <br>Begin Tell Target ("/a") <br>Go to and Stop (GetProperty ("/a",_currentframe)-1) <br>End Tell Target <br>End If <br>第二帧： <br>Go to and Play (1) <br>这一段肯定放在一个mc 里, <br>假设这个mc为/b <br>在/a需要停止的帧理设置 <br>Begin Tell Target ("/b") <br>stop <br>End Tell Target <br>stop <br>就可以了 </font></p>
<p><font size=2>26。问： 内部声音角色与外部声音角色有何差异？ <br>答： 没什么太大的区别 <br>外部文件如果导如的话可以降低文件的大小 <br>在发布的时候或者做成光盘的时候需要和DCR文件一起走，并且始终保持相对路径不变 </font></p>
<p><font size=2>还有一个流式播放的问题 <br>如果导入的声音文件过大就会影响同步效果，声音滞后。（因为Director在播放内部声音之前就将其预栽到RAM中）外部声音文件是流式的，一边播放，一边下载。但要注意连接路径问题。 </font></p>
<p><font size=2>27。问： 如何使声音无限循环？ <br>答： 将声音的循环次数定义成足够大，如果你的音乐设为STREM(音频数据流)那你的swf文件也会足够大。 </font></p>
<p><font size=2>28。问： 如何控制声音的播放及停止 <br>答： 在library 里右健点击声音文件，选linkage&#8230; <br>设置Export This Symbol <br>entifier： <br>取名为"sound" </font></p>
<p><font size=2>然后就可以在stage里面设置了 <br>s = new Sound(); <br>s.attachSound("sound"); </font></p>
<p><font size=2>要让声音sound关掉只须 <br>执行： <br>s.stop(); <br>要让他开始播放就是 <br>s.start(); </font></p>
<p><font size=2>29.问： 如何调入SWF文件及控制它的大小和位置？ <br>答： 一、如何调入一个SWF文件： </font></p>
<p><font size=2>调入一个SWF置给一个层loadMovieNum ("path/movieFile.swf", 0); <br>其&#8220;path/movieFile.swf&#8221;为要调入文件的地址，&#8220;0&#8221;为层号，&#8220;0&#8221;为第0层； </font></p>
<p><font size=2>调入一个SWF置给一个MC <br>loadMovie ("path/movieFile.swf", "MC_Name");其&#8220;path/movieFile.swf&#8221;为要调入文件的地址，&#8220;MC_Name&#8221;是MC的名字。 </font></p>
<p><font size=2>二、如何改变调入后的SWF大小： </font></p>
<p><font size=2>setProperty ("MC_Name", _xscale, size_x); <br>setProperty ("MC_Name", _yscale, size_y); </font></p>
<p><font size=2>&#8220;MC_Name&#8221;顾名思义是那个MC的名字了，&#8220;_xscale&#8221;和&#8220;_yscale&#8221;是指这个MC的X与Y点的位置，这个位置是用来控制MC大小的。其&#8220;size_x&#8221;和&#8220;size_y&#8221;为设定这个MC具体大小的数值。 </font></p>
<p><font size=2>三、如何改变其位置： </font></p>
<p><font size=2>一个简单的方法是，我们可以来移动那个已给置入MOVIE文件的MC，就像我们用来改变一张图的位置那样用鼠标拖动它。 <br>另一个方法是利用setProperty来进行改变这个MC的位置。 <br>setProperty ("MC_Name", _x, "position_x"); <br>setProperty ("MC_Name", _y, "position_y"); </font></p>
<p><font size=2>&#8220;MC_Name&#8221;是MC的名字，&#8220;_x&#8221;和&#8220;_y&#8221;指的是X坐标和Y坐标点，而&#8220;position_x&#8221;与&#8220;position_y&#8221;是位置具体的数值。 </font></p>
<p><font size=2>希望各位能明白我这个简单的教程！以上代码均为FLASH5为标准。<br><br></p>
<p><font size=2>30.问： 如何优化Flash动画，使文件更小，播放更流畅？ <br>答： Flash作为Macromedia公司出品的网页制作与动画创作的专业软件，操作简便，功能强大，现已成为交互式矢量图形和Web动画事实上的标准。 <br>　　但是，如果制作的Flash电影文件较大，动辄几百k的话，常常会让网上浏览者在不断等待中失去耐心。对Flash电影进行优化就显得很有必要了，但前提是我们不能有损电影的播放质量。 <br>　　1．多使用符号（Symbol）。如果电影中的元素有使用一次以上者，则应考虑将其转换为符号。重复使用符号并不会使电影文件明显增大，因为电影文件只需储存一次符号的图形数据。 <br>　　2．尽量使用渐变动画。只要有可能，应尽量以&#8220;移动渐变&#8221;（Create Motion Tween）的方式产生动画效果，而少使用&#8220;逐帧渐变&#8221;（Frame－By－Frame）的方式产生动画。关键帧使用得越多，电影文件就会越大。 <br>　　3．多采用实线，少用虚线。限制特殊线条类型如短划线、虚线、波浪线等的数量。由于实线的线条构图最简单，因此使用实线将使文件更小。 <br>　　4．多用矢量图形，少用位图图像。矢量图可以任意缩放而不影响Flash的画质，位图图像一般只作为静态元素或背景图，Flash并不擅长处理位图图像的动作，应避免位图图像元素的动画。 <br>　　5．多用构图简单的矢量图形。矢量图形越复杂，CPU运算起来就越费力。可使用菜单命令Modify （修改）/Curves（曲线）/Optimize（优化），将矢量图形中不必要的线条删除，从而减小文件。 <br>　　6．导入的位图图像文件尽可能小一点，并以JPEG方式压缩。 <br>7．音效文件最好以MP3方式压缩。MP3是使声音最小化的格式，应尽量使用。 <br>　　8．限制字体和字体样式的数量。尽量不要使用太多不同的字体，使用的字体越多，电影文件就越大。尽可能使用Flash内定的字体。 <br>　　9．不要包含所有字体外形。如果包含文本域，则应考虑在Text Field Properties（文本域属性）对话框中选中Include Only Specified Font Outlines（只包括指定字体外形），而不要选择Include All Font Outlines （包括所有字体外形）。 <br>　　10．尽量不要将字体打散（菜单命令为Modify / Break Apart）。字体打散后就变成图形了，这样会使文件增大。 <br>　　11．尽量少使用过渡填充颜色。使用过渡填充颜色填充一个区域比使用纯色填充区域要多占50字节左右。 <br>　　12．尽量缩小动作区域。限制每个关键帧中发生变化的区域，一般应使动作发生在尽可能小的区域内。 <br>　　13．尽量避免在同一时间内安排多个对象同时产生动作。有动作的对象也不要与其它静态对象安排在同一图层里。应该将有动作的对象安排在各自专属的图层内，以便加速Flash动画的处理过程。 <br>　　14．用Load Movie命令减轻电影开始下载时的负担。若有必要，可以考虑将电影划分成多个子电影， 然后再通过主电影里的Load Movie、Unload Movie命令随时调用、卸载子电影。 <br>15．使用预先下载画面。如果有必要，可在电影一开始时加入预先下载画面（Preloader），以便后续电影画面能够平滑播放。较大的音效文件尤其需要预先下载。 <br>　　16．电影的长宽尺寸越小越好。尺寸越小，电影文件就越小。可通过菜单命令Modify（修改）/Movie（电影），调节电影的长宽尺寸。 <br>　　17．先制作小尺寸电影，然后再进行放大。为减小文件，可以考虑在Flash里将电影的尺寸设置小一些，然后导出迷你SWF电影。接着将菜单File（文件）/Publish Settings&#8230;（发布设置&#8230;）中HTML选项卡里的电影尺寸设置大一些，这样，在网页里就会呈现出尺寸较大的电影，而画质丝毫无损、依然优美。 <br>　　在进行上述修改时，不要忘记随时测试电影的播放质量、下载情况和查看电影文件的大小。 <br>[转载] </font></p>
<p><font size=2>31.问：为什么在用flash做&#8220;沿轨迹运动&#8221;时总是沿直线运动，和教程对照了一下，做法完全一样，怎么不行？ <br>答：这个问题似乎总会困扰初学者，但实际上问题很简单。首尾2帧中心位置没有放准在轨迹上。一个简单的检查办法：你把屏幕大小设定为4 00%或更大，察看图形中间出现的圆圈是否对准了运动轨迹。 </font></p>
<p><font size=2>32。问：为什么我在 FLASH 中做旋转为什么总是转不快。有什么办法可以转快一点呢？ <br>答：你把播放速度调快，比如38祯/秒，方法：主菜单-&gt;modify（修改）-&gt;movies（影片）,加大Frame rate（影格速度）的值便可 </font></p>
<p><font size=2>33。问：请问制作按钮时，&#8220;hit"是用来做什么的？什么时候需要用到？[/color]很多教程都没具体讲解"hit"的用法。[/color] <br>答：hit是指定按纽的激发区域。在HIT内设定的区域在播放时是不会显示出来的。如果没有指定HIT区域，一般FLASH会默认你的按纽区域作为激发区域。比如：用文字做按钮时，最好能定义一个矩形来做触发区，而不是系统默认的文字内容。 </font></p>
<p><font size=2>34。问：如何把flash放到FP2000、FP98中去？ <br>答：FP98和FP2000对FLASH的支持较差，不能直接在其中插入FLASH动画，解决办法是在SWF文件发布、原代码生成后，把HTML文件中的&lt; ; ;OBJECT&gt;部分拷过去便可。建议使用DREAMWEAVE来制做FLASH动画网页，会方便很多。 </font></p>
<p><font size=2>35。问：如何把一个fla文件输出成和swf一样的gif文件 <br>答：先在Publish settings（发布设置）-&gt;format（格式）-&gt;Gif image（gif 影像），并对其进行相应的设置之后，用Publish（发布）功能便可输出GIF文件。如果FLA文件中含有MC，那么GIF文件中将不会包含MC中的动画，而将只将M C的第一桢转化为GIF。 </font></p>
<p><font size=2>36。问：把做好的一个只有十几K的FLASH放入网页中后，预览网页时，为什么要等好长时间FLASH才能被显示。 <br>答：检查SWF文件的名字．路径是否正确，如果不正确系统会试图长时间等待。 </font></p>
<p><font size=2>37。问：如何设置FLASH的背景？ <br>答：设定背景颜色可以按Ctrl+M，选color项里的BACKGROUND（背景），如果想用一幅图形做背景只需在最下的一个层import（输入）一幅图像便可。 </font></p>
<p><font size=2>38。问：在FLASH中，怎样画一个圆圈，如何修改圆圈的颜色？ <br>答：画圆的时候把填充色（颜色设定的左上角选项）设为无就可以了！把边框的颜色设定为相应颜色便可。 </font></p>
<p><font size=2>39。问：怎样做到字列成环型并围绕圆心转动？ <br>答：你可以用CORELDRAW软件或者相关软件来做好了，再导入到FLASH中便可！ </font></p>
<p><font size=2>40。问：外部导入txt如何变字体的颜色？ <br>答：在设定文本框时，设定字体的颜色。&nbsp;<br><br></p>
<p><font size=2>41。问：才打开FLASH4时使用铅笔工具画圆时还可以，但再次新建一个时用铅笔工具画圆时（模式是平滑）画出来的却不是一个圆或者椭圆！这是怎么回事？ <br>答：按住Shift的同时画圆，你能画的更圆！<br><br></p>
<p><font size=2>42。问：我做出来的文字与图形总是很难对齐，请问如何对齐目标，并把它们放到你想要的位置。 <br>答：选中目标，然后从主菜单-&gt;windows（窗口）-&gt;inspector（查看窗）-&gt;object（对象）然后便可以调节它的高（h）、宽（w ）、起始位置（x,y）和是否中心对齐（use center）。 </font></p>
<p><font size=2>43。问：FLASH4的多个场景之间如何调整播放次序？ <br>答：主菜单-&gt;windows（窗口）-&gt;inspector（查看窗）-&gt;Scene（场景），可以对场景进行调整播放次序、改名、删除等操作。 </font></p>
<p><font size=2>44。问：请问在Linux下如何观看flash动画，有插件for Linux的么？ <br>答：http://www.openswf.org/有。 </font></p>
<p><font size=2>45。问：刚下载安装的Flash插件已落户在电脑的什麽地方? <br>答：在C:\WINDOWS\SYSTEM\Macromed\Flash里看看 </font></p>
<p><font size=2>46。问：如何将fla文件直接生成exe文件？ <br>答：带有标题栏的swf文件可以通过菜单直接生成exe，是在Flash Player打开swf文件，然后选择file（文件）-&gt;creat projector（建立项目）。如果加上了FS命令将文件全屏显示后标题栏没了，便可用CTRL+F热键来生成。生成的执行文件内置了播放器，将比S WF文件大二百多K。 </font></p>
<p><font size=2>47。问：请问如何把做好的flash转换成屏幕保护程序？ <br>答：用SWF browser 2.8或者screensaver。http://iching.topcool.net/有下载。 </font></p>
<p><font size=2>48。问：请问如何借用别人作品中的内容。是否可以将SWF文件完全解码成FLA文件。 <br>答：用SWF browser 2.8可以解开别人的SWF文件，将其中的图像．声音取出保存。到目前为止还没有任何一个软件可以将SWF文件完全反变换成FLA文件。 </font></p>
<p><font size=2>49。问：如何在FLASH中实现3D效果。 <br>答：在FLASH中不能其接生成3D的动画，需借助其它的软件才行。比如3D MAX，然后再安装上vecta3D或者Illustrate! 4.0（4.1）插件便可以直接输出swf格式的动画了。 </font></p>
<p><font size=2>50。问：FLASH的动画背景可以是透明的吗？如何设置？ <br>答：当然可以，在发布设定中的HTML栏中有一项是窗口模式，选透明的窗口一项就OK。若是在html中引用flash可在html文件中的前加上下面的语句: 。不过透明只能在IE中可以，在NC中便失效了。 </font></p>
<p><font size=2>51。问：有什么方法能把普通位图图片转换成矢量图片呢？ <br>答：用AdobeStreamline软件，http://iching.topcool.net/有软件下载并有一简单教程，或用FreeHand8转换亦可。 </font></p>
<p><font size=2>52。问：请问那种格式（后缀）为矢量图？请问用那个软件可以浏览这些矢量图？ <br>答：*.ai *.eps *.wmf *.cdr，其中前面三种可以在FLASH中直接引用。cdr格式需转换成前三种格式方可引用。如果你安装了CORLDRAW 便可以在资源管理器中直接预览CDR格式的图形。其他格式的还没有软件能够象ACDSee浏览普通图片一样大量浏览。 </font></p>
<p><font size=2>53。问：在SWF中，怎样去掉点击鼠标右键所出现的内容？ <br>答：在publish settings里面有show menu的勾选。但是对于网页上的flash它始终会出现flash字样。如果你把它做成exe文件的话，就什么也没有了。 </font></p>
<p><font size=2>54。问：如何让双击SWF文件时可以直接满屏播放？ <br>答：在最后一桢的ACTION里选FSCOMMOND一项，然后在右边选中fullscreen,true，便可！ </font></p>
<p><font size=2>55。问：如何制作音乐开关？ <br>思路：将音乐放入MC，用Tell Target来控制这个MC的播放和停止。 <br>相关文章或源文件： http://www.flashempire.com/tutorial/tutor/t3.html 作者：边城浪子 http://netschool.cpcw.com/homepage/tool/flas h4/advanced/advanced20.htm 作者：小东瓜 </font></p>
<p><font size=2>56。问：请问如何调节音量 <br>答：用纯粹的FLASH不能连续调节音量，只能分段调节。 <br>在http://netschool.cpcw.com/homepage/tool/flash4/advanced/advanced21.htm 有小东瓜写的教程。 </font></p>
<p><font size=2>57。问：如何在文件中加可控制的背景音乐 <br>答：天极网有教程。http://sh.cpcw.com/netschool/homepage/tool/flash4/index.htm 作者：starwind </font></p>
<p><font size=2>58。问：在网页中如何分帧来控制FLASH动画 <br>答：晨曦空间有教程。http://starwind.yeah.net/ 作者：newfish </font></p>
<p><font size=2>59。问：如何使声音无限循环？ <br>答：将声音的循环次数定义成足够大便可。 </font></p>
<p><font size=2>60。问：怎样才能截取音乐？ <br>答：闪光地带（http://zippy.yeah.net）里面有SoundF...媚诼嫉姆椒贾?/a&gt; ，效果非常好，如果音量变小了，用effect 里面的dynamic--graphic--expand可以扩大。另外CoolEdit、GoldWave 也是很不错的选择。 </font></p>
<p><font size=2>61。问：我想在一个CD 或 VCD 里面保存一个声音文件是怎么样保存的兀?我想我所保存的声音可以导出在FLASH 里面使用。请问Flash中如何加入.mp3? <br>答：用sthvcd，vcdcutter或其他东东剪下来就可以了。Flash中不能加入mp3，若为mp3格式，可通过winamp或其它软件转成wav，然后要编辑的话用s oundforge 4.5。 </font></p>
<p><font size=2>62。问：那里有Sound Forge 4.5的教程？ <br>答：http://yongong.topcool.net/ 音乐编辑那个栏目。<br><br></p>
<p><font size=2>63。问：请问如何把midi转换成wav? <br>答：MIDI转EAV的方法如下： <br>1。用WINGROOVE这个软波表直接转换，不过音色是WINGROOV自带的，没有得选择余地的！所以这是最简单最原始的方法，效果一般！这个软件在h ttp://www.cc.rim.or.jp/~hiroki/english有下载。 <br>2。用两个声卡，一个放一个录。放的那边用软波表，如YAMAHA100等或者声卡自带的硬波表，录音后还可以降噪！此方法还可以！但是如果结合下面的方法就更好了！ <br>3。用软音源软件，如REALITY或者GIGASAMPLER等代替波表，使用专门的音色库来转，这样只要一个声卡就解决问题了！此方法可以使用你认为最好的音色，音质也是几乎没得挑剔的，W AV的质量接近下面的 方法了！ <br>4。如果你钱很多的话，就用专门的音源和硬盘录音机吧！ </font></p>
<p><font size=2>64。问：如何才能将文字或图画做变形？ <br>答：Ctrl+B把动作的头和尾打散后即可！symbol是不能做shape的。 </font></p>
<p><font size=2>65。问：如何制作边缘模糊的MASK效果？ <br>答：在做好MASK效果后再在其上面加一层有模糊边缘的色块。 </font></p>
<p><font size=2>66。问：怎么做出象电视受干扰时的雪花啊？ <br>答：先画一些短的白线条（细一点，稍微有点灰度），然后做几个关键帧，每帧里随机的放一些，连续播放一下就有效果了。 </font></p>
<p><font size=2>67。问：请问如何将文字或图镂空？ <br>答：打散字或者图形，先用涂边框工具将它的边缘上色，然后再选中中间部分将之删除便可。 </font></p>
<p><font size=2>68。问：如何通过按钮给别人发E-mail. <br>答：get url:mailto:flash8@flash8.net </font></p>
<p><font size=2>69。问：如何用GET URL功能打开一个窗口 <br>答：在get url中输入javascript：op（'dongua.htm',550,400），get url支持简单的javascript语句，这种方法跟选择_blank不同。 </font></p>
<p><font size=2>70。问：在主页中，flash文件老是自己重复播放，不知怎样实现只播放一次 <br>答：在最后一桢的ACTION中加上STOP语句! </font></p>
<p><font size=2>71。问：关键帧中的脚本里stop后的脚本会不会起作用？ <br>答：stop语句只停止帧的播放，并不能停止该STOP所在关键帧的ACTION语句的执行。 </font></p>
<p><font size=2>72。问：我如可才能把&#8220;别人网页&#8221;中的SWF文件下载到自已的硬盘上呢？ <br>答：方法1、在FLASH动画上单机鼠标右键，选目标另存为&#8230;&#8230;OK！ <br>方法2、在你的浏览器缓冲目录里面有你看过FLASH的SWF文件！一般情况下系统的默认目录是： <br>windows-&gt;Temporary Internet Files，查找swf文件，其中保存的swf文件数量跟浏览器设定的缓存空间有关，然后将它COPY出来便可。 </font></p>
<p><font size=2>73。问：请问一串字或一幅图由模糊变清晰的效果怎样做？ <br>答：刚开始的时候将ALPHA（透明度）设小一些，最后位置的ALPHA=100%，关键祯之间用MOTION变化。注意，是SYMBOL才能MOTION，除了用a lpha外，最关键的还是要用相同内容不同的层来错开，做出模糊的效果！ </font></p>
<p><font size=2>74。问：打字的效果是怎么做的（就是字一个一个地出来）需要把每个字都转换成组件吗? <br>答： <br>方法1、为每一个字建立一个MC，然后在第一帧中引用第一个字，隔两至三祯，按F6，复制关键祯，再引用第二个字，再隔两，三祯，按F 6，引用第三个，以此类推。如果加上打字的音效，效果会更好。本方法适于字数较少的地方。 <br>方法2、如果你只是简单地让它们出现，可以在字上加一层，然后用底色做一个矩形，把字遮住。并将矩形设定为MC，给实体命一个名字（i nstance name），然后用Set Property语句编程实现矩形的跳着移动便可。这种办法适于字数较多的地方。</font></p>
<p><font size=2>75。问：如何计算sin、cos等函数？ <br>思路：利用有关的数学公式将函数转换 <br>相关文章或源文件： http://www.flashempire.com/tutorial/tutor/t12.html 作者：小魔女 http://dongua.163.net/flash4/fla/function.fla 东瓜茶轩 </font></p>
<p><font size=2>76。问：要得到a值除以b值所得到的余数,其表达式该怎么写? <br>答：a-b*int(a/b)便可！ </font></p>
<p><font size=2>77。问：如何在FLASH中重复播放部分影格N次然后再跳转? <br>答：Set Variable: "i" = 1 <br>Set Variable: "time" = 5 <br>comment:time表示重复次数。 <br>comment:以下是想重复的内容帧名为repeat <br>&#8230;&#8230;&#8230;&#8230; <br>If （i&lt;=time） <br>Set Variable: "i" = i+1 <br>Go to and Play （repeat） <br>End If <br>便可。 </font></p>
<p><font size=2>78。问：如何制作鼠标跟随动画？ <br>答：思路：利用Start Drag语句让一个MC随鼠标运动，再利用该MC的x、y坐标等属性产生相应的变化 <br>相关文章或源文件： http://www.flashempire.com/tutorial/tutor/t5.html 作者：边城浪子 http://www.flashempire.com/tutorial/tutor/t9.html 作者：Jimbob http://202.106.124.57/~eastecho/fbbs/Forum7/HTML/00002 9.html </font></p>
<p><font size=2>79。问：如何使用FScommand制作时钟？ <br>答：在天极网有相关教程 http://netschool.cpcw.com/homepage/tool/flas h4/advanced/advanced18.htm 作者：newfish </font></p>
<p><font size=2>80。问：如何进行碰撞检测？ <br>答：思路：1、用get property检测运动MC的位置； <br>2、对于一些和鼠标跟随有关的碰撞检测，可以用_droptarget <br>相关文章或源文件： http://www.flashempire.com/tutorial/tutor/t19.html 作者：FlashGun http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/00021 5.html <br><br></p>
<p><font size=2>81。问：返回值中或者需load进入动画的文本文件中如何表示空格和其他特殊字符？ <br>答：用"+"代替空格 &#8220;name= 小东瓜&#8221;写为：&#8220;name=+小东瓜&#8221; <br>在异景空间（http://iching.topcool.net/）有相对应特殊字符的转换表。 </font></p>
<p><font size=2>82。问：如何调用一个.exe的可执行文件，比如：我用vc编好的可执行文件。 <br>答：用fscommand("exec","执行文件名")便可。需注意此时执行文件的路径是否正确。 </font></p>
<p><font size=2>83。问：如何禁止菜单、Zoom In(Out)功能，如何完成双击SWF文件时直接全屏 <br>答：在第一桢中输入下面命令： <br>全屏－＞FS Command ("fullscreen", true) <br>禁止缩放－＞FS Command ("allowscale", False) <br>禁止菜单－＞FS Command ("showmenu", False) </font></p>
<p><font size=2>84。问：怎样在音乐完成后执行一个动作？ <br>答：http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/000382.html </font></p>
<p><font size=2>85。问：如何载入外部动画（*.swf），如何控制载入动画的位置？ <br>答：相关文章或源文件： http://202.106.124.57/~eastecho/fbbs/Forum7/HTML/00000 9.html http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/00057 2.html http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/00015 9.html </font></p>
<p><font size=2>86。问：如何在网页中判断是否已安装插件？ <br>答：http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/000753.html有详说明。 </font></p>
<p><font size=2>87。问：flash4是怎么样制作聊天室？ <br>答：需要cgi的支持。比如：asp、perl、php等。国内专门介绍CGI与FLASH联合编程的站点较少，你可以去国外的一些站点看看。 </font></p>
<p><font size=2>88。问：如何制作留言板？ <br>答：分成上、下两篇。用Asp+Flash实现。 http://www.flashempire.com/tutorial/tutor/t15.html 作者：边城浪子 http://www.flashempire.com/tutorial/tutor/t16.html 作者：边城浪子 </font></p>
<p><font size=2>89。问：如何做计数器？ <br>答：主要是用cgi程序（asp,perl,php等)将数值写入文本文件中，然后利用FLASH的读文本文件的功能将数字读出来并显示。 </font></p>
<p><font size=2>90。问：如何制做烟花效果？ <br>答：http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/000590.html 作者：boat </font></p>
<p><font size=2>91。问：如何动态改变颜色？ <br>答：思路如下： <br>1、做好不同颜色的帧或MC调用； <br>2、使用RGB或者CMYK或者其他的色彩模式来进行改变，利用一个具有不同TINT属性的符号并且动态改变ALPHA属性进行叠加。 <br>相关文章或源文件如下： http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/00014 2.html http://203.39.170.10/http/movies/zips/colour.zip 作者：Richard James Rose http://203.39.170.10/http/movies/zips/cmyk.zip 作者：Martyn van Beek </font></p>
<p><font size=2>92。问：如何制作Loading？ <br>答：使用_framesloaded、_totalframes两个变量可以完成 <br>相关文章或源文件： http://www.flashempire.com/tutorial/tutor/t4.html 作者：边城浪子 http://www.flashempire.com/tutorial/tutor/t10.html 作者：小东瓜 </font></p>
<p><font size=2>93。问：如何判断载入外部swf的进度？ <br>答：可以使用被载入swf的_framesloaded、_totalframes两个变量，加上被载入动画的名字。 <br>相关文章或源文件： http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/00051 6.html </font></p>
<p><font size=2>94。问：如何把FLASH中的输入的文本存到另一个文本文件！ <br>答：FLASH自己不行！需要与其他软件联合编程来完成。比如：ASP，PERL。 </font></p>
<p><font size=2>95。问：经常听到别人说到路径，到底FLASH中的路径起到一个什么作用？ <br>答：如果你用过DOS，您就可以很容易理解FLASH的路径。简单地说，路径就是在FLASH编程时能够找到变量或者符号（symbol）所经过的路。其方式跟D OS一样，分成相对的和绝对的两种。 <br>可以看一看下面两个地址中介绍的内容： http://202.106.124.57/~eastecho/fbbs/Forum7/HTML/00000 9.html http://202.106.124.57/~eastecho/fbbs/Forum2/HTML/00052 5.html </font></p>
<p><font size=2>96。问：flash编程用什么工具软件较好 <br>答：用ActionClip1.4，你先在任何一个文本编辑软件中写完程序之后，将程序部分COPY至剪贴板，然后运行ActionClip将之转化，然后到f lash中将之PASTE便可。这个工具很小巧，在闪光地带（http:/zippy.yeah.net）有一个更好一点的工具Flash ActionScript Tool Beta2 注册版下载，支持所有的FLASHW命令,可生成一些简单的程序。<br><br></p>
<p><font size=2>97。问：将.fla文件转成.avi文件文件的方法 <br>答：可以转成mov格式，没办法直接转成avi，可以通过转成gif序列，再经过其它软件转成avi（比如premiere） </font></p>
<p><font size=2>98。问： 如何在本机上测试LOADING？ <br>答： 在播放(Test Movie)时，再次按Ctrl+Enter，或者是选择菜单View&gt;Show Streaming <br>还可以打开Bandwidth Profiler </font></p>
<p><font size=2>99。问： Flash5中，怎样才能消除导入图像的锯齿？ <br>答： 请用BMP图象或矢量图。由于点阵问题，所以你在导入图象之前先看看这个图的像素有多大，然后将它转为BMP格式后，再到FLASH中用"modify--&gt;trace bitmap"命令优化图象！<br><br></p>
<p><font size=2>100。问： 请问如何在每次刷新页面时随即显示几个不同的 SWF 中的某一个动画？ <br>答： LoadmovieNum("movie"+random(5)+".swf") <br>假设有6个swf，分别命名为 <br>movie0.swf,movie1.swf，&#8230;&#8230;movie5.swf <br>像上边那样，每刷新一次，出现的界面就可能不一样。 </font></p>
<p><font size=2>101。问： 如何屏蔽按钮BUTTON的手型，我只要箭头！ <br>答： 可以使用mouse.hide();，然后再用startDrag命令让一个箭头形的MC被拖动就可以了。 </font></p>
<p><font size=2>102. 问：如何让一个MC调用另一个MC里设置的一个变量? </font></p>
<p><font size=2>在mc里输入此语句：（a b 均为变量名，mcname为mc的实体名） </font></p>
<p><font size=2>a = _root.mcname.b； </font></p>
<p><font size=2>此语句是使本mc的变量a调用_root.mcname这个mc里的变量b </font></p>
<p><font size=2>103.问： 在Flash中如何打开Word文档？ </font></p>
<p><font size=2>Flash不支持调用Word文件，但浏览器可以直接打开.doc文档，那么就用getURL来解决即可，路径用绝对地址http://www..../word.doc 。 </font></p>
<p><font size=2>104. 问：在Flash中如何调用mpeg文件？ </font></p>
<p><font size=2>Flash中不支持调用mpeg文件，首先要安装一个三方软件，名字为Swiffcanvas1.0；接着打开fla文件，如果mpeg文件的目录为aa，mpeg文件名字为bb，那么就可以就添加下面的语句： </font></p>
<p><font size=2>FS Command ("exec"， "SwiffEXEC(LOCAL:aaa\111.mpeg) ")； </font></p>
<p><font size=2>然后把fla文件输出为exe文件 ，并用Swiffcanvas打开这个exe文件，然后在Swiffcanvas里设置完成自己的要求。最后再输出为.exe文件，就可以了。 </font></p>
<p><font size=2>105。问： 在ActionScript的编辑窗口中怎么输入中文？ </font></p>
<p><font size=2>可以更换Flash的字体，也就是删除Windows\Fonts\Modern.fon，这样，编辑窗口的字体就好看多了。 </font></p>
<p><font size=2>105.问： Flash如何与数据库连接？ </font></p>
<p><font size=2>答：只能通过后台文件，如CGI脚本，Active Server Pages (ASP)，或 Personal Home Page (PHP)等。传递值到flash中，实现数据库的操作。 </font></p>
<p><font size=2>106. 问：在用FsCommand中可以调用javascript吗？ </font></p>
<p><font size=2>答：FsCommand可以调用JS函数MovieName_DofsCommand装入Flash动画。MovieName是Flash动画的名字由Embed标签的Name属性或是Object标签的ID属性指定，如果FlashPlayer的名字为MYMOVIE，应该调用JS函数名字为MYMOVIE_DOFSCOMMAND。 </font></p>
<p><font size=2>107。问：如何学习Flash（阿文） <br>http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=14205&amp;h=1&amp;bpg=1&amp;age=-1 </font></p>
<p><font size=2>108。问：如何实现FLASH背景颜色的随机变换 （erik168） <br>http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=16519&amp;h=1&amp;bpg=1&amp;age=-1 </font></p>
<p><font size=2>109：问：Flash 5.0 Actions 一览！ （djsgh） <br>答：http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=7607&amp;h=1&amp;bpg=1&amp;age=-1 </font></p>
<p><font size=2>110。问：如何制作动作连贯的小黑人（拾荒） <br>答：http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=35539&amp;h=1&amp;bpg=1&amp;age=-1 </font></p>
<p><font size=2>111。问：初学者如何人打好ACTION基础（小晶） <br>答：http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=15164&amp;h=1&amp;bpg=1&amp;age=-1 </font></p>
<p><font size=2>112。问：如何实现画中画效果（木桫椤） <br>答：http://bbs.flash8.net:8000/cgi-bin/topic_show.cgi?id=7552&amp;h=1&amp;bpg=1&amp;age=-1 </font></p>
<p><font size=2>113。问：FLASH如何与后台连接？[源码] <br>答：使用LoadVars()对象的sendAndLoad()方法来发送和接收数据 </font></p>
<p><font size=2>114。问：如何实现声音的暂停/播放效果？ <br>答：在执行stop()命令时可以用sound对象的position属性取得当前声音文件的播放时间（毫秒），然后用start(time,loop)在当前位置播放即可。 </font></p>
<p><font size=2>115。问：如何定义二维数组？ <br>答：下面定义一个20*20的二维数组，值全部为0 <br>sarray = []; <br>for (var i = 0; i&lt;=19; i++) { <br>sarray[ i] = []; <br>for (var j = 0; j&lt;=19; j++) { <br>sarray[ i][j] = 0; <br>} <br>} </font></p>
<p><font size=2>116。问：如何打开指定属性的窗口？[源码][/color] </font></p>
<p><font size=2>答：先JS在HTML页面中定义函数，然后在FLASH中用getURL()调用 <br>（turbine） </font></p>
<p><font size=2>117。问：如何通过MC中的按钮跳转场景？ <br>答：在要跳转的桢上加标签，通过标签跳转：gotoAndStop("yourlable") <br>（turbine） <br>118。问：如何随机设置MC颜色？ <br>答：MC实例名为"mc" <br>mycolor=new Color("mc") <br>mycolor.setRGB(random(0xffffff)) <br>（turbine） <br>119。问：如何实现双击效果？ <br>答：把下面的代码放到按钮上： <br>on (press) { <br>time = getTimer()-down_time; <br>if (time&lt;300) { <br>trace("ok"); <br>} <br>down_time = getTimer(); <br>} <br>（turbine） <br>120。问：如何使MC始终跟随鼠标旋转？[源码][/color] <br>答：先计算MC横纵坐标与鼠标横纵坐标的差值，然后用Math.atan2()来计算旋转角度。 <br>m_x = _root._xmouse-mc._x; <br>m_y = _root._ymouse-mc._y; <br>mc._rotation = PI=180/Math.PI*Math.atan2(m_y, m_x); <br>（turbine）</font></p>
</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font>
<img src ="http://www.cppblog.com/twzheng/aggbug/28895.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-07-28 14:24 <a href="http://www.cppblog.com/twzheng/articles/28895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] ASP.NET中实现Flash与.NET的紧密集成</title><link>http://www.cppblog.com/twzheng/articles/28888.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sat, 28 Jul 2007 03:10:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/28888.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/28888.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/28888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/28888.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/28888.html</trackback:ping><description><![CDATA[[转] <strong style="FONT-SIZE: 18pt">ASP.NET中实现Flash与.NET的紧密集成</strong><br><br>　 <strong>一、 简介 </strong><br><br>　　Macromedia公司的Flash如今被广泛应用于互联网上以实现增强Web网站的内容描述。Macromedia最近发行的Flash(Flash 6和Flash MX)版本已经明确表示，Macromedia正在十分认真地考虑把Flash作为Web应用程序开发的接口选择。对于一个接口来说，Flash可能是一伟大的选择；然而，这个选择不是用它来替换商业逻辑，查询管理和安全。对于一个Web开发者来说，要实现真正强壮的性能和企业级能力，你需要.NET，Flash以及丰富的描述层支持，并联合微软的.NET技术。 <br><br>　　Flash包括ActionScript-一种脚本语言，用来对动画添加交互性。从Flash 5中开始引入ActionScript脚本以来，Macromedia不断地改进它，从一个简单的脚本语言到相当牢固但仍存在许多局限性的编程特性。在Flash MX 2004中，Macromedia引入了ActionScript 2.0-它支持新的功能和新的方法来构建代码。为了更易于理解本文，你应该先阅读一些有关用ActionScript来构建Flash站点的基本知识。 <br><br>　　Macromedia已经介绍了方法来实现容易地集成外部的数据到Flash应用程序中以允许更复杂和强壮的数据驱动应用程序。Flash和.NET都把它们自己推荐为跨平台的解决方案并且，由此而成为自然的搭挡。仍然，联接这两项技术不是简单的任务。这篇文章将同你一起讨论把Flash和.NET应用程序集成到一起的几种方法。 <br><br>　　 <strong>二、 集成Flash和ASP.NET </strong><br><br>　　把Flash动画嵌入到ASP.NET页面 <br><br>　　Macromedia Flash动画通过联合使用OBJECT和EMBED标签放置在.aspx页面中。EMBED标签最初是Netscape公司为了实现与Netscape 2.0或更高级的版本一起工作而开发的。以后，这个标签被微软的Internet Explorer(MSIE)所采用。为了实现浏览器兼容性，可以共同使用MSIE特定的OBJECT标签和EMBED标签。下面的HTML代码展示了用OBJECT标签和EMBED标签来嵌入一个Flash动画(*.swf文件)的情形:
<p><img alt="" src="http://cimg.163.com/catchpic/E/EB/EB1E1C0776BB8902D1056DC4E322E492.gif"></p>
<p>　　 <strong>三、 把Flash连接到外部的数据 </strong><br><br>　　有三种方法可以把Flash动画与外部数据集成到一起：FlashVars，LoadVars以及新的FlashRemoting技术。其中最简单的一种方法是，通过使用FlashVars来传递代码的HTML部分中的变量，实现把外部数据从一个.aspx页面传递到一个嵌入在Web页面中的一个Flash动画。使用FlashVars设置的这些变量值可以在Flash动画的根层次上进行存取。为能在所有的浏览器环境下运行，该FlashVars属性必须在OBJECT和EMBED标签中进行赋值。 <br><br>　　下面是和一个对象标签一起的FlashVars: <br><br><font face=新宋体><code>＜PARAM Name="FlashVars" Value="init=yes&amp;check=true"＞ </code><br></font>　　下面是和EMBED标签一起使用的FlashVars: <br><br><font face=新宋体><code>＜EMBED src="test.swf" FlashVars="init=yes&amp;check=true"＞＜/EMBED＞ </code><br></font>　　要了解更多的有关FlashVars的信息，请参考来自Macromedia的文章http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_16417。</p>
<p>&nbsp;</p>
<p>　　 <strong>四、 为什么使用FlashVars </strong><br><br>　　不借用FlashVars，也可以把变量放在HTML标签中-通过一个查询串形式把它添加到.SWF文件的URL后面，进而传递到一个Flash动画。这个方法可能存在一个问题-如果这个变量在.SWF文件加载时就需要的话，因为一个.SWF文件应该在从服务器发出请求数据之前就被下载和运行。变量值也可能是通过"Load Variables"方法和JavaScript在Flash中设置的。每一个这些方法都有惰散慢响应的缺点；这就是为什么开发者应该使用FlashVars来把数据从ASP.NET传递到Flash动画的原因。下图显示出以一个查询串方式传递变量的代码：</p>
<p><img alt="" src="http://cimg.163.com/catchpic/E/E1/E1C9E2427F9B45F24DEC85CFAC303EDD.gif"></p>
<p>　　任何使用FlashVars传递的变量都能被在Flash动画的根层次(_level0)上进行存取。为了检索一个Flash动画内部的这些值，可以创建一个动态变量。下面ActionScript代码实现在Flash中为"initvalue"赋值： <br><br><font face=新宋体><code>_level0.initvalue = init; </code><br></font>　　 <strong>五、 Flash与数据库的通讯 </strong><br><br>　　一个Flash动画不能直接存取一个数据库。然而，Flash能够经由任何象ASP或ASP.NET等的服务器端技术与数据库进行通讯。有完成这项任务的若干方法。在本文中，我们将解释LoadVariables方法和sendAndLoad方法。 <br><br>　　(一) 在动画片断中使用loadVariables方法 <br><br>　　动画片断的loadVariables方法读来自一外部的文件或URL的数据并且为该动画片断的变量设置值。一旦该动画片断被实例化，在片断事件事件处理器中的动画片断的装载行动被初始化。在动画片断被初始化时，loadVariables方法可以被调用来加载变量。loadVariables方法是异步的调用并且Flash不会等待该调用的结果。当在一个loadVariables()行为中收到数据时，在片断事件事件处理器中的动画片断的数据行为被初始化。 <br><br>　　为了展示这个方法的用法，这个示例根据从Flash动画中选择的ID从一个数据库检索用户的姓名和年龄。在下面的图中，动画的loadVariables方法被使用来装载数据到来自一个.aspx页面getUserData.aspx的动画片断。这里，ActionScript传递用户的id-他的名字和年龄将以一个到.aspx页面查询串的形式显示于Flash动画中。</p>
<p><img alt="" src="http://cimg.163.com/catchpic/6/69/6979E1B6307DCE41A35681AB0B5DF2F4.gif"></p>
<p>这个getUserData.aspx页面从显示于下面的查询串中检索id值：</p>
<p><img alt="" src="http://cimg.163.com/catchpic/D/D4/D411ED69F3565EAC735A409FD32EEB04.gif"></p>
<p>现在，ASP.NET能把这个值的id传递到.NET商业组件中。这个示例检索用户的姓名和年龄: <br><br><img alt="" src="http://cimg.163.com/catchpic/D/D6/D60EF41BEBB5DCC337CD2CDFAA91431D.gif"></p>
<p>　　正如在本节中前面所提及的，动画片断的onClipEvent事件处理器的数据行为被初始化，当数据被在一个loadVariables()行为中收到时。在Flash动画中声明下列动态的变量:flashName和flashAge。下列图显示出ActionScript代码-它被用于Flash动画的onClipEvent处理器中以检索从.aspx页面传回的值。 <br><br>　　注意:它是很重要的-与从.aspx页面中设置的变量是相同的。在此展示的示例中，在Flash动画中所存取的变量为"name"-它从.aspx页面中设置的变量是相同的(Response.Write("name="&amp;User.name))。 <br><br><img alt="" src="http://cimg.163.com/catchpic/8/8B/8BE8953A33439B427465B093400D5E0B.gif"></p>
<p>　　这些值现在可以被使用于Flash动画内部。 <br><br>　　(二) 从动画片断中使用sendAndLoad方法 <br><br>　　在今天的互联网上，XML作为一种具有甚至能允许不同类型的应用程序之间顺利交换数据潜力的通用传输格式，以一个文档系统的形式占有重要地位。XML为应用程序之间的通讯-甚至在大范围的不同系统上的应用程序-提供一道网关机制。只要应用程序能够共享数据(通过HTTP，文件共享或另外的机制)，并且有一个XML分析器，它们就能共享十分易于处理的结构化信息。 <br><br>　　Flash MX支持XML数据传输并且有若干种象ASP和ASP.NET的服务器技术方法来实现交换XML。Flash MX能够通过使用XML类-load，send和sendAndLoad或Flash MX的新的XMLConnector来发送和接收XML数据包。其中，最后一个可以被用于通过HTTP发送和接收包并且把它们绑定到Flash层的UI部件上。 <br><br>　　下面我们讨论一下FlashXML对象的sendAndLoad方法，这是在实现面向架构的XML数据通讯，异常处理及性能方面比较受欢迎的方法。我们使用这个简单示例：从一个Flash客户端把一用户的得分的详细资料插入到数据库并且回送一条成功或失败的消息给该Flash客户端。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　(三) 在Flash中创建一个XML包 <br><br>　　一个XML数据包能容易被创建在Flash中，如下所示： <br><br><font face=新宋体><code>var sendXML:XML = new XML("＜userid＞123456＜/userid＞"); </code><br></font>　　发送一个XML包到一个服务器端页面-它使用ASP/ASP.NET并且处理返回XML数据包。 <br><br>　　用法如下: <br><br>xmlObject.sendAndLoad (URL: String, targetXMLObject: XML): Void <br>　　这个'xmlObject'是XML对象实例-它封装必须被发送到.aspx页面的XML；这个'URL'是指定XML对象的目的URL；'targetXMLObject'是该XML对象-它将接收从服务器端返回的信息。 <br><br>　　sendAndLoad方法把一个XML包发送到一个服务器端模板并且收到一个XML包作为响应-这不同于XML类的send方法-它仅发送一个XML包而并不期盼任何类型的响应。这其中每个方法以其自身方式发挥作用，但是有一重要的区别：XML类的send方法以一个目标作为参数-它允许你打开一新的浏览器窗口或替换当前浏览器窗口中的内容，而sendAndLoad方法以一个XML包作为参数-它不会启动一个新的浏览器窗口。因为send方法打开一新的浏览器窗口，我们可以看到浏览器窗口本身的输出-这可能对调试极为有用。 <br><br>　　注意:如果发出sendAndLoad调用的Flash文件在一个Web浏览器中运行，那么目标URL将与Flash动画处理同一个域中。如果你还需要与处于不同域中的应用程序进行通讯，那么可以参考www.macromedia.com站上的"Cross Domain Data Loading"以了解更多的信息。 <br><br>　　下列图形中的代码显示出一个XML对象的sendAndLoad方法是怎样被用于与一个.aspx页面通讯以及是如何处理从服务器返回的XML的：</p>
<p><img alt="" src="http://cimg.163.com/catchpic/F/F8/F842398A3F27BAE6F0E9621437D8D9C0.png"></p>
<p>　　上面的代码做下列事情: <br><br>　　&#183;装载XML字符串到一个XML对象"userscore_xml"。该实例拥有XML-它被发送到远程服务器端ASP.NET页面。 <br><br>　　&#183;设置XML对象"ResponseXMLObj_xml"的ignoreWhite属性。这个XML对象实例持有来自服务器的XML包。 <br><br>　　&#183;调用XML对象的("userscore_xml")sendAndLoad方法以发送XML到服务器端.aspx页面，http://localhost/MyTestApp/scoring.aspx并存储返回的XML包到XML对象实例"ResponseXMLObj_xml"中。 <br><br>　　&#183;设置XML对象"ResponseXMLObj_xml"的onLoad方法。Flash收到来自服务器端.aspx页面的返回的XML响应-它在XML对象的onLoad方法中被处理。 <br><br>　　&#183;然后，它分析收到的XML包以在Flash客户端显示必要的消息。 <br><br>　　(四) 接收从ASPX页面的Flash中发送的XML包 <br><br>　　下列图形显示出完成这项任务的代码：</p>
<p><img alt="" src="http://cimg.163.com/catchpic/A/AB/AB66A699B40CBCC844303966B489F060.png"></p>
<p>　　上面的代码完成下列事情: <br><br>　　&#183;收到从Flash客户端发送的XML(xmlDoc.Load(Request.InputStream))。 <br><br>　　&#183;分析收到的XML并把它传递给商业组件以插入到数据库中。 <br><br>　　&#183;形成XML消息被传送回Flash客户端。在商业层引发的成功或异常条件被相应地处理并转换成各种XML消息-这个消息被传送回Flash客户端。该Flash客户端收到这些XML消息并相应地显示它们。 <br><br>　　 <strong>六、 结论 </strong><br><br>　　Flash和.NET技术今天在市场上正逐渐流行开来并将很可能会在不断增加的应用程序架构中一起成为成功的合作伙伴。这两种技术处理一些同样的问题，但是实质上不同的。Flash MX使得Web站点经历交互性，而.NET帮助建造企业应用软件。正如在这篇文章中所探索的，集成Flash和.NET应用软件是完全有可能的。每一步都是在做出决定-如何连接这两部分并在战略上进行正确的架构策划。 <br><br>　　尽管围绕FlashRemoting的新一代架构正在此领域不断获取动力，然而本文所讨论的方法还将在几年之后才能应用于大型领域。</p>
<img src ="http://www.cppblog.com/twzheng/aggbug/28888.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-07-28 11:10 <a href="http://www.cppblog.com/twzheng/articles/28888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]flashremoting实践（一）-配置篇</title><link>http://www.cppblog.com/twzheng/articles/28886.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sat, 28 Jul 2007 02:22:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/28886.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/28886.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/28886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/28886.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/28886.html</trackback:ping><description><![CDATA[<span class=c><font color=#ff3333>
<p align=center>flashremoting实践（一）-配置篇&nbsp;</font><br></span>&nbsp; </p>
<p>把自己在学习flashremoting中的一些感受和经验教训和大家一起分享，同时由于本人是初学flashremoting，所以如果有错误的地方，还请各位大侠指正。<br><br>这篇是关于flashremoting的配置方面的，在这里特别感谢icastone大侠。 <br><br><strong>一.net环境下配置flashremoting</strong><br><br>1.下载所需要的软件包括flashremotingMX2004(以下简称remoting)组件，支持as2.0的，以前的remoting是不支持中文flash的，但是现在已经提供支持中文flash了，请到官方网站下载最新的版本，然后，需要下载，flashremoting for .net，同时你还需要有iis5.0以上版本，和.net framework1.1，如果没有请到相关网站去下载好了，.net环境下所需要东东已经齐全了。 <br><br>注意.net framework最好是完全版的，不要下载分发包。 <br><br>2.首先安装好.net的环境，先安装iis，然后安装.net framework的sdk，这些装好后，开始安装flashremoting for .net(默认情况下，会安装在iis虚拟目录下(c:\Inetpub\wwwroot\flashremoting)，然后请安装remoting组件(注意：一定要在flash刚安装完毕之后安装remoting组件，如果不是，请先卸载flash和相关文件夹，然后重新安装)。 <br><br>3.安装好之后，先看一下c:\Inetpub\wwwroot\flashremoting的内容，这里有几个是比较重要的，其中包括gateway.aspx，web.config和bin目录下的flashgateway.dll，和frconfig.txt这几个文件，下一篇讲具体的用法。之后打开flash，可以在组件面板处的data components里看到remotingconnector组件，在窗口/其他面板/公用库 里看到remoting，这是所需要的如果没有，那么要确定，你的remoting组件是不是支持中文flash的，并且是不是在flash安装之后就安装了remoting组件。 <br><br>4.测试samples下的文件，先测试前两个文件(也就是ado和asp的那两个例子，这里有ado和ado_vb之分，ado是用c#写的，ado_vb是用vb.net写的，但内容是一样的)，在这里有许多人都说在测试的时候总是停留在load页面，这里的解决办法是首先打开计算机管理页面，右键我的电脑，选择管理/服务和应用程序/internet信息服务(IIS)管理器/网站/默认网站(默认的虚拟目录是c:\Inetpub\wwwroot，如果不是请重新指定到这个目录)，右键选择flashremoting选择属性，复选目录浏览，单击创建(E)，执行权限里选择"纯脚本"，点击确定，之后你会看到你的flashremoting目录已经变了，进入flashremoting/samples/ado，右键单击default.htm，选择浏览，测试会成功。 <br><br>5.关于第三个例子webservice，我也没测试成功，原因我的.net framework可能是分发包，如果你确定你下载的是完全版的话，如果测试不成功，我把我在网上找的相关解决办法告诉大家，首先给flashremoting目录下的bin目录写入的权限(右键单击bin目录选择权限，添加一个asp.net帐户，然后给他写入的权限)，如果不行的话，把wsdl.exe拷贝到bin目录下，给予asp.net写入权限之后重新启动iis，这是我找到的几种解决方法，由于我是拨号上网，我没有办法下载.net framework的完全版，所以这个我没有测试，祝你成功！！！ <br><br><strong>二.java环境下配置flashremoting</strong><br><br>1.你能够使用remoting从一个flash应用程序里的actionscript去呼叫在java应用程序服务器上运行的java对象公共方法，remoting支持以下java对象类型 <br>JavaBeans <br>Java classes <br>Enterprise JavaBeans(ejb) <br>jsp <br>Java Management Extensions(JMX)MBeans;这个只能利用在jrun4里 <br>server-side ActionScript(SSAS)(这些是翻译的help) <br>remoting明确的支持JRUN 4.0,IBM WebSphere Spplication Server 4,BEA WebLogic,Sun ONE Web Server,remoting也会正确的运行在其他的J2EE应用程序服务器上，包括Caucho Resin, Tomcat, JBoss, ATG Dynamo, Oracle 9i AS, and HP Application Server(这个是翻译的flash rmoting:the definitive guide，呵呵) <br><br>2.这里由于我只是初学java所以我只能找简单的，就是jrun服务器(嘿嘿，因为jrun安装之后就已经集成了remoting，稍后我会把相关配置java其他服务器的资料翻译出来)因为我手头没有其他的服务器，所以如果你用的不是jrun服务器，那么你要查相关服务器的配置方法 <br><br>3.在jrun服务器里建立一个你自己的服务，在开始/所有程序，macromedia jrun4里选择jrun管理控制台，之后需要你添入用户名和密码，这个是在你安装jrun时你输入的，进入页面之后你会看到jrun已经为你建了3个服务器，分别是admin，default，samples，他们分别在不同的端口上运行，如果你想运行admin上的程序，那么你就要输入 http://localhost:8000新建一个服务器选择左上角的create new server,在jrun server name里输入名字，例如flashremoting，然后点击一下jrun server directory它会自动为你配置程序的目录然后选择create server之后会显示一些新的服务器的端口号等信息，如果你不想更改的话，可以点finish就可以了，之后找到你的jrun安装目录在servers目录里你会看到你新创建的flashremoting文件夹。</p>
<img src ="http://www.cppblog.com/twzheng/aggbug/28886.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-07-28 10:22 <a href="http://www.cppblog.com/twzheng/articles/28886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>