ステージにサムネイルを表示するAS3のクラスを作成しています。AS3のフラッシュイベントホッピングが混乱しています
私は、画像をアップロードしてビットマップにして最終的にステージに置くという一連のイベントを使用していますが、非常に混乱しています。
まず、私はユーザーにいくつかの画像を選択させる。 5枚の画像を言う。
//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がグローバル変数である
//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がこれを行う:私は、このように、それらをロードします。
これは、元のfor-loopが入る最深のステップです。
//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のまま:ループが行われた後、私はその後、bmpArrayの長さのトレースを行う場合、それは常に私がこれを行う場合、実際には0が表示されます。同じスクリプトを実行している15秒後に自動的に停止するため、Flashはデバッグを停止します。
ここでは何が起こっていますか?なぜbmpArrayは空のままですか?
プッシュ直後に配列の長さのトレースを作成しました。私はそれがコードのその部分に達し、実際の量に増加するのを見ました。だから、なぜループの後でそれは空ですか?
EDIT:問題の2つの配列がクラスレベルで宣言されています。関数の内部にはありません。スコープは問題ではありません。
public class Pictures extends Sprite {
...
private var numberFiles:Number;
private var bmpArray:Array = new Array();
+1素晴らしい、インデントされた&可読なソース(驚くほどまれです)。 – Marty
私は配列にbmpを追加した後にコールするコールバック関数でwhileループを置き換えます。 bitmapLoadHandler()にトレースを書き込んで、呼び出されたかどうかを確認します。 – pkyeck