• 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 }
  • 相关阅读:
    Bitstream or PCM?
    centos7安装Redis-3.2.8
    【生肉】【不义联盟
    ES6中Map数据结构学习笔记
    机器学习基石入门
    2019/5/9 长难句
    文件遍历选取脚本
    [JS奇怪的世界]No.55 危險小叮嚀:陣列與for in
    OpenGL Panorama Player
    吴裕雄--天生自然MySQL学习笔记:MySQL 连接
  • 原文地址:https://www.cnblogs.com/skybdemq/p/2844029.html
Copyright © 2020-2023  润新知