• 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;
            }
            
        }
    }
    
  • 相关阅读:
    JAVA多线程(七) ReentrantLock原理分析
    JAVA多线程(六) synchronize原理分析
    JAVA多线程(五) volatile原理分析
    pandas
    从美国总经理,到三一重卡的董事长,梁林河的重卡梦
    【转载】低水平领导的十大表现
    kill及其衍生程序
    python -m venv 的使用
    Python多版本启动器
    Pyinstaller最流行的打包程序
  • 原文地址:https://www.cnblogs.com/zhepama/p/3467153.html
Copyright © 2020-2023  润新知