我正在制作一个简单的工具,让用户最终将图像保存到磁盘。为此,我使用了FileStream
类及其writeBytes()
方法。
这工作得很好。当我尝试使用简单的mx:ProgressBar
. 我尝试了一些方法,但似乎都没有奏效。
这是 ActionScript 的一段代码:
private function save(file:File, image:MyImageClass):void {
var data:BitmapData = new BitmapData(width, height, true, 0x000000);
image.draw(data, _cols);
var bytes:ByteArray = new PNGEncoder().encode(data);
fileStream = new FileStream();
fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, onProgress);
fileStream.addEventListener(Event.CLOSE, onClose);
try {
fileStream.openAsync(file, FileMode.WRITE);
fileStream.writeBytes(bytes);
} catch (e:Error) {
Alert.show("Error trying to save the image: " + e.message);
} finally {
fileStream.close();
}
}
private function onProgress(event:OutputProgressEvent):void {
var progressRatio:Number = (1 - (event.bytesPending / event.bytesTotal));
progressBar.setProgress(progressRatio, 1);
trace(progressRatio);
if (event.bytesPending == 0)
event.target.close();
}
private function onClose(event:Event):void {
trace("closed");
}
以及进度条的 mxml:
<mx:ProgressBar id="progressBar" mode="manual"/>
执行这个我得到了一个冻结的界面,当文件完全保存时释放,在控制台上我同时得到所有的痕迹。进度条保持在 0%,直到界面解冻并变为 100%。
我知道 Flash 是单线程的,但我认为该FileStream.openAsync()
方法应该做一些脏活来让我的接口负责。完成这个简单且(我认为)常见的任务应该不难。
问题是:我做错了什么?
提前致谢