中文ActionScript社区

首页 » 中文ActionScript分享社区 » ActionScript交流区 » ActionScript 3.0 自写类整理笔记(四)——ClassLoader类
iamsun1550 - 2008-4-18 12:03:00
具体请关注http://www.xiaos8.com/?cat=19
原文章出至http://www.xiaos8.com/article.asp?id=90


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

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;
                }
        }
}


1
查看完整版本: ActionScript 3.0 自写类整理笔记(四)——ClassLoader类