我改寫了你的代碼,相信下面的是解決問題的你:
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
數組屬性的長度屬性的長度。當條件滿足時,ImageManager
EventDispatcher
對象將調用其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
如果有什麼您不明白或想問我的問題,只需在此答案中添加評論。
嘿,謝謝。我沒有得到的是爲什麼我需要爲主類添加一個事件偵聽器。 – Ilya 2011-03-13 21:52:06
嘿,謝謝。一些事情。 1.爲什麼我需要在主類上放置一個事件監聽器? 2。事件是否跨越多個類?在上面,ImageManager有一個生成Complete事件的加載器對象。完成事件(由加載器對象引起),完全由ImageScroller看到,還是隻包含在ImageManager類中? 3.根據上面的答案,上面的dispatchEvent是否只運行ImageScroller類的上下文而不是Main,例如? – Ilya 2011-03-13 22:01:54
我已經更新了我的答案,以回答您已盡最大努力的問題,但有些我無法解答,因爲我不知道如何正確回答問題。我建議使用google搜索「閃光事件流」,這真的是你的問題的主題。我做了部分解釋,但在另一個問題,你可以在這裏找到http://stackoverflow.com/questions/4364839/as3-problem-with-event-handling/4364896#4364896。 – Taurayi 2011-03-13 23:26:12