自定义AS3 Loader类使用自定义LoaderInfo类?

时间:2009-04-17 23:06:43

标签: actionscript-3

这是一个特别关于创建自定义Loader类作为How do I modify existing AS3 events so that I can pass data?的后续内容的问题。如果这不是解决这个问题的正确方法,请告诉我。

我有一个自定义的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使用它,我还不知道。

5 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

您必须覆盖创建loaderinfo实例的函数,该函数可能位于私有函数中。在新函数中,您可以改为实现自定义loaderInfo类,但您还必须执行覆盖方法所做的任何其他操作。您也可能遇到loadinfo的一些安全沙箱问题。覆盖这样的函数通常只有在记住这个函数时才能生成。

或者,您可以使用原型链(read here)在运行时更改loaderInfo类。但我不推荐它。在我看来,这不是一个好习惯。

如果你让它工作,你仍然会遇到这样的问题:你的自定义事件不能用于任何具有不从Event类继承的属性的事件(比如具有进度相关属性的ProgressEvent)。

我会说你应该找另一个解决方案。 在您链接到的问题中,您可以与您的活动一起发送movieclip。你有没有想过要走另一条路?当您收到事件时,您将获得对其分派的对象的引用(Event.target)。你能否使用该引用来获取movieclip?

也许您可以更详细地解释您的问题(也许在一个新问题中,所以您仍然保持开放状态),我相信有更好/更简单的方法来解决它。

答案 2 :(得分:0)

我需要这样的东西因为我想带一个带有信息的索引...即 - 在事件被触发后有类似event.target.index的东西..无论如何我设计了一个包含加载器的类和装载机信息...继承人类

public class 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))
    }

}

答案 3 :(得分:0)

标记答案的潜在问题:如果contentLoaderInfo吐出IOError,则无法访问.loader属性来访问自定义装入程序类。

我做的是以下内容: *在我的自定义装入程序类中,创建以下方法:

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

为IOerror添加一个监听器给contentLoaderInfo时,指向自定义加载器类的方法:

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

然后,将相同的侦听器添加到您的loader类中,并使其调用您需要的任何方法。此时,event.target将是您的自定义加载器类的,并且您可以向该类添加所需的任何额外信息:

_loaderCls.addEventListener(IOErrorEvent.IO_ERROR, requestError);

答案 4 :(得分:0)