打印

[AS3] ActionScript 3.0 自写类整理笔记(二)——ByteLoader类

具体请关注http://www.xiaos8.com/?cat=19
原文章出至http://www.xiaos8.com/article.asp?id=89

该类的主要功能是把swf,jpg,png,gif等文件以字节的形式加载进来
以便于使用Loader.loadBytes方法,重复加载使用素材
如果图片格式为jpg,并且是渐进式格式jpeg,那么该类还可以帮助你边加载边显示

index.base.net.byteLoader类讲解:
基本功能按字节加载图片,swf等

构造函数
public function ByteLoader(url:String = "")
如果传入了参数url,则立即执行加载!

load  加载方法
public function load(_url:String):void
开始加载,_url是加载的地址

updata  更新数据方法
public function updata():void
更新缓冲区的可读字节

close  关闭方法
public function close():void
类使用完毕,清除所有无用的数据,也可以用来强行关闭数据流,停止下载

data  属性
public var data:ByteArray
返回加载的字节

url  属性
public var url:String
返回加载的url

isLoad  属性(只读)
public function get isLoad():Boolean
返回是否有数据在加载

ProgressEvent.PROGRESS  事件
加载的过程中调度,并附带加载情况

Event.COMPLETE  事件
加载完毕调度

例子:
复制内容到剪贴板
代码:
import index.base.net.ByteLoader;
var bl:ByteLoader = new ByteLoader;
bl.load("http://www.xiaos8.com/uploads/pro/50preso3a2.swf");
bl.addEventListener(Event.COMPLETE,completeFun);
bl.addEventListener(ProgressEvent.PROGRESS,progressFun);
function completeFun(e:Event):void{
    var loader:Loader = new Loader;
    loader.loadBytes(bl.data);
    addChild(loader);
    bl.removeEventListener(Event.COMPLETE,completeFun);
    bl.removeEventListener(ProgressEvent.PROGRESS,progressFun);
    bl.close();
    bl = null;
}
function progressFun(e:ProgressEvent):void{
    trace(e.bytesLoaded);
    //如果是渐进式格式的jpeg图片,那么在发布这个事件的时候读取字节,用Loader.loadBytes加载,就可以形成边加载边显示
}
源代码:
复制内容到剪贴板
代码:
package index.base.net{
    
    import flash.events.EventDispatcher;
    import flash.events.ProgressEvent;
    import flash.events.Event;
    import flash.utils.ByteArray;
    import flash.net.URLStream;
    import flash.net.URLRequest;
    
    public class ByteLoader extends EventDispatcher{
        
        public var url:String;
        public var data:ByteArray;
        private var stream:URLStream;
        
        public function ByteLoader(url:String = ""){
            if(url != ""){
                load(url);
            }
        }
        
        //加载
        public function load(_url:String):void{
            url = _url;
            data = new ByteArray;
            stream = new URLStream;
            stream.load(new URLRequest(url));
            stream.addEventListener(Event.COMPLETE,completeFun);
            stream.addEventListener(ProgressEvent.PROGRESS,progressFun);
        }
        
        //加载中
        private function progressFun(e:ProgressEvent):void{
            if(stream.bytesAvailable == 0) return;
            updata();
            dispatchEvent(e);
        }
        
        //加载完成
        private function completeFun(e:Event):void{
            stream.removeEventListener(Event.COMPLETE,completeFun);
            stream.removeEventListener(ProgressEvent.PROGRESS,progressFun);
            updata();
            if(isLoad) stream.close();
            dispatchEvent(e);
        }
        
        //更新数据
        public function updata():void{
            if(isLoad) stream.readBytes(data,data.length);
        }
        
        //清除数据
        public function close():void{
            if(isLoad) stream.close();
            stream = null;
            data = null;
        }
        
        //获取是否有数据在加载
        public function get isLoad():Boolean{
            if(stream == null) return false;
            return stream.connected;
        }
    }
}
[ 本帖最后由 iamsun1550 于 2008-4-1 23:38 编辑 ]
www.xiaos8.com
支持下 ~~
问下为什么不用URLLoader  而用URLStream呢
前者也可以下载二进制数据

"URLStream 类提供对下载 URL 的低级访问"...
你可以尝试用URLLoader实现一下这个类的方法和属性
你会发现,URLLoader是无法强行终止下载的,它会直到下载完毕,并且发布下载完成事件
但是用URLStream它可以终止下载
另外URLStream可以做到加载多少应用多少,不像URLLoader要等待东西加载完了才能使用
这是官方帮助文档的原话:
引用:
数据一下载,便可随即为 ActionScript 使用,这和使用 URLLoader 时需要等到整个文件下载完不同。 并且 URLStream 类还允许在完成下载前关闭流。 已下载文件的内容将作为原始二进制数据提供。
另外还有几个我没去考证的可能:
URLStream和URLLoader的加载速度对比,有可能URLStream会比URLLoader快,这个有高手可以给我确切答案吗?
www.xiaos8.com
纠正一个错误,这个帖子的名字应该是
ActionScript 3.0 自写类整理笔记(三)——ByteLoader类
这是第三篇笔记了。。可惜蓝色发帖1小时后,就无法修改文章了。。。
www.xiaos8.com

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
蓝色帖子好像随时都可以更改啊~~没这个问题

TOP

不行啊。。。你发帖一个,第二天你在来试试看?

它会提示你:对不起,您的帖子从发表到现在已超过 60 分钟,不能再进行编辑,请返回。
www.xiaos8.com

TOP

不错。3。0的确给我们带来好多新的东西。
antflash.com  蚂蚁-博客

TOP

问题

1 URLLoader、Loader无法真正关闭下载么?URLStream,在关闭下载后,能不能真正腾出下载线程?
2 用楼主的ByteLoader(实际为URLStream),在效率上会比Loader低么?低多少?

ps,原以为会用到各种encoder,原来用Loader.loadBytes()就行

TOP