今天需要实现swf加载另外一个swf,并实现它们之间的通讯
在网上找了些资料,发现有些写的都是无法运行的,
把我最终的成果记录下来
主swf的代码如下:
加载外部swf,添加侦听事件
var loaderSWF:SWFLoader = new SWFLoader(); loaderSWF.addEventListener(Event.COMPLETE,swfReady); loaderSWF.load("TestSWF.swf");
处理侦听时间,并再添加FlexEvent侦听事件
private function swfReady(e:Event):void { var loaderSWF:SWFLoader = e.target as SWFLoader; var obj:SystemManager = loaderSWF.content as SystemManager; obj.addEventListener(FlexEvent.APPLICATION_COMPLETE,comp); }
最终处理FlexEvent事件
private function comp(e:Event):void { var obj:Object = e.target.application.showObject(FlexGlobals.topLevelApplication); trace(obj.sss); trace(obj.ssss); }
被加载的swf代码如下:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Script> <![CDATA[ public function showObject(app:Object):Object { trace("success!!!!"); var obj:Object = new Object(); obj.ssss = "1234"; obj.sss = 1234; return obj; } ]]> </fx:Script> <s:Button name="12341234"/> </s:Application>
经过测试主swf可以调用到外部swf里边的方法,不过没找到外部swf调用主swf的方法,不过我们可以传入一个FlexGlobals.topLevelApplication对象,然后就可以调用了,象上边代码里边的示例.
如果被加载的swf是ActionScript Project创建的,也就是项目里边没有mxml文件的,就不需要再侦听FlexEvent.APPLICATION_COMPLETE事件,
obj.addEventListener(FlexEvent.APPLICATION_COMPLETE,comp);
直接loaderSWF.content就是你需要取得的对象