加载外部SWF文件,并读取其中的组件和类。其中借鉴了fluorida里的部分代码。
//ActionScript code
public class SWFLoaderWrapper {
private var _loader : SWFLoader;
public function SWFLoaderWrapper(swfLoader : SWFLoader) {
_loader = swfLoader;
}
public function getSWFApplication() : Application {
if(_loader == null || _loader.content == null) {
return null;
}
var sysManager : SystemManager = _loader.content as SystemManager;
if(sysManager == null) {
return null;
}
return sysManager.application as Application;
}
private function recursiveSelect(componentId : String, container:DisplayObjectContainer, result:Array) : void {
selectChildren(componentId, container, result);
for(var cursor:int = 0; cursor < container.numChildren; cursor++) {
var child:DisplayObject = container.getChildAt(cursor);
var subContainer:DisplayObjectContainer = child as DisplayObjectContainer;
if(subContainer == null) {
continue;
}
recursiveSelect(componentId, subContainer, result);
}
}
private function selectChildren(componentId : String, container:DisplayObjectContainer, result:Array) : void {
for(var cursor:int = 0; cursor < container.numChildren; cursor++) {
var child:DisplayObject = container.getChildAt(cursor);
if (match(componentId, child)) {
result.push(child);
}
}
}
private function match(componentId : String, element:DisplayObject) : Boolean {
if(element.hasOwnProperty("id") && element["id"] == componentId) {
return true;
}
if(element.name == componentId) {
return true;
}
return false;
}
public function getComponentById(componentId : String) : DisplayObject {
var result : Array = getComponents(componentId);
if (result != null && result.length > 0) {
return result[0];
}
return null;
}
public function getComponents(componentId : String) : Array {
var result : Array = new Array();
recursiveSelect(componentId, getSWFApplication(), result);
return result;
}
public function getClassByName(className : String) : Class {
if (getSWFApplication() == null) {
return null;
}
var clazz:Class = null;
try {
clazz = getSWFApplication().systemManager.loaderInfo.applicationDomain.getDefinition(className) as Class;
return clazz;
} catch (e:Error) {
throw new IllegalOperationError(className + " doesn't exist");
}
return clazz;
}
}
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="initApp()" creationComplete="init()"> <mx:Script> [CDATA[ import mx.controls.Button; import mx.controls.Alert; import utils.SWFLoaderWrapper; private var _swfLoaderWrapper : SWFLoaderWrapper; public function initApp() : void { flash.system.Security.allowDomain("*"); } public function init() : void { swfLoader.addEventListener(Event.INIT, initHandle); } private function initHandle(e : Event) : void { Alert.show("ok"); _swfLoaderWrapper = new SWFLoaderWrapper(swfLoader); } public function loadSwf() : void { swfLoader.load(swfurl.text); } public function getComponentById() : void { var displayObject : DisplayObject = _swfLoaderWrapper.getComponentById(componentId.text); if (displayObject != null) { textArea.text = flash.utils.describeType(displayObject).toString(); } } private function getClassByName() : void { var clazz : Class = _swfLoaderWrapper.getClassByName(classNameText.text); if (clazz != null) { var obj:Object = new clazz(); textArea.text = flash.utils.describeType(obj).toString(); } } ]] </mx:Script> <mx:TextInput id="swfurl" left="10" right="294" top="10"/> <mx:Button x="10" y="40" label="Load Swf" click="loadSwf()"/> <mx:Label x="10" y="72" text="Component Id" fontSize="12"/> <mx:TextInput id="componentId" x="109" y="72" width="360"/> <mx:Button x="10" y="100" label="get Component by Id" click="getComponentById()"/> <mx:Label x="10" y="141" text="Class Name" fontSize="12"/> <mx:TextInput id="classNameText" x="109" y="141" width="360"/> <mx:Button x="10" y="169" label="get Class by Name" click="getClassByName()"/> <mx:TextArea id="textArea" top="199" left="10" right="294" height="139"/> <mx:SWFLoader id="swfLoader" left="10" right="294" top="346" bottom="10"/> </mx:Application>
1.尝试动态加载使用了RSL的swf,出错,还不知道怎么解决。
2.不能加载swc,遗憾。
3.通过flash.utils.describeType只能看到public的属性和方法。
4.也可以只使用flash.display.Loader来动态加载swf. http://www.cnblogs.com/jssy/archive/2007/09/09/887815.html