2011-10-11 71 views
0

我想知道是否可以實現任何邏輯以使圖像完成加載而不會凍結。flex 4 - 等待加載完成而不凍結

爲了我的應用程序,我創建了一個類,它在構造函數中使用圖像url,並使用「load()」函數加載mx.controls.Image。

見下

package com 
{ 
import flash.display.Loader; 
import flash.display.Sprite; 
import flash.events.*; 
//import flash.net.URLRequest; 

import mx.controls.Alert; 
import mx.controls.Image; 
//import mx.utils.OnDemandEventDispatcher; 

public class SpriteImage extends Sprite 
{ 
    //Pass the source path or url here. 
    private var imageUrl:String; 
    private var ready:int = -1; 
    private var img:Image; 

    public function SpriteImage(imgUrl:String) 
    { 
     //imageUrl = imgUrl; 
     loadImage(imgUrl); 
    } 
    private function loadImage(imgUrl:String):void 
    { 

     img = new Image(); 
     img.addEventListener(Event.COMPLETE,onCompleteHandler); 
     img.addEventListener(IOErrorEvent.IO_ERROR,onErrorHandler);  
     //img.source = imgUrl; 
     img.load(imgUrl); 

    } 

    private function onCompleteHandler(e:Event):void{ 

     img.x = -(img.width/2); 
     img.y = -(img.height/2); 
     this.addChild(img); 
     ready = 1; 
    } 

    private function onErrorHandler(e:IOErrorEvent):void 
    { 
     ready = 0; 
     //Alert.show("Can't load :" + e.toString()); 
    } 

    public function prepare():Boolean{ 

     while(ready == -1){ 
      trace(0); 
     }   
     return ready; 
    } 
} 

} 

類現在,我使用這個類從主應用程序像這樣

var img:SpriteImage = new SpriteImage(e.imageUrl); 
img.prepare(); // just waits till image is loaded but freezes 
var obj:DisplayObject = img; 

現在的問題是,應用從未出來的準備()方法。它凍結了瀏覽器,我不得不殺死插件進程來解凍應用程序。

這裏的主要標準是我需要等待圖像完成加載,以便我可以在接下來的步驟中訪問圖像。我怎樣才能做到這一點。?請幫助

+0

安東的答案是在正確的方向。 Flash得到正確的一件事是強制執行異步外部調用,這意味着一個**必須使用回調/事件偵聽器才能正確執行程序,這就是確保(或者至少鼓勵程序員以這種方式實現的方式) )UI將會響應。就我個人而言,我發現Doug Crockford在[Loopage](http://www.youtube.com/watch?v=6yn9HqtBW_U)上的演講對於啓發爲什麼這實際上是一件好事,而不僅僅是一個任意構思的模式,煩擾。 – merv

回答

1

在我看來,你正在創造凍結自己與while(ready == -1)爲什麼你不只是禁用用戶在你的「步驟」進一步去的能力,直到圖像被加載?

您不必同步等待圖像載入您現在的操作方式。一旦圖像被加載,你會得到它的加載程序分派的完整事件的通知。然後,您可以啓用取決於正在加載的圖像的任何內容。

一種簡單的方法是將應用程序中導航控件的啓用屬性的綁定到布爾屬性。例如,在您的SpriteImage中添加

[Bindable] public var isImageLoaded:Boolean = false; 

並且在調用onCompleteHandler後將其設置爲true。您可以綁定到該屬性的值。另一種方法是從你的類分派事件通知其他人的形象已加載,並且一些可能發生:]

大火

+0

你的代碼崩潰了我的flash構建器2次..請重新考慮你正在考慮我的回覆時想要做什麼的方式。 –

+0

感謝您的回覆Blaze。如果你看到處理程序(完整/ ioerror),我正在改變錯誤/完整的值,期待while循環條件在幾秒鐘內失敗,但它似乎不會。可能是Flash/Flex本身的限制。 (續...) –

+0

讓我給你看看我想要達到的目標。這個應用程序基本上是一個遊戲(類似於cityville),在這裏我有一個菜單來顯示玩家可以購買的所有物品。 momenent玩家選擇他想要的項目(步驟1)菜單被關閉(步驟2),並且所選擇的項目(比如房子,樹)圖像與鼠標一起移動(步驟3)並且玩家落下的時刻(步驟4 ,點擊可播放區域)將其添加到舞臺(步驟5)。 –

0

一個ProgressBar可以在某種程度上豐富您的UI,它不是你的時候凍結加載圖像。

看看Adobe docs for the ProgressBar control。標題爲的段落創建ProgressBar控件有一個示例,顯示如何在加載圖像時顯示ProgressBar