我改写了你的代码,相信下面的是解决问题的你:
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