2010-08-17 35 views
1

嘿,我有點新AS3,但我一直在儘可能學習和閱讀LiveDocumentation,但我無法克服這個問題:加載器中圖像的混亂屬性

有一個加載程序,我用不同的圖像填充取決於點擊的按鈕。現在保持整潔,我使用完全相同的裝載機。問題是不管我對圖像做什麼,下一個加載的圖像總是得到前一個圖像的屬性。我已經使用卸載並且Loader在寬度和高度上返回0,並且下一個圖像仍然是之前圖像的W/H。其他嘗試將它從父容器中分離出來並將其從顯示列表中取出,並且還使用Event.UNLOAD確保在加載新圖像之前先前的圖像已經不存在。

Script是內[114]有點長,但基本是這些,

BrowserLoad.unload(); 
BrowserReq = new URLRequest("ImageB.jpg"); 
BrowserLoad.load(BrowserReq); 

BrowserLoad.contentLoaderInfo.addEventListener(Event.COMPLETE, Resize); 

function Resize (event:Event):void { 
/* 
And here a big bunch of resizing and scaling of the image loaded that i need to do, is this what's provokin' the later unwanted resizeings!? 
*/ 
} 

我想這是一般的問題:我如何能確保被前面的加載器加載圖像不會影響到下一個未來? (其寬度和高度爲0還不夠...)

+0

我建議你粘貼調整大小功能的代碼。 – 2010-08-17 02:24:20

回答

2

我一直覺得AS3中Loader對象的存在是一個不幸的設計決定,加載器也是這樣的事實顯示對象導致很多混亂。這是對發生了什麼事情的低調。

Loader對象不是您加載的資產,在這種情況下是位圖圖像,而是一個將您的資產加載爲子DisplayObject的容器。因此,當您將轉換應用於加載器時,例如:高度或寬度,則不會修改已加載資源的轉換,而是其父容器,Loader實例。因此,如果您更改已加載資產,即:卸載並加載新資產,那些轉換仍然存在。

作爲我自己代碼中的一項規則,我從不使用Loader對象作爲DisplayObject,並嚴格使用它們來加載外部內容。一旦資產被加載,你可以直接通過裝載機「內容」屬性得到引用它像這樣:

myLoader.content 

,然後使用它,無論你想,它直接添加到顯示列表。

如果您想使用顯示器的裝載機,可以重置所有變換,像這樣:

myLoader.transform.matrix = new Matrix(); 

希望幫助,

+0

+1。一個很好的解釋。雖然我不同意裝載機作爲顯示對象是一個壞主意。有時候它非常有用(例如,如果圖像沒有加載,如果您不想顯示預加載或太多照顧,則只需adChild加載程序,如果需要則設置「x」和「y」,繼續;如果load()返回一個DPO,這會更好,所以你可以在一行中做到這一點)。如果您不允許訪問內容(如在,無跨域),則裝載程序也可以提供幫助。這可能有不同的解決方法,但我認爲這很簡單。 – 2010-08-17 02:44:04

0

如果需要,使這個靜態類,在BrowserLoad類,而是執行此

public static function loadImage(url:String):void 
    { 
     var loader:Loader = new Loader(); 
     var info:LoaderInfo = loader.contentLoaderInfo; 

     //add your event listeners here, just adding one for now... 
     info.addEventListener(Event.COMPLETE , completeHandler); 

     var request:URLRequest = new URLRequest(url ); 
     loader.load(request , new LoaderContext(true)); 

    } 

正如泰勒Egeto建議,您的轉化應用到內容:

public function completeHandler(event:Event):void 
{ 
    var content:DisplayObject = event.currentTarget.content; 
    } 

我認爲這個解決方案實際上會保持整潔,加載器實例嚴格用於加載您的內容,如果您需要在completeHandler之外操作您的內容,您仍然有一些可用的解決方案實例將您的圖像存儲在陣列或位圖或DisplayObject的矢量中。這樣可以避免Loader屬性與加載內容屬性之間的混淆。