2009-04-17 136 views
3

這是一個關於創建自定義裝載程序類的問題,作爲How do I modify existing AS3 events so that I can pass data?的後續操作。如果這不是解決這個問題的正確方法,請告訴我。使用自定義LoaderInfo類的自定義AS3 Loader類?

我有一個自定義的Loader類和一個自定義的LoaderInfo類。我無法弄清楚的是如何讓Loader類使用自定義LoaderInfo類,因爲它的contentLoaderInfo屬性。

package com.display { 
    import flash.display.Loader; 

    import com.display.CustomLoaderInfo; 

    public class CustomLoader extends Loader { 
     public var customData:*; 

     public function CustomLoader(passedData: *= null) { 
      customData = passedData; 
     } 
    } 
} 

^要做的東西在裏面,使之具有新的CustomLoaderInfo

package com.display { 
    import flash.display.LoaderInfo;  
    import flash.events.Event; 

    import com.events.CustomEvent; 

    public class CustomLoaderInfo extends LoaderInfo { 
     public var customData:*; 

     public function CustomLoaderInfo(passedData: *= null) { 
      customData = passedData; 
     }  

     override public function dispatchEvent(event:Event):Boolean { 
      var customEvent:CustomEvent = new CustomEvent(event.type, customData, event.bubbles, event.cancelable); 
      return super.dispatchEvent(customEvent); 
     } 
    } 
} 

^可能的工作,但因爲我不能讓CustomLoader使用它,我不知道然而。

+0

這將無法正常工作,因爲您無法繼承LoaderInfo,它會拋出錯誤#2012:CustomLoaderInfo類無法實例化。 – Wernight 2014-01-13 15:35:48

回答

4

我不知道它如何適合你在做什麼,但你根本無法制作一個擴展的LoaderInfo。 Loader.contentLoaderInfo有一個名爲loader的屬性,它將返回使用的Loader(或本例中爲CustomLoader)。理論上你可以做到這一點跟你有CustomLoader類:


var loader: CustomLoader = new CustomLoader("Extra Data"); 
loader.load(new URLRequest("file.swf")); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderComplete); 

function loaderComplete(event: Event) : void 
{ 
    var customData:* = (event.target.loader as CustomLoader).customData; 
    trace(customData); // Extra Data 
} 
0

您將不得不重寫創建loaderinfo實例的函數,該函數可能位於私有函數中。在新函數中,您可以實例化您的自定義loaderInfo類,但是您也必須執行覆蓋的方法所做的任何其他操作。您也可能會遇到一些loadinfo安全沙箱問題。覆蓋這樣的函數通常只有在寫出這個函數時纔是可行的。

或者,您可以使用原型鏈(read here)在運行時更改loaderInfo類。但我不會推薦它。我認爲這不是一個好習慣。

如果你得到這個工作,你仍然有問題,你的自定義事件不適用於任何具有不是從Event類繼承的屬性的事件(如ProgressEvent具有與進度相關的屬性)。

我會說你應該尋找另一種解決方案。 在鏈接到您的問題中,您將討論如何向您的活動發送影片剪輯。你有沒有想過達到另一種方式?當你收到事件時,你會得到一個指向它的對象的引用(Event.target)。你不能使用該參考來獲取動畫片段嗎?

也許你可以更詳細地解釋你的問題(也許在一個新的問題,所以你仍然保持這個開放),我相信有一個更好/更簡單的方法來解決它。

0

我需要的是這樣的,因爲我想攜帶的指數與信息...也就是 - 有這樣的事event.target.index可用事件被觸發後..反正我設計了包含裝載機和裝載機信息類...繼承人的類

公共類LoaderBox擴展Sprite {

public static var PROGRESS:String = "progress" 
    public static var COMPLETE:String = "complete" 

    public var id:int 
    public var index:int 
    public var loader:Loader 
    public var info:LoaderInfo 
    public var isOpen:Boolean 
    // 
    public var percent:Number = -1 

    public function load(path:String,idx:int=-1,nm:String=null){ 
     loader = new Loader() 
     if (nm != null){ 
      name = nm 
     } 
     index = idx 
     var req:URLRequest = new URLRequest(path) 
     info = loader.contentLoaderInfo 
     info.addEventListener(Event.COMPLETE,complete) 
     info.addEventListener(ProgressEvent.PROGRESS,progress) 
     isOpen = true 
     loader.load(req) 
    } 
    private function complete(e:Event):void{ 
     isOpen = false 
     dispatchEvent(new Event(LoaderBox.COMPLETE)) 
    } 
    private function progress(e:ProgressEvent):void{ 
     if (e.target.bytesTotal>0){ 
      percent = Math.floor(e.target.bytesLoaded/e.target.bytesTotal * 100) 
     } 
     dispatchEvent(new Event(LoaderBox.PROGRESS)) 
    } 

}

0

帶標記答案的潛在問題:如果contentLoaderInfo吐出IOError,則無法訪問.loader屬性以訪問您的自定義加載程序類。

我所做的是以下幾點: *在我的自定義loader類,創建以下方法:

public function requestError(event:Event):void { 
     dispatchEvent(event);   
    } 

添加監聽到的contentLoaderInfo爲ioError在,指向自定義的加載類的方法:

_loaderCls.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _loaderCls.requestError); 

然後,將相同的偵聽器添加到您的加載器類,並使其調用您需要的任何方法。在這一點上,event.target將是您的自定義類加載器的,你可以添加你需要的那類的任何額外的信息:

_loaderCls.addEventListener(IOErrorEvent.IO_ERROR, requestError); 
0

或者你可以做一個更好的事情將數據傳遞到Loader類:


package com.display 
{ 
    import flash.display.Loader; 

    public class Loader extends flash.display.Loader 
    { 
     private var _obj:Object; 

     public function Loader():void 
     { 
      super(); 
     } 

     public function get obj():Object 
     { 
      return _obj; 
     } 

     public function set obj(o:Object):void 
     { 
      _obj = o; 
     } 
    } 

}