Actionscript 3 使用自定义LoaderInfo类的自定义AS3加载程序类?

Actionscript 3 使用自定义LoaderInfo类的自定义AS3加载程序类?,actionscript-3,Actionscript 3,这是一个关于创建自定义加载程序类作为后续操作的问题。如果这不是正确的方法,请告诉我 我有一个自定义装入器类和一个自定义装入器信息类。我不明白的是如何让Loader类使用自定义LoaderInfo类作为其contentLoaderInfo属性 package com.display { import flash.display.Loader; import com.display.CustomLoaderInfo; public class CustomLoader e

这是一个关于创建自定义加载程序类作为后续操作的问题。如果这不是正确的方法,请告诉我

我有一个自定义装入器类和一个自定义装入器信息类。我不明白的是如何让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使用它,我还不知道。

您必须重写创建loaderinfo实例的函数,该函数可能位于私有函数中。在新函数中,您可以将自定义loaderInfo类实例化,但您还必须执行Overwrited方法所做的任何其他操作。您可能会在loadinfo中遇到一些安全沙箱问题。通常,只有在编写函数时考虑到这一点,才可能重写这样的函数

或者,您可以使用prototype链()在运行时更改loaderInfo类。但我不推荐。在我看来,这不是一个好的做法

如果您让它起作用,您仍然存在一个问题,即您的自定义事件将无法处理任何属性不是从事件类继承的事件(如具有进度相关属性的ProgressEvent)

我认为你应该寻找另一种解决办法。 在您链接到您的问题中,您谈到了将movieclip与您的活动一起发送。你有没有想过要走另一条路?当您接收到事件时,您会得到一个对调度它的对象的引用(event.target)。你能不能不用那个参考来获取电影剪辑


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

我不知道它如何适合你正在做的事情,但你根本不必费心制作一个扩展的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
}

我需要这样的东西,因为我想携带一个包含信息的索引。。。ie-在触发事件后,可以使用类似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))
    }

}带标记的答案可能存在一个问题:如果contentLoaderInfo抛出IOError,则无法访问.loader属性以访问自定义加载器类

我所做的是: *在我的自定义加载程序类中,创建以下方法:

    public function requestError(event:Event):void {
        dispatchEvent(event);           
    }
为IOerror向contentLoaderInfo添加侦听器时,请指向自定义加载程序类的方法:

_loaderCls.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _loaderCls.requestError);
然后,将相同的侦听器添加到加载程序类中,并使其调用所需的任何方法。此时,event.target将是自定义加载程序类的event.target,您可以向该类添加所需的任何额外信息:

_loaderCls.addEventListener(IOErrorEvent.IO_ERROR, requestError);

或者,您可以做一件更好的事情,将数据传递到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;
        }
    }

}

这将不起作用,因为您无法子类化LoaderInfo,它将抛出
错误#2012:无法实例化CustomLoaderInfo类。