我在AS3上寫了一個類,它將在舞臺上顯示一些縮略圖。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-loop將會進入的最深的一步。如果我那麼做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(令人驚訝的是很少見)。 – Marty
我會用一個回調函數替換while循環,在將一個bmp添加到數組之後調用該函數。並將跟蹤放入bitmapLoadHandler()以檢查它是否被調用... – pkyeck