2013-01-20 89 views
1

我知道圖像要在AS3中異步加載,並且應該使用事件和事件監聽器來處理該同步。在AS3中加載異步映像

因此,在簡單的情況下,它應該是這樣的:

var loader : Loader = new Loader(); 
var im_file: URLRequest = new URLRequest ("imfile.png"); 
loader.load(im_file); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loading_complete); 

function loading_complete (e : Event) : void 
{ // ... do smt with your loaded data // } 

我想要做的是有一個預加載類,可以加載我事先需要的所有圖像。 在這種情況下,如何讓所有其他類知道加載何時完成?

我要派遣活動嗎?這種情況下的最佳做法是什麼?

由於提前,

Praskaton

回答

1

最有可能你想創建一個隊列,並添加您的圖像路徑到隊列中。然後,在完成每個圖像加載後,您繼續到隊列中的下一個項目。當所有的圖像都加載完畢後,你會發送一個COMPLETE事件或類似的東西,讓你的應用程序知道它已經全部完成了。

檢查QueueLoaderCasalib他們如何實現單個或批量圖像加載。

+2

另外,GreenSock's'LoaderMax'和'BulkLoader'處理這個非常好了。 –

+0

是的,很好的建議。 – Boon

0

添加到@Boon提供的答案,這是如何去實際設置圖像隊列。

首先,您需要一個列表來存儲所有仍然需要加載的圖像。這使得您可以輕鬆定義任意數量的圖像。它可以是「排隊」:

var queue:Array = [ 
    "http://interfacelift.com/wallpaper/previews/[email protected]", 
    "http://interfacelift.com/wallpaper/previews/[email protected]", 
    "http://interfacelift.com/wallpaper/previews/[email protected]" 
]; 

接下來要做的是建立我所說的,我們在做什麼「核心」方法。它將處理加載下一張圖片,並在隊列爲空時通知我們。它看起來是這樣的:

function loadNext():void 
{ 
    if(queue.length > 0) 
    { 
     // Notice here that we use .pop() on the queue, which will select and 
     // remove the last item from queue. 
     var req:URLRequest = new URLRequest(queue.pop()); 
     var photo:Loader = new Loader(); 

     photo.load(req); 
     photo.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
    } 
    else 
    { 
     // The queue is finished - dispatch an event or whatever you fancy to 
     // let the rest of the application know we're done here. 
     trace("Queue finished."); 
    } 
} 

然後,當然我們的偵聽器函數來處理加載的圖像的完成。請注意,我們稱loadNext() - 這是在當前加載的圖像完成後纔開始加載隊列中下一個圖像的關鍵。

function loadComplete(e:Event):void 
{ 
    addChild(e.target.content as Bitmap); 


    // Begin loading next image in the queue. 
    loadNext(); 
} 

,並開始我們當然只是使用此過程中,這將可以立即通知我們,隊列結束,如果它是空的,或者在啓動順序加載圖像。

// Start loading the queue. 
loadNext(); 

附加/整理:

如果你希望能夠回收這些代碼或只是收拾一下,你可以很容易地使這個成爲一個類。該類可稱爲ImageQueue,其結構將包含上述queue數組,loadNext()方法和loadComplete()方法。它也可以有一個add()方法用於以更簡潔的方式將圖像添加到隊列中。

這裏是一個類,如果你有興趣,你可以完事的基礎:

public class ImageQueue 
{ 

    private var _queue:Array = []; 

    public function add(image:String):void{ } 
    public function loadNext():void{ } 

    private function _loadComplete(e:Event):void{ } 

}