2011-09-26 50 views
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 
} 
private function onLoadingAction(e:ProgressEvent):void 
{ 
    _preLoader = new Preloader(); 
    //addChild(_preLoader); 
    trace(_loader.name); 
} 

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

我该如何添加?

+0

我似乎无法弄清楚你的'Preloader'对象在哪里进场。 – Taurayi

+0

想象一下,我有5个图像,我已经加载到movieclip。 'mc.x = mc.width * i;'希望你现在明白了。 – Benny

回答

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); 

} 

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

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); 

} 
+0

'错误:错误#2099:加载对象未被充分加载以提供此信息。 \t在flash.display使用::的LoaderInfo/GET装载机() \t在主/ :: onLoadingAction()' 我得到这个错误'VAR _loader:装载机= e.target.loader;' – Benny

+1

OK,我的错误,我看到progressevent没有target.loader属性,所以这不起作用,但是你需要加载器名称属性进行中的事件处理程序吗?你也应该在你的第一个循环中创建和添加预加载器,而不是在这个事件处理器中 - 这个处理器每次调用进度时都会调用它,因此多次调用它,并且你想要为每个图像添加一个预加载器 – Bartek

+0

@Bartek在循环中实例化一个变量创建多个实例,并且可以在LOOP中以相同的名称访问它们。因此,在这种情况下'_loader'将引用循环的这个迭代中实例化的加载器对象。 –

-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); 
} 
+0

对象不会从内存中移除,除非您有任何对它们的引用,例如eventListeners,因此它不会被垃圾收集。所以你不需要将它们存储在一个数组中 – Bartek

+0

@Pranav Hosangadi:在数组中存储装载器需要什么? – Benny

+1

好吧,由于一些奇怪的原因,我曾经经历过,如果我没有引用加载器(在数组或单独的变量中),事件会非常随机地触发 –

0

我不认为数组是必要的,我想你会在一个更好的轨道从Event.INIT调用它,而不是通过使用ProgressEvent.PROGRESS反复添加它添加预加载的4个实例。

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为您提供了命名内联函数,并有给他们一个参考的能力。如果您不需要保留对某个对象的引用,请使用此方法。

祝你好运,玩得开心!