【问题标题】:AS3 flash event hopping confusing meAS3 flash 事件跳跃让我感到困惑
【发布时间】: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


【解决方案1】:

可能是,您在发送异步任务后忙于等待?你知道flash是单线程的。也许忙碌的等待阻止了事件的处理?

为什么不在处理程序方法中进行跟踪?

【讨论】:

    【解决方案2】:

    您不能访问已在函数内部声明的变量(从函数外部)。请与variable scope联系。

    【讨论】:

    • bmpArray 是一个全局变量,而不是局部变量。 bmpArray 和 numberFiles 都是在类级别定义的,而不是在使用它们的函数内部。这在我的帖子中提到。
    • 我不知道..“你在哪里提到过这篇文章”。我是说您无法访问已在函数内部声明的全局 var @ 外部。
    • 函数内部没有声明。它已在类级别声明。
    • 对不起...如果我让你生气了。我认为你需要 dispatchEvent 的帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多