【发布时间】:2011-10-23 18:00:51
【问题描述】:
我正在用 AS3 编写一个类,它将在舞台上显示一些缩略图。
我正在使用一堆事件来上传图像并将它们制作成位图并最终将它们放在舞台上,但这变得非常非常混乱。
首先,我让用户选择几张图片。说 5 张图片。然后我加载它们,如下所示:
//Files in an array to use in loop
var files:Array = imgList.fileList;
numberFiles = imgList.fileList.length;
//Have all files be locally encoded
//for-in loop gives too much headaches
for(var i:Number = 0; i<numberFiles; i++){
var fileRef:FileReference = files[i];
fileRef.addEventListener(Event.COMPLETE, imageLoadHandler);
fileRef.load();
}
imageLoadHandler 这样做:
//Turn the image in to a bitmap.
private function imageLoadHandler(evt:Event):void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, bitmapLoadHandler);
loader.loadBytes(evt.target.data);//security issue
}
最后,这个:
//have the bitmap configured with width and height and scaling.
private function bitmapLoadHandler(evt:Event):void {
var bmp:Bitmap = Bitmap(evt.target.content);
//width, height and scaling
bmp.width = THUMBWIDTH;
bmp.height = THUMBHEIGHT;
bmp.scaleX < bmp.scaleY ? bmp.scaleY = bmp.scaleX : bmp.scaleX = bmp.scaleY;
//push the image on to an array
bmpArray.push(bmp);
}
bmpArray 是一个全局变量。
所以这是原始 for 循环将进入的最深一步。如果我在循环完成后跟踪 bmpArray 的长度,它将始终显示 0。事实上,如果我这样做:
//Wait for bmpArray to be filled.
var arrayIsFull:Boolean = false;
while(!arrayIsFull) {
trace(bmpArray.length);
trace(numberFiles);
if(bmpArray.length == numberFiles) {
arrayIsFull = true;
}
}
然后 bmpArray 永远保持为 0。 Flash 停止调试,因为在同一脚本运行 15 秒后它会自动停止。
这里发生了什么?为什么 bmpArray 一直是空的?
我已经在推送后立即跟踪了数组的长度。我已经看到它到达了代码的那一部分并增加到实际数量。那为什么循环后是空的呢?
编辑:有问题的 2 个数组已在类级别声明。不在函数内部。范围不应该是问题:
public class Pictures extends Sprite {
...
private var numberFiles:Number;
private var bmpArray:Array = new Array();
【问题讨论】:
-
+1 表示漂亮、缩进和可读的源代码(非常罕见)。
-
我会将 while 循环替换为您在将 bmp 添加到数组后调用的回调函数。并将跟踪放入 bitmapLoadHandler() 以检查它是否被调用...
标签: flash actionscript-3 flash-cs5