progressEvent Listener问题

时间:2011-09-26 12:04:09

标签: actionscript-3

for (i=0; i < _xmlContents.img_array.length; i++)
{
        _loader = new Loader();
    _loader.name = "image"+i;       
    _loader.load(new URLRequest(_xmlContents.img_array[i]));
    _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadingAction);
    //Event.COMPLETE listnere
       //error Handler
}
private function onLoadingAction(e:ProgressEvent):void
{
    _preLoader = new Preloader();
    //addChild(_preLoader);
    trace(_loader.name);
}

我想为xml中的每个图像添加预加载器。现在我只能获得最后一张图片。 (考虑如果xml长度为5,它将仅跟踪image4)

我该如何添加?

5 个答案:

答案 0 :(得分:0)

这是因为你有一个_loader对象。在每个循环步骤中,您用新的加载器覆盖此加载器,以便先前的图像停止加载。您应该为每个图像使用新的加载器:

for (i=0; i < _xmlContents.img_array.length; i++)
{
    // create new loader instance, not use a global one
    var _loader:Loader = new Loader();
    _loader.name = "image"+i; 
    _loader.load(new URLRequest(_xmlContents.img_array[i]));
    _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadingAction);
    //Event.COMPLETE listnere
    //error Handler

    _preLoader = new Preloader();
    //addChild(_preLoader);
}
private function onLoadingAction(e:ProgressEvent):void
{
    // trace(e.bytesLoaded, e.bytesTotal);

}

答案 1 :(得分:0)

我不认为数组是必要的,我认为你会通过从Event.INIT调用它来添加4个预加载器实例,而不是通过使用ProgressEvent.PROGRESS重复添加它。

答案 2 :(得分:0)

首先,在最后一个(例如,加载器0到3)之前附加到加载器实例的事件监听器就在那里。他们将在那里待很长时间。删除它们!

ActionScript是一种非常好的语言 - 使用它的强大功能:)

for (i=0; i < img_array.length; i++)
{
    _loader = new Loader();
    _loader.name = "image"+i;
    _loader.load(new URLRequest(img_array[i]));
    _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, 
        function onLoadingAction(e:ProgressEvent):void
        {
            trace((e.target as LoaderInfo).loader.name);
            //Do whatever you want to do here like removing event listener
            if ((e.target as LoaderInfo).bytesLoaded == (e.target as LoaderInfo).bytesTotal)
            {
                (e.target as LoaderInfo).removeEventListener(ProgressEvent.PROGRESS, onLoadingAction);
                trace("Event listener for " + (e.target as LoaderInfo).loader.name + " removed ");
            }

    }, false, i * 1000 /* you can use priority if want to maintain some order in event handling*/);
}

ActionScript使您能够为内联函数命名并引用它们。当您不需要保留对某个对象的引用时,请使用此方法。

祝你好运,玩得开心!

答案 3 :(得分:0)

 for (i=0; i < _xmlContents.img_array.length; i++)
 {
         _loader = new Loader();
    _loader.name = "image"+i;       
    _loader.load(new URLRequest(_xmlContents.img_array[i]));   
    _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,
     onLoadingAction);
        //Event.COMPLETE listnere
            //error Handler
     _preLoader = new Preloader();
_bgBox.addChild(_preLoader);

 }

这种方式解决了我的问题..但我不这么认为,这是一个好方法。

答案 4 :(得分:-1)

你的_loader对象是在函数内部定义的,而不是在其他任何地方引用,所以在函数结束后它被垃圾收集。创建一个加载器数组,每次都将加载器推送给它们。

private var _loadersArray:Array=[]; //outside the function

for (i=0; i < _xmlContents.img_array.length; i++)
{
    // create new loader instance, not use a global one
    var _loader:Loader = new Loader();
    _loader.name = "image"+i; 
    _loader.load(new URLRequest(_xmlContents.img_array[i]));
    _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadingAction);
    _loadersArray.push(_loader);
    //Event.COMPLETE listnere
    //error Handler
}
private function onLoadingAction(e:ProgressEvent):void
{
    _preLoader = new Preloader();
    //addChild(_preLoader);
    // get current loader instance
    var _loader:Loader = e.target.loader;
    trace(_loader.name);
}