在Flash中,有Loader类,可以从外部载入一张图片(或swf文件)。但是有个不好的地方就是,不像浏览器那样一边下载一边显示。
所幸的是,Flash提供了Loader.loadBytes方法和URLStream类。
首先,要使用URLStream类,而不是URLLoader。它们的区别就是URLLoader需要等到所有的数据下载完成之后,才能获取。而URLStream可以一边下载,一边就可以取到数据了。
其次,Loader.loadBytes,可以直接发送数据给Loader,而不是让Loader去下载。每一次loadBytes,Loader都会丢弃以前的数据,所以在代码中使用了_data的ByteArray保存数据。
代码如下:
package { import flash.display.Loader; import flash.display.Sprite; import flash.display.StageAlign; import flash.events.ContextMenuEvent; import flash.events.Event; import flash.net.URLRequest; import flash.net.URLStream; import flash.ui.ContextMenu; import flash.ui.ContextMenuItem; import flash.utils.ByteArray; import flash.utils.getTimer; public class Main extends Sprite { private var _loader:Loader = new Loader(); private var _urlstream:URLStream = new URLStream(); private var _data:ByteArray = new ByteArray(); public function Main():void { var loadmenu:ContextMenuItem = new ContextMenuItem("Load image"); loadmenu.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, this.onLoadImage, false); this.contextMenu = new ContextMenu(); this.contextMenu.customItems.push(loadmenu); _urlstream.addEventListener('progress', processData); _urlstream.addEventListener('complete', processData); addChild(_loader); stage.align = StageAlign.TOP_LEFT; } public function onLoadImage(e:Event):void { _loader.unload(); _data.length = 0; var url:String = "http://files.cnblogs.com/Greatest/test.jpg.zip"; _urlstream.load(new URLRequest(url + "?q=" + getTimer())) } public function processData(e:Event):void { var oldlen:int = _data.length; _urlstream.readBytes(_data, _data.length); if (_data.length > oldlen) { _loader.loadBytes(_data); } } } }
还可以参考这个封装:http://bbs.9ria.com/thread-150069-1-1.html