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里的类的方法的更多相关文章

  1. AS3 从外部SWF中获取资源的方法(ApplicationDomain的使用)

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; ...

  2. 如何通过AS3加载外部SWF文件,调用外部文件文档类的方法?

    一个Flash中通过AS3代码的Loader对象加载另一个SWF文件,并访问其中的文档类中的方法. 简单示例: 主文件:Main.fla, Main.as 被调用的文件:called.swf, Cal ...

  3. 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 ...

  4. 【python 3.6】调用另一个文件的类的方法

    文件1:test12.py 文件2:test13.py 文件1 如下: #!/usr/bin/python # -*- coding: utf-8 -*- ''' ''' class abcd(obj ...

  5. as3调用外部应用程序 as调用外部exe文件as3调用bat文件 未测试

    private function callTest(event: Event): void{callExe("d:/a.exe");callBat("d:/a.bat&q ...

  6. 执行引入外部 jar 包的类的方法

    liunx 系统中,命令行中语法:(.后面是冒号:) java -cp .:third.jar MyClass windows 系统中命令行的语法:(.后面是分号;) java -cp .;third ...

  7. ant中调用外部ant任务的两种方法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. C# 调用外部dll(转)

    C# 调用外部dll   一.      DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最 ...

  9. C#调用外部DLL介绍及使用详解

    一.      DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件 ...

随机推荐

  1. BZOJ3053: The Closest M Points

    题解: 我们可以事先在堆里放入插入m个inf然后不断的比较当前值与堆首元素的大小,如果小于的话进入. 估计函数也可以随便写写... query的时候貌似不用保留dir... return 0写在 wh ...

  2. I.MX6 android 移除shutdown功能

    /************************************************************************ * I.MX6 android 移除shutdown ...

  3. ichartjs

    ichartjs-基于html5的图表组件 不适合桌面端

  4. 陈正冲老师讲c语言void关键字

    1. void a void的字面意思是“空类型”,void *则为“空类型指针”,void *可以指向任何类型的数据. void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量 ...

  5. ClassLoader工作机制

    阅读目录 一.ClassLoader概念 二.JVM平台提供三层classLoader 三.JVM加载class文件到内存有两种方式 四.ClassLoader加载类的过程 五.自定义类加载器 六.实 ...

  6. xmlns 属性

    xmlns 属性 xmlns 属性可以在文档中定义一个或多个可供选择的命名空间.该属性可以放置在文档内任何元素的开始标签中.该属性的值类似于 URL,它定义了一个命名空间,浏览器会将此命名空间用于该属 ...

  7. HDU 3586-Information Disturbing(树形dp)

    题意: n个节点的通信连接树,切断每个边有一定的花费,要你切断边,在总花费不超过m的前提,使所有的其他节点都不能和节点1(根)连通,切边时有花费上限,让你最小化这个上限. 分析:最小化最大值,想到二分 ...

  8. activemq 的小实验

    package ch02.chat; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms ...

  9. mysql 处理中文乱码问题

    CREATE TABLE tbl_score( `ID` INT NOT NULL, `score` DEC(,) NOT NULL, `subject` VARCHAR() NOT NULL ); ...

  10. 【原创】alias与export

    最近在看lualua相关的,其中k中有os.getenv('kroot'),看到~/.bashrc理由kroot但是为什么拿不到,后来发现写成了alias了,应该是export的. alias rer ...