Flex与Flex创建的swf通信
这是在网上找到的代码,整理后记录下来。
加载子SWF的Flex程序代码
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.managers.SystemManager;
import mx.controls.Label;
[Bindable]
public var loadedSWF:SystemManager;
private function initNestedAppProps():void {
loadedSWF = SystemManager(myLoader.content);
}
public function updateLabel():void {
lbl.text=loadedSWF.application["text_1"].text;
}
// Write to the Label control in the loaded application.
public function updateNestedLabels():void {
loadedSWF.application["text_2"].text = text_value.text;
}
]]>
</mx:Script>
<mx:Label id="lbl" x="204" y="69" fontSize="12"/>
<mx:SWFLoader id="myLoader" width="250" height="200"
source="subswf.swf"
creationComplete="initNestedAppProps();" x="13" y="124"/>
<mx:Button label="获得加载SWF中的控制值"
click="updateLabel();" fontSize="12" x="10" y="65"/>
<mx:Button label="修改加载SWF中的控制值"
click="updateNestedLabels();" fontSize="12" x="10" y="33"/>
<mx:TextInput id="text_value" x="192" y="35" fontSize="12"/>
</mx:Application>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.managers.SystemManager;
import mx.controls.Label;
[Bindable]
public var loadedSWF:SystemManager;
private function initNestedAppProps():void {
loadedSWF = SystemManager(myLoader.content);
}
public function updateLabel():void {
lbl.text=loadedSWF.application["text_1"].text;
}
// Write to the Label control in the loaded application.
public function updateNestedLabels():void {
loadedSWF.application["text_2"].text = text_value.text;
}
]]>
</mx:Script>
<mx:Label id="lbl" x="204" y="69" fontSize="12"/>
<mx:SWFLoader id="myLoader" width="250" height="200"
source="subswf.swf"
creationComplete="initNestedAppProps();" x="13" y="124"/>
<mx:Button label="获得加载SWF中的控制值"
click="updateLabel();" fontSize="12" x="10" y="65"/>
<mx:Button label="修改加载SWF中的控制值"
click="updateNestedLabels();" fontSize="12" x="10" y="33"/>
<mx:TextInput id="text_value" x="192" y="35" fontSize="12"/>
</mx:Application>
子SWF程序代码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Panel x="0" y="0" width="250" height="200" layout="absolute" title="加载的SWF文件" fontSize="12">
<mx:TextInput id="text_1" x="10" y="41" fontSize="12" text="大家好,我是FLEX"/>
<mx:TextInput id="text_2" x="10" y="88" fontSize="12"/>
</mx:Panel>
</mx:Application>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Panel x="0" y="0" width="250" height="200" layout="absolute" title="加载的SWF文件" fontSize="12">
<mx:TextInput id="text_1" x="10" y="41" fontSize="12" text="大家好,我是FLEX"/>
<mx:TextInput id="text_2" x="10" y="88" fontSize="12"/>
</mx:Panel>
</mx:Application>
如果需要调用子swf的方法,可以将loadSwf的application转换成Object,然后再调用子swf中的方法,否则会出现找不到方法的错误。
var loadSwf:SystemManager = SystemManager(myLoader.content);
(loadSwf.application as Object).test();
#===============================================================================
后来在使用发现上面的代码还是有隐患的,如果被加载的swf文件比较大,可能出项_loadSwf中的application值为null的情况。下面是我补充的一段代码。
补充代码
private var _loadSwf:SystemManager;
private var content:Image;
private function onLoadCompleted(event:Event):void
{
_loadSwf = SystemManager(content.content);
_loadSwf.addEventListener(FlexEvent.APPLICATION_COMPLETE,swfReady);
function swfReady(event:FlexEvent):void
{
_loadSwf.removeEventListener(FlexEvent.APPLICATION_COMPLETE,swfReady);
(_loadSwf.application as Object).test();
}
}
private var content:Image;
private function onLoadCompleted(event:Event):void
{
_loadSwf = SystemManager(content.content);
_loadSwf.addEventListener(FlexEvent.APPLICATION_COMPLETE,swfReady);
function swfReady(event:FlexEvent):void
{
_loadSwf.removeEventListener(FlexEvent.APPLICATION_COMPLETE,swfReady);
(_loadSwf.application as Object).test();
}
}
--kaixuan's cnblogs