zoukankan      html  css  js  c++  java
  • 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;
            }
            
        }
    }
    
  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/zhepama/p/3467153.html
Copyright © 2011-2022 走看看