如何在Flex 2中使用 ActionScript 2 SWF

如何在Flex 2中使用 ActionScript 2 SWF
作者:surpass 2006-10-11 15:39:43
标签:

英文原文:《Using ActionScript 2 SWFs with Flex 2 》
原文地址:http://weblogs.macromedia.com/pent/archives/2006/07/using_actionscr.cfm

译文作者:Dreamer 。其他版权声明请参考置顶日志。

如何在Flex 2中使用 ActionScript 2 SWF


Flash Player 技术的好处之一就是你可以用最适合你的方式来写应用程序。例如,你可以使用Flash 8 开发有很高冲击力的动画效果或者使用Flex创建引人注目的商业应用程序。

更加好的是可以把这二者结合在一起使用。在Flash中创建动画并整合到Flex程序中并不是很不平常。因为Flex和Flash都是通过ActionScript驱动的语言,Flex应用程序可以控制Flash动画,反之亦然。

使用Flash 8,Flash MX 2004 或者Flash MX 和Flex1.5做到这些相对来说很容易,但是如果使用Flex 2 和Flash Player 9就不是这样了。我将会说明如何去做并且我希望你能意识到事实上,这是实现二者结合得一个比较好的方法。

如你可能知道得那样,Flex 2 SWF 文件需要Flash Player 9。那是因为Flex 2使用ActionScript的3.0版本并且开发Flash Player 9(我曾说过,从底层的开发)是为了是用ActionScript 3。通过更健壮的数据定义和面向对象结构,ActionScript 3向更高级的Flash Player表现提供了一个更好的平台。

然而像所有版本的Flash Player一样,Flash Player 9 也是向后兼容的。这就是说,它可以运行那些针对旧版本的Flash Player创建的SWF文件。但是这次情况与以往不同。当Flash Player 9加载用ActionScript 2(或更早的版本)编写的SWF时,它会创建一个虚拟机——一个同逻辑一起被加载用来运行ActionScript 2 SWF的独立区域。我们叫它 AVM。当Flash Player 9 已经加载了一个Flex 2 SWF接着又接收到一个加载AS2 SWF的请求时,这个AS 2 SWF被加载到它自己的AVM中。所以这两个SWF运行在Flash Player中的不同的区域中。不同并且相互孤立的区域。

这就是说你的Flex 2程序不能确定AS 2 SWF的位置、到达它的内部并且引用它的函数,变量和时间线。同样地,AS2 SWF也不能只靠简单的引用来从Flex 2应用程序中获得任何东西。

解决办法是使用 LocalConnection——Flash Player和Flash Player直接的通讯系统。如果你以前没有使用过 LocalConnection,花一点时间研读它。你可能因此为你的下一个项目获得灵感。

要观看这个例子的演示,点击这个链接:Flex 2 and Flash Demo并确认你的浏览器安装了Flash Player 9。它会在一个新窗口中打开。

在这里下载源代码

简要地说,LocalConnection 可以让一个Flash Player向运行在同一个桌面上的一个或者多个其他的Flash Player发送消息。这些Flash Player可以在相同的HTML页中,也可以在不同的frame中,甚至可以在不同的浏览器中。例如,假设你创建了一个有3个frame的HTML页:顶部frame用来放置banner,侧边frame放置菜单,中间frame用来放置内容。你希望banner和menu是Flash动画。你还希望当选中menu SWF的时候会改变banner SWF中的内容。因为这些 SWF 运行在不同的Flash Player中,所以你可以使用 LocalConnection让menu SWF 向banner SWF发送消息。

LocalConnection 是一个单向的消息。一个SWF监听其他SWF发送的消息。如果你希望双向的通讯,两个SWF都需要创建LocalConnection并以不同的名字命名。

LocalConnection在Flash Player 9 AVM之间也可以工作。

Flash

在你的Flash 程序中创建一个LocalConnection对象并向其中添加你希望Flex程序调用的函数。这些就是前面我提到的“消息”。

程序代码 程序代码
var fromFlex_lc:LocalConnection = new LocalConnection();

fromFlex_lc.stopMe = function() { stop(); }
fromFlex_lc.playMe = function() { play(); }

fromFlex_lc.connection( "lc_from_flex" );


stopMe 和 playMe函数非常简单,它们只是停止和播放时间线。当然,它们也可以变得很复杂。当用户点击一个button的时候Flex将会调用它们。

Flex

在你的Flex 程序中,创建一个LocalConnection对象并利用它来调用 Flash SWF中的stopME和 playMe函数。

程序代码 程序代码
import flash.net.LocalConnection;

var toFlash_lc:LocalConnection = new LocalConnection();

<mx:Button label="Stop" click="toFlash_lc.send('lc_from_flex', 'stopMe')" />
<mx:Button label="Play" click="toFlash_lc.send('lc_from_flex', 'playMe')" />


这些Button调用了LocalConnection.send()方法,命名了Flash SWF正在监听的connection。Send()的第二个参数是将要调用的函数名。如果这些函数有参数的话,那些参数写在方法名的后面。

Flash to Flex

你可能会推测,让Flash SWF向 Flex SWF发送消息就是把上面的过程逆转过来。这是正确的,唯一的不同就是在什么地方定义LocalConnection.send()方法调用的消息。

在Flex程序中创建一个含有你想要从LocalConnection调用的函数的对象。例如:

程序代码 程序代码
<mx:Application xmlns:mx="..." initialize="initApp()" >
<mx:Script>
<![CDATA[
import flash.net.LocalConnection;

public function showDetails() : void {
// do something
}

private var fromFlash_mc:LocalConnection;

private function initApp() : void {
fromFlash_lc = new LocalConnection();
fromFlash_lc.client = this;
fromFlash_lc.connect("lc_from_flash");
}
]]>
</mx:Script>
...
</mx:Application>


Flash SWF 现在可以为LocalConnection调用名字为“client”的对象中的任意public的方法。在这个例子中目的就是让Flash SWF调用 showDetails()方法。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页