as3调用外部swf里的类的方法

  as3项目要调用外部swf里的类有3种方法:

  1.将外部的swf发布为swc,使用时将swc引用添加到相应的项目中,这应该是最简单的一种引用。不过当项目中的类或组件比较多时就会使项目发布生成的swf文件大小过大;

  2.通过资源绑定外部的,然后直接通过类名获取。如:[Embed(source="assets/icon/skin.swf",symbol="Btn_Max")],这种方法也会引起swf文件过大;

  3.通过域来来获取外部swf里的绑定类,这种方法可以在需要用时才去加载相应的swf文件然后再获取所需要的类。

  下面是根据第三种方法来获取所需要的类:

  

View Code
  1 package com.mobiano.flipbook.pageeditor
  2 {
  3     import com.flasht.tui.display.TArrow;
  4     import com.mobiano.flipbook.config.FlipBookConfig;
  5     import com.tflash.Components.util.SWFLoader;
  6     
  7     import flash.display.DisplayObject;
  8     import flash.errors.IOError;
  9     import flash.events.Event;
 10     import flash.events.IOErrorEvent;
 11     import flash.events.ProgressEvent;
 12     import flash.utils.Dictionary;
 13 
 14     public class PlugInManager
 15     {
 16         public static var allExternalClass:Object={};
 17         //public var loadingQueue:Object={};
 18         //public var swfLoader:SWFLoader;
 19         public var loadingQueue:Dictionary=new Dictionary();
 20         private static var canInstace:Boolean=false;
 21         private static var instace:PlugInManager;
 22         
 23         private var filePrefix:String="./files/pageConfig/";
 24         private var fileSuffix:String=".swf";
 25         public function PlugInManager()
 26         {
 27             if(!canInstace){
 28                 throw new Error("Can't new PlugInManager"); 
 29             }
 30         }
 31         
 32         public static function getInstace():PlugInManager{
 33             if(instace==null){
 34                 canInstace=true;
 35                 instace=new PlugInManager();
 36                 canInstace=false;
 37             }
 38             
 39             return instace;
 40         } 
 41         
 42         public function getComponent(target:TAnnoPlugIn,cpName:String,extClassName:String):void{
 43             if(cpName==null||cpName.length<1||extClassName==null||extClassName.length<1)return ;
 44             if(allExternalClass.hasOwnProperty()){
 45                 //return allExternalClass[cpName];
 46                 var swfLoader:SWFLoader=allExternalClass[cpName];
 47                 var cl:Class=swfLoader.GetClass(extClassName);
 48                 if(cl!=null){
 49                     var extObj:IPlugInInterface=createSWFClass(cl);
 50                     if(extObj!=null){
 51                         target.extObj=extObj;
 52                     }
 53                 }
 54             }else{
 55                 load(target,cpName,extClassName);
 56             }
 57             //return null;
 58         }
 59         
 60         public function getSwfUrl(cpName):String{
 61             if(cpName!=null){
 62                 return filePrefix+cpName+fileSuffix;
 63             }
 64             return null;
 65         }
 66         
 67         protected function getURLFrom(url:String):String{
 68             return com.mobiano.flipbook.config.FlipBookConfig.getURLForm(url);
 69         }
 70         
 71         private function load(target:TAnnoPlugIn,cpName:String,extClName:String):void{
 72             var swfUrl:String=getSwfUrl(cpName);
 73             if(swfUrl==null||swfUrl.length<1)return;
 74             swfUrl=getURLFrom(swfUrl);
 75             
 76             var swfLoader:SWFLoader=new SWFLoader(swfUrl);
 77             swfLoader.addEventListener(Event.COMPLETE,onComplete);
 78             swfLoader.addEventListener(ProgressEvent.PROGRESS,onProgress);
 79             swfLoader.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
 80             var obj:Object={target:target,compontName:cpName,extClassName:extClName};
 81             
 82             //loadingQueue[cpName]=obj;
 83             loadingQueue[swfLoader]=obj;
 84             swfLoader.Load();
 85             
 86         }
 87         
 88         private function onComplete(evt:Event):void{
 89             trace(evt.currentTarget);
 90              if(evt.currentTarget is SWFLoader){
 91                  var loader:SWFLoader=evt.currentTarget as SWFLoader;
 92                 if(loader in loadingQueue){
 93                     var obj:Object=loadingQueue[loader];
 94                     if(obj["target"]&&obj["compontName"]&&obj["extClassName"]){
 95                         var cpName:String=obj["compontName"];
 96                         var extClassName:String=obj["extClassName"];
 97                         
 98                         allExternalClass[cpName]=loader;
 99                         
100                         var cl:Class=loader.GetClass(extClassName);
101                         var target:TAnnoPlugIn=obj["target"];
102                         if(cl!=null){
103                             //allExternalClass[cpName]=cl;
104                             var extObj:IPlugInInterface=createSWFClass(cl);
105                             if(extObj!=null){
106                                 target.extObj=extObj;
107                             }
108                         }
109                     }
110                     //loader.GetClass(
111                     //var target:TAnnoPlugIn=loadingQueue[loader];
112                 } 
113              }
114         }
115         
116         private function createSWFClass(cl:Class):IPlugInInterface{
117             var extObj:IPlugInInterface;
118             try{
119                 if(cl!=null){
120                     extObj=new cl();
121                 }
122                 
123             }catch(e:Error){
124                 return null;
125             }
126             return extObj;
127         }
128         
129         private function onProgress(evt:ProgressEvent):void{
130             
131         }
132         
133         private function onIOError(evt:IOError):void{
134             throw new Error("Load swf error:"+evt);
135         }
136     
137     }
138 }
View Code
  1 package com.tflash.Components.util
  2 {
  3     import flash.display.DisplayObject;
  4     import flash.display.Loader;
  5     import flash.display.LoaderInfo;
  6     import flash.events.Event;
  7     import flash.events.EventDispatcher;
  8     import flash.events.IEventDispatcher;
  9     import flash.events.IOErrorEvent;
 10     import flash.events.ProgressEvent;
 11     import flash.net.URLRequest;
 12     import flash.system.ApplicationDomain;
 13     import flash.system.LoaderContext;
 14     
 15     [Event(name="complete", type="flash.events.Event")]
 16     [Event(name="progress",type="flash.events.ProgressEvent")]
 17     [Event(name="io_error",type="flash.events.IOErrorEvent")]
 18     
 19     public class SWFLoader extends EventDispatcher
 20     {
 21         private var loader:Loader;
 22         private var content:DisplayObject;
 23         private var loadComplete:Boolean=false;
 24         private var url:String;
 25         public function SWFLoader(url:String)
 26         {
 27             this.url=url;
 28         
 29         }
 30         
 31         public function Load(url:String=null):void{
 32             if(url!=null){
 33                 this.url=url;
 34             }
 35             loadComplete=false;
 36             if(loader==null){
 37                 loader=new Loader();
 38             }else{
 39                 loader.unloadAndStop(true);
 40                 if(loader.contentLoaderInfo.hasEventListener(Event.COMPLETE)){
 41                     loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onLoadComplete);
 42                 }
 43                 if(loader.contentLoaderInfo.hasEventListener(ProgressEvent.PROGRESS)){
 44                     loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
 45                 }
 46                 if(loader.contentLoaderInfo.hasEventListener(IOErrorEvent.IO_ERROR)){
 47                     loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError)
 48                 }
 49             }
 50             
 51             var context:LoaderContext=new LoaderContext();
 52             context.applicationDomain=new ApplicationDomain(ApplicationDomain.currentDomain);
 53             var request:URLRequest=new URLRequest(this.url);
 54             loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);
 55             loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onLoadProgress);
 56             loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
 57             loader.load(request,context);
 58         }
 59         
 60     
 61         private function onLoadProgress(evt:ProgressEvent):void{
 62             
 63             this.dispatchEvent(evt);
 64         }
 65         
 66         private function onLoadComplete(evt:Event):void{
 67             evt.currentTarget.removeEventListener(Event.COMPLETE,onLoadComplete);
 68             evt.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
 69             evt.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
 70             content=(evt.currentTarget as LoaderInfo).content;
 71             loadComplete=true;
 72             this.dispatchEvent(new Event(Event.COMPLETE));
 73         
 74         }
 75         
 76         private function onLoadIOError(evt:IOErrorEvent):void{
 77             evt.currentTarget.removeEventListener(Event.COMPLETE,onLoadComplete);
 78             evt.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
 79             evt.currentTarget.removeEventListener(IOErrorEvent.IO_ERROR,onLoadIOError);
 80             
 81             this.dispatchEvent(evt);
 82         }
 83         
 84         
 85         /**
 86          * 获取当前ApplicationDomain内的类定义
 87          *
 88          * name类名称,必须包含完整的命名空间,如 Grave.Function.SWFLoader
 89          * info加载swf的LoadInfo,不指定则从当前域获取
 90          * return获取的类定义,如果不存在返回null
 91          */
 92         public function GetClass(name:String):Class{
 93 
 94             if(loadComplete&&loader!=null){
 95                 if(loader.contentLoaderInfo.applicationDomain.hasDefinition(name)){
 96                     return loader.contentLoaderInfo.applicationDomain.getDefinition(name) as Class;
 97                 }else{
 98                     return null;
 99                 }
100             }
101             return null;
102         }
103         
104         public function GetContent():DisplayObject{
105             return content;
106         }
107         
108         public function GetLoader():Loader{
109             
110             return loader;
111         }
112         
113     }
114 }

 

posted @ 2013-01-04 13:31  skybdemq  阅读(1488)  评论(0编辑  收藏  举报