首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自定义LoaderInfo类的自定义AS3加载器类?

使用自定义LoaderInfo类的自定义AS3加载器类?
EN

Stack Overflow用户
提问于 2009-04-17 23:06:43
回答 5查看 6.3K关注 0票数 3

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

我有一个自定义的Loader类和一个自定义的LoaderInfo类。我不明白的是,如何让Loader类将自定义LoaderInfo类用作它的contentLoaderInfo属性。

代码语言:javascript
复制
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

代码语言:javascript
复制
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使用它,所以我还不知道。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-19 17:07:04

我不知道它如何适应您正在做的事情,但是您根本不会费心去做一个扩展的LoaderInfo。loader有一个名为Loader.contentLoaderInfo的属性,该属性将返回所使用的Loader (在本例中为CustomLoader)。理论上,您只需使用现有的CustomLoader类即可完成此操作:

代码语言:javascript
复制
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
}
票数 4
EN

Stack Overflow用户

发布于 2009-04-18 18:28:14

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

或者,您可以使用原型链(read here)在运行时更改loaderInfo类。但我不建议你这么做。在我看来,这不是一种好的做法。

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

我要说的是,你应该寻找另一个解决方案。在链接到您的问题中,您谈到了如何将电影剪辑与活动一起发送。你有没有想过要走另一条路?当您收到事件时,您将获得对调度它的对象的引用(Event.target)。你能不能不要用那个引用来获取电影剪辑?

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

票数 0
EN

Stack Overflow用户

发布于 2009-05-04 21:53:00

我需要这样的东西,因为我想携带一个包含信息的索引...ie -在触发事件后有像event.target.index这样的东西可用。无论如何,我设计了一个包含加载器和加载器信息的类。这是类

公共类LoaderBox扩展了Sprite {

代码语言:javascript
复制
   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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/762521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档