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系统文件 ...
随机推荐
- 信息学院第九届ACM程序设计竞赛题解
A: 信号与系统 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 238 Accepted: 44 Page View: 69 Des ...
- 嵌入式Linux系统运行流程图
/************************************************************************ * 嵌入式Linux系统运行流程图 * 说明: * ...
- 【Markdown】Writing on Github - 在GitHub上写作
Writing on GitHub https://github.com/shalliestera/Writing-on-GitHub-Chinese-Translation Markdown 基本语 ...
- jquery-autocomplete 参数说明
minChars (Number): 在触发autoComplete前用户至少需要输入的字符数.Default: 1,如果设为0,在输入框内双击或者删除输入框内内容时显示列表 * width (Num ...
- 十款PHP开发框架对比
PHP开发框架近来在PHP社区中成为讨论的热点,几乎每天都在推出新的框架.面对市面上超过四十种的开发框架,你很难判断究竟哪一款最适合你,尤其是在这些框架所提供的功能不尽相同的时候. 本文将引导你 ...
- IGT一道笔试题
1到n连续的n个数 输入m 得出m个有序序列 比如 输入为n=5 ,m=3 则输出 543 542 541 532 531 521 432 431 421 321 当前长度为i,每个位上的取之范围为 ...
- tcp/udp socket编程异同
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UDP不保证 ...
- hdu5773--The All-purpose Zero(LIS变形)
题意:给一个非负整数的数列,其中0可以变成任意整数,包括负数,求最长上升子序列的长度. 题解:LIS是最简单的DP了,但是变形之后T^T真的没想到.数据范围是10^5,只能O(nlogn)的做法,所以 ...
- Hadoop MapReduce编程 API入门系列之mr编程快捷键活用技巧详解(四)
1.Shift + Alt + S Hadoop没有使用jdk自带的默认序列化机制. 现在呢,hadoop-2.*里有两套序列化机制.一个是自己hadoop的序列化机制,一个是谷歌的. 所以,要改为. ...
- android中常用的尺寸单位及其关系
1 尺寸单位定义 px(pixel,像素):每个px对应屏幕上的一个点 dip或dp(device independent pixels,设备独立像素):一种基于屏幕密度的抽象单位.在每英寸160个点 ...