|
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,花一点时间研读它。你可能因此为你的下一个项目获得灵感。
简要地说,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()方法。
代码见附件 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|