博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
as3调用外部swf里的类的方法
阅读量:4639 次
发布时间:2019-06-09

本文共 9427 字,大约阅读时间需要 31 分钟。

  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;        }            }}

转载于:https://www.cnblogs.com/zhepama/p/3467153.html

你可能感兴趣的文章
大四了,转换到工作模式,总结一下自己
查看>>
matlab中的常用的函数——在稀疏表示中学习到的
查看>>
swift 语法中容易出的问题
查看>>
jade和ejs两者的特点
查看>>
HDU 1872:稳定排序
查看>>
2017秋-软件工程第四次作业(3)-四则运算出题
查看>>
二进制 中 1 的 个数
查看>>
Poj 2092 Grandpa is Famous(基数排序)
查看>>
什么是Dojo?与Jquery宏观对比,结果如何?
查看>>
Symfony2学习笔记之HTTP Cache
查看>>
Symfony2学习笔记之事件分配器
查看>>
Xstream序列化实体
查看>>
F#新Bug,小心! module 里的泛型变量。
查看>>
2017.5.22 git
查看>>
[转载]网站分析的最基本度量(7)——Impression,Click和CTR
查看>>
信号调理-电平调整
查看>>
delphi 使用自定义HANDLE处理消息
查看>>
ASP.NET中的常用快捷键
查看>>
poj 3034 动态规划
查看>>
联合体
查看>>