as3调用外部swf里的类的方法
as3项目要调用外部swf里的类有3种方法:
1.将外部的swf发布为swc,使用时将swc引用添加到相应的项目中,这应该是最简单的一种引用。不过当项目中的类或组件比较多时就会使项目发布生成的swf文件大小过大;
2.通过资源绑定外部的,然后直接通过类名获取。如:[Embed(source="assets/icon/skin.swf",symbol="Btn_Max")],这种方法也会引起swf文件过大;
3.通过域来来获取外部swf里的绑定类,这种方法可以在需要用时才去加载相应的swf文件然后再获取所需要的类。
下面是根据第三种方法来获取所需要的类:
package com.mobiano.flipbook.pageeditor
{
import com.flasht.tui.display.TArrow;
import com.mobiano.flipbook.config.FlipBookConfig;
import com.tflash.Components.util.SWFLoader; import flash.display.DisplayObject;
import flash.errors.IOError;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.utils.Dictionary; public class PlugInManager
{
public static var allExternalClass:Object={};
//public var loadingQueue:Object={};
//public var swfLoader:SWFLoader;
public var loadingQueue:Dictionary=new Dictionary();
private static var canInstace:Boolean=false;
private static var instace:PlugInManager; private var filePrefix:String="./files/pageConfig/";
private var fileSuffix:String=".swf";
public function PlugInManager()
{
if(!canInstace){
throw new Error("Can't new PlugInManager");
}
} public static function getInstace():PlugInManager{
if(instace==null){
canInstace=true;
instace=new PlugInManager();
canInstace=false;
} return instace;
} public function getComponent(target:TAnnoPlugIn,cpName:String,extClassName:String):void{
if(cpName==null||cpName.length<1||extClassName==null||extClassName.length<1)return ;
if(allExternalClass.hasOwnProperty()){
//return allExternalClass[cpName];
var swfLoader:SWFLoader=allExternalClass[cpName];
var cl:Class=swfLoader.GetClass(extClassName);
if(cl!=null){
var extObj:IPlugInInterface=createSWFClass(cl);
if(extObj!=null){
target.extObj=extObj;
}
}
}else{
load(target,cpName,extClassName);
}
//return null;
} public function getSwfUrl(cpName):String{
if(cpName!=null){
return filePrefix+cpName+fileSuffix;
}
return null;
} protected function getURLFrom(url:String):String{
return com.mobiano.flipbook.config.FlipBookConfig.getURLForm(url);
} private function load(target:TAnnoPlugIn,cpName:String,extClName:String):void{
var swfUrl:String=getSwfUrl(cpName);
if(swfUrl==null||swfUrl.length<1)return;
swfUrl=getURLFrom(swfUrl); var swfLoader:SWFLoader=new SWFLoader(swfUrl);
swfLoader.addEventListener(Event.COMPLETE,onComplete);
swfLoader.addEventListener(ProgressEvent.PROGRESS,onProgress);
swfLoader.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
var obj:Object={target:target,compontName:cpName,extClassName:extClName}; //loadingQueue[cpName]=obj;
loadingQueue[swfLoader]=obj;
swfLoader.Load(); } private function onComplete(evt:Event):void{
trace(evt.currentTarget);
if(evt.currentTarget is SWFLoader){
var loader:SWFLoader=evt.currentTarget as SWFLoader;
if(loader in loadingQueue){
var obj:Object=loadingQueue[loader];
if(obj["target"]&&obj["compontName"]&&obj["extClassName"]){
var cpName:String=obj["compontName"];
var extClassName:String=obj["extClassName"]; allExternalClass[cpName]=loader; var cl:Class=loader.GetClass(extClassName);
var target:TAnnoPlugIn=obj["target"];
if(cl!=null){
//allExternalClass[cpName]=cl;
var extObj:IPlugInInterface=createSWFClass(cl);
if(extObj!=null){
target.extObj=extObj;
}
}
}
//loader.GetClass(
//var target:TAnnoPlugIn=loadingQueue[loader];
}
}
} private function createSWFClass(cl:Class):IPlugInInterface{
var extObj:IPlugInInterface;
try{
if(cl!=null){
extObj=new cl();
} }catch(e:Error){
return null;
}
return extObj;
} private function onProgress(evt:ProgressEvent):void{ } private function onIOError(evt:IOError):void{
throw new Error("Load swf error:"+evt);
} }
}
package com.tflash.Components.util
{
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext; [Event(name="complete", type="flash.events.Event")]
[Event(name="progress",type="flash.events.ProgressEvent")]
[Event(name="io_error",type="flash.events.IOErrorEvent")] public class SWFLoader extends EventDispatcher
{
private var loader:Loader;
private var content:DisplayObject;
private var loadComplete:Boolean=false;
private var url:String;
public function SWFLoader(url:String)
{
this.url=url; } public function Load(url:String=null):void{
if(url!=null){
this.url=url;
}
loadComplete=false;
if(loader==null){
loader=new Loader();
}else{
loader.unloadAndStop(true);
if(loader.contentLoaderInfo.hasEventListener(Event.COMPLETE)){
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onLoadComplete);
}
if(loader.contentLoaderInfo.hasEventListener(ProgressEvent.PROGRESS)){
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
}
if(loader.contentLoaderInfo.hasEventListener(IOErrorEvent.IO_ERROR)){
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError)
}
} var context:LoaderContext=new LoaderContext();
context.applicationDomain=new ApplicationDomain(ApplicationDomain.currentDomain);
var request:URLRequest=new URLRequest(this.url);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onLoadProgress);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
loader.load(request,context);
} private function onLoadProgress(evt:ProgressEvent):void{ this.dispatchEvent(evt);
} private function onLoadComplete(evt:Event):void{
evt.currentTarget.removeEventListener(Event.COMPLETE,onLoadComplete);
evt.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
evt.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
content=(evt.currentTarget as LoaderInfo).content;
loadComplete=true;
this.dispatchEvent(new Event(Event.COMPLETE)); } private function onLoadIOError(evt:IOErrorEvent):void{
evt.currentTarget.removeEventListener(Event.COMPLETE,onLoadComplete);
evt.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
evt.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError); this.dispatchEvent(evt);
} /**
* 获取当前ApplicationDomain内的类定义
*
* name类名称,必须包含完整的命名空间,如 Grave.Function.SWFLoader
* info加载swf的LoadInfo,不指定则从当前域获取
* return获取的类定义,如果不存在返回null
*/
public function GetClass(name:String):Class{ if(loadComplete&&loader!=null){
if(loader.contentLoaderInfo.applicationDomain.hasDefinition(name)){
return loader.contentLoaderInfo.applicationDomain.getDefinition(name) as Class;
}else{
return null;
}
}
return null;
} public function GetContent():DisplayObject{
return content;
} public function GetLoader():Loader{ return loader;
} }
}
as3调用外部swf里的类的方法的更多相关文章
- AS3 从外部SWF中获取资源的方法(ApplicationDomain的使用)
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; ...
- 如何通过AS3加载外部SWF文件,调用外部文件文档类的方法?
一个Flash中通过AS3代码的Loader对象加载另一个SWF文件,并访问其中的文档类中的方法. 简单示例: 主文件:Main.fla, Main.as 被调用的文件:called.swf, Cal ...
- Java 扫描实现 Ioc 动态注入,过滤器根据访问url调用自定义注解标记的类及其方法
扫描实现 Ioc 动态注入 参考: http://www.private-blog.com/2017/11/16/java-%e6%89%ab%e6%8f%8f%e5%ae%9e%e7%8e%b0-i ...
- 【python 3.6】调用另一个文件的类的方法
文件1:test12.py 文件2:test13.py 文件1 如下: #!/usr/bin/python # -*- coding: utf-8 -*- ''' ''' class abcd(obj ...
- as3调用外部应用程序 as调用外部exe文件as3调用bat文件 未测试
private function callTest(event: Event): void{callExe("d:/a.exe");callBat("d:/a.bat&q ...
- 执行引入外部 jar 包的类的方法
liunx 系统中,命令行中语法:(.后面是冒号:) java -cp .:third.jar MyClass windows 系统中命令行的语法:(.后面是分号;) java -cp .;third ...
- ant中调用外部ant任务的两种方法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- C# 调用外部dll(转)
C# 调用外部dll 一. DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最 ...
- C#调用外部DLL介绍及使用详解
一. DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件 ...
随机推荐
- 修改Android默认背光值
/********************************************************************* * 修改Android默认背光值 * 说明: * 本文主要 ...
- [Mac][$PATH]如何修改$PATH变量
从 stackoverflow 找到的方法 http://stackoverflow.com/questions/7703041/editing-path-variable-on-mac 首先打开终端 ...
- jvm常量池 vsv为什么1000 == 1000返回为False,而100 == 100会返回为True?
在jvm规范中,每个类型都有自己的常量池.常量池是某类型所用常量的一个有序集合,包括直接常量(基本类型,String)和对其他类型.字段.方法的符号引用.之所以是符号引用而不是像c语言那样,编译时直接 ...
- TPL
namespace TPLTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } pr ...
- mac usb转串口 连接树莓PI
USB 转串口是淘宝买的 http://item.taobao.com/item.htm?spm=a1z09.2.9.50.YOJBwG&id=38963495468&_u=4m1dr ...
- NGUI如何创建自己的精灵图集
说实话其实很简单,但是在不知道的情况下真的不好弄啊. 1. 选择你要制作精灵图集的图片,可以选择多张 2. 提倡使用快捷键Alt + Shift + M 会有如下窗口弹出,也可以NGUI --> ...
- Getty – Java NIO 框架设计与实现
前言 Getty是我为了学习 Java NIO 所写的一个 NIO 框架,实现过程中参考了 Netty 的设计,同时使用 Groovy 来实现.虽然只是玩具,但是麻雀虽小,五脏俱全,在实现过程中,不仅 ...
- Delphi外挂开发网站
http://cheatengine.org/http://wenku.baidu.com/view/2d5de818964bcf84b9d57b15.html [delphi外G]http:// ...
- 基于UDP协议的多路广播地址
因为多路广播地址的范围是224.0.0.0 到239.255.255.255之间,所以我们可以从中取一个地址给我们的程序用即可
- unigui下载文件
lblProduct.Caption := '<a href="files\1.t" target=new>要下载的文件名</a>';