2011-03-13 92 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

相關問題