我正在学习as3,而且我很难理解事件。
我正在尝试在数组中加载我稍后需要访问以加载图像的选项。
现在..
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
myLoader.load(new URLRequest("slides.xml"));
myLoader.addEventListener(Event.COMPLETE, processXMLSlides);
...
}
private function processXMLSlides(e:Event):void {
removeEventListener(Event.COMPLETE, processXMLSlides);
myXML = new XML(e.target.data);
myXML.ignoreWhite=true;
for (var i:int = 0; i < myXML.IMAGE.length(); i++) {
imagesURLs.push(myXML.IMAGE[i]);
//trace(myXML.IMAGE[i]);
}
//Start the main routine.
loadImages();
writeImage(imageCurrent);
}
loadImages()接受数组imagesURLs并将它们作为URLRequests加载到另一个数组中,然后writeImage()将图像写入舞台。
现在就是这个。如果我在这里移动loadImages()和writeImage()函数:
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
myLoader.load(new URLRequest("slides.xml"));
myLoader.addEventListener(Event.COMPLETE, processXMLSlides);
//Start the main routine.
loadImages();
writeImage(imageCurrent);
...
}
它不起作用,因为在从xml填充数组之前调用loadImages。现在我怎么能告诉as3等待processXMLSlides完成它的事情? 我需要另一个活动吗?这是愚蠢的(有更好的方法来做我正在做的事情)吗?
由于
答案 0 :(得分:2)
您的问题没有意义,您的第一个示例正是您所要求的 - 正在等待加载XML。
Flash事件在处理异步流程时非常方便 - 比如XML加载 - 在调用loadImages();
和writeImage(imageCurrent);
之前你会等多久?答案正好与XML加载一样长。所以在事件处理程序方法中保持原样。
注意:
首先将侦听器添加到myLoader,然后再调用load()方法。在本地环境(来自硬盘驱动器)上进行测试时,可能会发生“slides.xml”将立即加载并且在附加eventListener之前将触发COMPLETE事件。
答案 1 :(得分:1)
这是未经测试的代码,但这样的事情应该有效:
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
myLoader.addEventListener(Event.COMPLETE, processXMLSlides);
myLoader.load(new URLRequest("slides.xml"));
}
private function processXMLSlides(e:Event):void
{
e.currentTarget.removeEventListener(Event.COMPLETE, processXMLSlides);
myXML = new XML(e.target.data);
myXML.ignoreWhite = true;
for each (var element:XML in myXML..IMAGE)
{
var imageLoader:Loader = new Loader();
imageLoader.addEventListener(Event.COMPLETE, writeImage);
imageLoader.load(new URLRequest(element));
}
}
private function writeImage(e:Event):void
{
e.currentTarget.removeEventListener(Event.COMPLETE, writeImage);
addChild(evt.currentTarget);
}
你可能想要坚持使用var i:uint for循环,因为你可以使用它来定位每个图像的位置。
阅读Loader课程。为特定类别的事件提供了许多示例,您可以根据自己的特定需求使用它们。