当前位置: 主页 > 平面设计 > Flash AS3教程:ClassLoader类

Flash AS3教程:ClassLoader类

  • 2022-02-04
  • 来源/作者: PS.ONEGREEN.ORG    / 佚名    
  • 2 次浏览

  主要用途:

  1、在用flash做项目的时候,把一些元件,通过设置链接类,然后使用这个类,通过getClass方法即可把这个素材拿下来

Flash AS3教程:ClassLoader类

  图1(详见例1)

  2、将许多许多的类分库到不同的swf中,然后通过调用swf,达到调用类库的功能,然后通过getClass来获取类(详见例2)

  index.base.net.ClassLoader类讲解:

  加载swf文件,并且通过调用getClass获取类,也可以获取命名空间或者函数的定义

  构造函数

  public function ClassLoader(obj:Object = null,lc:LoaderContext = null)

  参数1可以是字符串,可以是ByteArray,如果为前者则采用load方法,后者采用loadBytes方法

  参数2是创建带有指定 LoaderContext 对象的ClassLoader实例,LoaderContext 可以设置是否加载跨域文件,应用程序域等,详见官方LoaderContext类讲解!

  load 方法

  public function load(_url:String,lc:LoaderContext = null):void

  加载文件

  参数1是加载地址,参数2见构造函数

  loadBytes 方法

  public function loadBytes(bytes:ByteArray,lc:LoaderContext = null):void

  加载字节文件

  参数1是字节数据,参数2见构造函数

  getClass 方法

  public function getClass(className:String):Object

  获取一个公共定义,可以是类,也可以是命名空间或者函数定义

  参数1是获取class的完整包加类名,比如我们的这个类完整定义名称是 index.base.net.ClassLoader

  详见例子

  hasClass 方法

  public function hasClass(className:String):Boolean

  返回是否含有该公共定义

  参数1见getClass方法

  clear 方法

  public function clear():void

  清空

  url 属性

  public var url:String

  获取url属性

  loader 属性

  public var loader:Loader

  获取loader属性

  例子1:

Flash AS3教程:ClassLoader类

  图2

  这是一个虚拟人物形象的动作包,其中包含了8种不同的动作

  在使用ClassLoader加载这个swf的动作包后,即可使用getClass来调用这些素材,而且可以重复的new这些元件,来达到多次重复使用

import index.base.net.ClassLoader;
  
var cl:ClassLoader = new ClassLoader;
cl.load("main.swf");
  
cl.addEventListener(Event.COMPLETE,fun);
  
function fun(e:Event){
 var tmp = cl.getClass("drag");
 addChild(new tmp); 
}

  例子2:

  将设我有一个类库,有这么三个类

  然后把它编译成swf

  我们另外建一个文件,来加载这个所谓的类库

import index.base.net.ClassLoader;
  
var cl:ClassLoader = new ClassLoader;
cl.load("main.swf");
  
cl.addEventListener(Event.COMPLETE,fun);
  
function fun(e:Event){
 var tmp1 = cl.getClass("index.base.net.ByteLoader");
 trace(tmp1)
 
 var tmp2 = cl.getClass("index.base.net.ClassLoader");
 trace(tmp2)
 
 var tmp3 = cl.getClass("index.base.geom.Dot");
 trace(tmp3)
}
  
/**
* trace的结果:
* [class ByteLoader]
* [class ClassLoader]
* [class Dot]
*/

  我们的目的就达到了!

  接下来是源代码!

package index.base.net{
 
 import flash.display.Loader;
 import flash.net.URLRequest;
 import flash.utils.ByteArray;
 import flash.events.Event;
 import flash.events.ProgressEvent;
 import flash.events.EventDispatcher;
 import flash.system.LoaderContext;
 
 public class ClassLoader extends EventDispatcher{
  
  public var url:String;
  public var loader:Loader;
  
  //构造函数
  public function ClassLoader(obj:Object = null,lc:LoaderContext = null) {
   if(obj != null){
    if(obj is ByteArray){
     loadBytes(obj as ByteArray,lc);
    }else if(obj is String){
     load(obj as String,lc);
    }else{
     throw new Error("参数错误,构造函数第一参数只接受ByteArray或String");
    }
   }
  }
  
  //加载
  public function load(_url:String,lc:LoaderContext = null):void{
   url = _url;
   loader = new Loader;
   loader.load(new URLRequest(url),lc);
   addEvent();
  }
  
  //加载字节
  public function loadBytes(bytes:ByteArray,lc:LoaderContext = null):void{
   loader = new Loader;
   loader.loadBytes(bytes,lc);
   addEvent();
  }
  
  //开始侦听
  private function addEvent():void{
   loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,progressFun);
   loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeFun);
  }
  
  //结束侦听
  private function delEvent():void{
   loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,progressFun);
   loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,completeFun);
  }
  
  //加载成功,发布成功事件
  private function completeFun(e:Event):void {
   delEvent();
   dispatchEvent(e);
  }
  
  //加载过程
  private function progressFun(e:ProgressEvent):void{
   dispatchEvent(e);
  }
  
  //获取定义
  public function getClass(className:String):Object {
   return loader.contentLoaderInfo.applicationDomain.getDefinition(className);
  }
  
  //是否含有该定义
  public function hasClass(className:String):Boolean {
   return loader.contentLoaderInfo.applicationDomain.hasDefinition(className);
  }
  
  //清除
  public function clear():void{
   loader.unload();
   loader = null;
  }
 }
}