加载外部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
源自:http://wangcheng.iteye.com/category/12986
分享到:
相关推荐
- **目的**:为皮肤资源创建一个外壳SWF文件,使得Flex程序能够在运行时加载所需的皮肤资源。 - **实现**:通过定义一个名为`Wrapper`的类,并使用`[Embed]`元数据标签指定要嵌入的皮肤资源(如`flex_skins.swf`中...
此外,可以考虑在运行时动态加载非关键资源,而不是一次性打包到SWF中。 3. **库使用**:在Flex项目中,库(Library)可以包含可重用的组件和资源。合理组织库,避免不必要的依赖,可以减少编译后的SWF大小。 4. *...
在Flex中,我们可以使用`flash.display.Loader`类来加载SWF文件。这个类提供了加载二进制数据(如SWF文件)并将其作为显示对象插入显示列表的能力。`Loader`类的`load()`方法接受一个`URLRequest`对象,其中包含了...
"FLEX动态加载Model"这个主题涉及到的是如何在运行时动态地加载和管理应用程序的数据模型。 动态加载Model是FLEX应用程序中的一个重要概念,它允许程序根据需要在运行时加载数据,而不是一次性在启动时全部加载。...
而影片剪辑是Flash舞台上可独立播放的动画序列,它可以在运行时动态创建、添加和控制。 1. **SWF加载性能**: - **优点**:SWF文件可以作为独立的资源进行加载,允许代码分离,便于维护和更新。通过网络加载SWF,...
通过结合Flex、JSP、SWF和HTML,我们可以创建一个高度可定制、交互性强的系统监控界面,让管理员能直观地理解系统的运行状况。 总的来说,将Flex嵌入JSP并生成SWF作为系统拓扑图,是一种高效且灵活的解决方案,它...
标题中提到的“动态加载swf皮肤”指的是在Flex应用程序运行时,根据需要替换组件的外观或功能。这种方式可以提高用户体验,因为用户不需要重新加载整个应用程序就可以更新界面风格,同时也降低了网络传输的数据量,...
以下是一个基本示例,展示如何加载SWF并将其转换为非MovieClip对象: ```actionscript import flash.display.Loader; import flash.system.ApplicationDomain; import flash.events.Event; var loader:Loader = ...
标题中的“Flex3控制多个SWF文件在MXML文件里做360度的随机运动”涉及了几个关键的Flex编程概念,主要包括Flex框架、MXML语言、SWF加载以及动态运动控制。以下是对这些知识点的详细解释: 1. **Flex框架**:Flex是...
加载SWF文件时,沙箱问题就显得尤为重要。当你试图从一个SWF加载另一个SWF时,Flash Player会根据加载的来源和目标SWF的沙箱类型来决定是否允许此操作。例如,一个运行在网络沙箱中的SWF文件试图加载本地沙箱中的SWF...
5. **加载并显示**:在Flex应用运行时,SWFLoader会自动加载指定的SWF文件并显示在屏幕上。你可能需要监听加载事件以了解加载进度或处理错误: ```actionscript flashPaperLoader.addEventListener(Event.COMPLETE...
当Flash Player加载SWF时,一旦接收到第一帧的数据,就会实例化SystemManager,进而创建Preloader和DownloadProgressBar,它们监控剩余数据的下载进度。当第一帧完全加载后,SystemManager触发进入第二帧的`...
Flex提供了丰富的数据加载机制,如Loader类用于加载图像、SWF或其他媒体文件,Service类则用于处理远程数据请求,如HTTPService或WebService。加载过程通常涉及事件监听,如` IOErrorEvent.IO_ERROR `和` Event....
- `.swf`或`.air`文件:编译后的应用程序,可以直接运行查看自定义加载条的效果。 要学习和理解这个示例,你需要阅读`readMe.txt`,然后查看源代码,理解其中的组件结构、样式应用以及事件处理。此外,熟悉Flex SDK...
在Flex应用中,"预加载器"(preloader)是程序启动时显示的一个组件,它的主要功能是在用户等待整个应用程序完全加载时提供反馈。预加载器通常会显示一个进度条,以指示应用程序资源的加载进度。 在“flex自定义...
在Flex开发中,"flex动态添加资源"是一个重要的优化策略,它允许开发者在运行时根据需要动态加载资源,而不是在构建SWF文件时一次性将所有资源嵌入其中。这种技术对于大型应用程序尤其有用,因为它可以显著减小SWF...
1. 动态加载SWF模块,实现程序的模块化设计。 2. 实时更新内容,如在线更换广告或用户头像。 3. 加载远程数据并转换为显示对象,如XML数据加载后解析为SpriteSheet。 总结,Loader类是Flex和ActionScript 3中不可或...
- **使用`Loader`类**:通过动态地将SWF文件加载到容器中,可以在运行时根据需要加载不同的资源。 - **组件懒加载**:利用Flex组件的事件机制,在特定条件下触发组件的加载。 - **数据懒加载**:仅在需要显示数据时...