|
源代码网推荐
主要用途:
1、在用flash做项目的时候,把一些元件,通过设置链接类,然后使用这个类,通过getClass方法即可把这个素材拿下来

图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:

这是一个虚拟人物形象的动作包,其中包含了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: 将设我有一个类库,有这么三个类
import index.base.net.ByteLoader; import index.base.net.ClassLoader; import index.base.geom.Dot;
var bl:ByteLoader; var cl:ClassLoader; var dot:Dot;
然后把它编译成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; } } }
源代码网供稿. |