2011-03-13 63 views
0

也许我在学习AS3和事件处理时错过了一些要点。无论如何,加载器的完整事件(onLoad)不会触发imgManager对象中的加载器。如果我在主类中复制相同的代码并要求它从内部激发相同的事件,那么它工作正常。这里是我的代码:子对象中的AS3事件处理程序没有触发

public class ImageScroller extends Sprite 
{ 
    public function ImageScroller() 
    { 
     var imgMan:ImageManager = new ImageManager(); 
     var v:Vector.<String> = new Vector.<String>(); 
     v[0] = "../assets/apache_pb.gif"; 

     imgMan.LoadImages(v); 

     addChild(imgMan.loadedImages[0]); 
    } 

} 

public class ImageManager 
{ 
    public var _loader:Loader; 
    private var _urlRequest:URLRequest; 
    private var _loadedImages:Vector.<Bitmap>; 

    public var bo:Boolean = false; 

    public function ImageManager() 
    { 
     _loader = new Loader(); 

     _loadedImages = new Vector.<Bitmap>(); 
    } 

    public function LoadImages(v:Vector.<String>):void 
    { 

     for(var i:int = 0; i < v.length;i++) 
     { 
      _loader.load(new URLRequest(v[i])); 
      _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad); 
     } 

    } 

    private function onLoad(e:Event):void 
    { 
     bo = true; 
     var bmp:Bitmap = (Bitmap)(e.target.content); 
     _loadedImages[0] = bmp; 
    } 

    public function get loadedImages():Vector.<Bitmap> 
    { 
     return _loadedImages; 
    } 
} 

}

回答

1

我改写了你的代码,相信下面的是解决问题的你:

Main.as:

package 
{ 
    import flash.display.Sprite; 

    public class Main extends Sprite 
    { 
     public function Main() 
     { 
      init(); 

     }// end function 

     private function init():void 
     { 
      var imageScroller:ImageScroller = new ImageScroller("images/image1.jpg", 
                   "images/image2.jpg", 
                   "images/image3.jpg"); 
      addChild(imageScroller); 

     }// end function 

    }// end class 

}// end package 

ImageScroller.as

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class ImageScroller extends Sprite 
    { 
     private var _urls:Array; 
     private var _imageManager:ImageManager; 

     public function ImageScroller(...urls:Array) 
     { 
      _urls = urls; 

      init(); 

     }// end function 

     private function init():void 
     { 
      _imageManager = new ImageManager(); 
      _imageManager.load(_urls); 
      _imageManager.addEventListener(Event.COMPLETE, onImageManagerComplete); 

     }// end function 

     private function onImageManagerComplete(e:Event):void 
     { 
      addChild(_imageManager.bitmaps[0]); 

     }// end function 

    }// end class 

}// end package 

ImageManager.as

package 
{ 
    import flash.display.Bitmap; 
    import flash.display.Loader; 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.net.URLRequest; 

    public class ImageManager extends EventDispatcher 
    { 
     private var _urls:Array; 
     private var _bitmaps:Vector.<Bitmap>; 
     private var _loadedBitmapCount:int; 

     public function get bitmaps():Vector.<Bitmap>  
     {  
      return _bitmaps; 

     } // end function 

     public function ImageManager()  
     { 
      init(); 

     }// end function 

     public function load(urls:Array):void 
     { 
      for each(var url:* in urls) 
      { 
       if(!(url is String)) 
       throw new ArgumentError("Arguments must be of type String"); 

      }// end for 

      _urls = urls; 

      for(var i:int = 0; i < _urls.length; i++) 
      {  
       var loader:Loader = new Loader(); 
       loader.load(new URLRequest(_urls[i]));  
       loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);  

      } // end for 

     } // end function 

     private function init():void 
     { 
      _bitmaps = new Vector.<Bitmap>(); 

     }// end function 

     private function onLoaderComplete(e:Event):void 
     { 
      if(++_loadedBitmapCount >= _urls.length) 
      { 
       dispatchEvent(new Event(Event.COMPLETE)); 

      }// end if 

      var bitmap:Bitmap = (Bitmap)(e.target.content); 
      bitmaps.push(bitmap); 

     }// end function 

    }// end class 

}// end package 

[更新]

凡已是你的努力被载入前访问加载的图像的问题你。

imgMan.LoadImages(v); 
addChild(imgMan.loadedImages[0]); 

你需要的是一个事件侦听器时,它已加载的所有图像,将听取您的ImageManager对象调度的事件。为此,我首先将ImageManager课程从Object更改为EventDispatcher

public class ImageManager extends EventDispatcher 

现在ImageManager已派遣一个事件并监听其其所需的两种方法分别是dispatchEvent()addEventListener()方法。

接下来,我更改了代码,以便条件会测试,以查看是否所有图像都加载到每个调用onLoaderComplete事件处理程序时的事件侦听器调用它时的loader对象。这是在_loadedBitmapCount integar属性的帮助下完成的,该属性在每次调用时递增,然后测试其值与_urls数组属性的长度属性的长度。当条件满足时,ImageManagerEventDispatcher对象将调用其dispatchEvent()方法并分派一个Event.COMPLETE事件对象。

public function load(urls:Array):void 
{ 
    // ... 

    for(var i:int = 0; i < _urls.length; i++) 
    {  
     var loader:Loader = new Loader(); 
     loader.load(new URLRequest(_urls[i]));  
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);  

    } // end for 

} // end function 

//... 

private function onLoaderComplete(e:Event):void 
{ 
    if(++_loadedBitmapCount >= _urls.length) 
    { 
     dispatchEvent(new Event(Event.COMPLETE)); 

    }// end if 

}// end function 

最后,我通过添加事件监听器聆听着ImageManager对象调度Event.COMPLETE事件对象改变了ImageScroller类的代码。当发生这种情况并调用了事件处理程序时,现在可以访问已加载的图像,因为现在它们已被加载。

private function init():void 
{ 
    _imageManager = new ImageManager(); 
    _imageManager.load(_urls); 
    _imageManager.addEventListener(Event.COMPLETE, onImageManagerComplete); 

}// end function 

private function onImageManagerComplete(e:Event):void 
{ 
    addChild(_imageManager.bitmaps[0]); 

}// end function 

如果有什么您不明白或想问我的问题,只需在此答案中添加评论。

+0

嘿,谢谢。我没有得到的是为什么我需要为主类添加一个事件侦听器。 – Ilya 2011-03-13 21:52:06

+0

嘿,谢谢。一些事情。 1.为什么我需要在主类上放置一个事件监听器? 2。事件是否跨越多个类?在上面,ImageManager有一个生成Complete事件的加载器对象。完成事件(由加载器对象引起),完全由ImageScroller看到,还是只包含在ImageManager类中? 3.根据上面的答案,上面的dispatchEvent是否只运行ImageScroller类的上下文而不是Main,例如? – Ilya 2011-03-13 22:01:54

+0

我已经更新了我的答案,以回答您已尽最大努力的问题,但有些我无法解答,因为我不知道如何正确回答问题。我建议使用google搜索“闪光事件流”,这真的是你的问题的主题。我做了部分解释,但在另一个问题,你可以在这里找到http://stackoverflow.com/questions/4364839/as3-problem-with-event-handling/4364896#4364896。 – Taurayi 2011-03-13 23:26:12

相关问题