2011-08-10 38 views
1

我在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(); 
+0

對於漂亮,縮進和可讀的來源+1(令人驚訝的是很少見)。 – Marty

+0

我會用一個回調函數替換while循環,在將一個bmp添加到數組之後調用該函數。並將跟蹤放入bitmapLoadHandler()以檢查它是否被調用... – pkyeck

回答

0

你不能訪問一個變量(從功能以外)已宣佈在函數中。請與variable scope聯繫。

+0

bmpArray是一個全局變量,不是本地變量。 bmpArray和numberFiles都是在類級別定義的,而不是在使用它們的函數內部定義的。這是在我的文章中提到的。 – KdgDev

+0

我不知道..「你在哪裏提到這個帖子」。我在說你不能訪問已經在函數內聲明的全局** var ** @。 – Benny

+0

它沒有在函數內部聲明。它已經在課堂上申報。 – KdgDev

0

難道是,您在發送異步任務後忙着等待嗎?你知道閃存是單線程的。也許忙碌的等待阻止了事件的處理?

爲什麼你不在處理器方法中做痕跡?