了解事件有点帮助(noob问题)

时间:2011-01-21 11:36:43

标签: flash actionscript-3 flash-builder

我正在学习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完成它的事情? 我需要另一个活动吗?这是愚蠢的(有更好的方法来做我正在做的事情)吗?

由于

2 个答案:

答案 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课程。为特定类别的事件提供了许多示例,您可以根据自己的特定需求使用它们。