读书人

狂言Loader.loadBytes[渐进式加载]

发布时间: 2012-10-09 10:21:45 作者: rapoo

大话Loader.loadBytes[渐进式加载]

第一话:加载Base64 encoded string
通过加载Base64 string创建图片。没错,就像你看到的,加载一个字符串也可以生成图片,当然不是说图片url是字符串(废话!),图片数据就在字符串中。
问题的关键是需要这么一个类Base64,它的converToByteArray方法可以把字符串转化为ByteArray,有了ByteArray数据,我们就可以生成图片了。

代码如下:
原文件出处:Loading Image using Loader.loadBytes()

//http://www.motobit.com/util/base64-decoder-encoder.asp//你可以在线把一张小图片转为base64 string,把字符串粘贴到这里赋值给变量str//过些天做个有输入框的实例,可以把你得到的字符串粘到里面,生成图片var str:String = "";var byteArr:ByteArray = Base64.converToByteArray(str);var loader:Loader = new Loader();loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);loader.loadBytes(byteArr);function onImageLoaded(e:Event):void{        addChild(loader);        trace(loader.width + " : " + loader.height);}

第二话:简单渐进式加载图片类ByteLoader
上面只是为了给大家开开眼界,不表。你可能会说“我的目的很简单,我只是要加载一张图片,用渐进的方式边加载边显示,我可不知道哪里有一串字符串让我去加载。”
嗯,来看看这个类吧,ByteLoader继承Loader类,使用方法跟Loader类一样简单。

var bl:ByteLoader = new ByteLoader();addChild(bl);bl.loadUrl("big.jpg");

原理是:

    用URLStream类去加载图片数据流,然后用帧循环stream.readBytes(data, data.length)将数据读入ByteArray中; 同时在帧循环中卸载Loader中旧的数据,加载新的数据super.unload();super.loadBytes(data);

代码如下:

package {import flash.events.EventDispatcher;import flash.events.ProgressEvent;import flash.events.Event;import flash.utils.ByteArray;import flash.net.URLStream;import flash.net.URLRequest;import flash.display.Loader;public class ByteLoader extends Loader{public var url:String;public var data:ByteArray;private var stream:URLStream;public function ByteLoader(url:String = ""){if(url != ""){loadUrl(url);}}//加载public function loadUrl(_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);addEventListener(Event.ENTER_FRAME,loaddata);}private function loaddata(e:Event):void{if (stream.bytesAvailable > 0){stream.readBytes(data, data.length);}if (data.length > 0){super.unload();super.loadBytes(data);}}//加载中private function progressFun(e:ProgressEvent):void{if(stream.bytesAvailable == 0) return;dispatchEvent(e);trace(e.bytesLoaded);}//加载完成private function completeFun(e:Event):void{stream.removeEventListener(Event.COMPLETE,completeFun);stream.removeEventListener(ProgressEvent.PROGRESS,progressFun);dispatchEvent(e);this.closeStream();}//清除数据public function closeStream():void{if (stream){if (stream.connected) stream.close();}if (hasEventListener(Event.ENTER_FRAME)){removeEventListener(Event.ENTER_FRAME, loaddata);}}}}

第三话:更周详的渐进式加载类ProgressiveLoader
原文件出处:ProgressiveLoader 渐进式加载图像
这个类,核心跟我上面那个ByteLoader类是一样的。只是这个类作了更多的考虑,也重写了父类Loader的几个方法。原文有个实例,大家可以去看看。
原代码,好长啊!自己下载吧。
Base64类也有得下载!

读书人网 >其他数据库

热点推荐