Flash 了解事件的一点帮助(noob问题)

Flash 了解事件的一点帮助(noob问题),flash,actionscript-3,flash-builder,Flash,Actionscript 3,Flash Builder,我正在学习as3,我很难理解事件 我正在尝试在阵列中加载选项,稍后需要访问这些选项才能加载图像 现在 它不起作用,因为loadImages在从xml填充数组之前被调用。现在,我如何告诉as3等待processXMLSlides完成它的工作? 我还需要其他活动吗?这是否愚蠢(有更好的方法来做我正在做的事情) 谢谢您的问题没有意义,您的第一个示例正是在做您要求的事情—等待XML加载 Flash事件在处理异步进程(如XML加载)时非常方便,在调用loadImages()之前,您会等待多长时间和写入图像

我正在学习as3,我很难理解事件

我正在尝试在阵列中加载选项,稍后需要访问这些选项才能加载图像

现在

它不起作用,因为loadImages在从xml填充数组之前被调用。现在,我如何告诉as3等待processXMLSlides完成它的工作? 我还需要其他活动吗?这是否愚蠢(有更好的方法来做我正在做的事情)


谢谢

您的问题没有意义,您的第一个示例正是在做您要求的事情—等待XML加载

Flash事件在处理异步进程(如XML加载)时非常方便,在调用
loadImages()之前,您会等待多长时间
写入图像(imageCurrent)?答案就是加载XML所需的时间。因此,将其保留在事件处理程序方法中

注:


首先将侦听器添加到myLoader,然后才调用load()方法。在本地环境(从硬盘驱动器)上进行测试时,可能会立即加载“slides.xml”,并在连接eventListener之前触发完整的事件

您的问题没有意义,您的第一个示例正是在做您想要做的事情—等待XML加载

Flash事件在处理异步进程(如XML加载)时非常方便,在调用
loadImages()之前,您会等待多长时间
写入图像(imageCurrent)?答案就是加载XML所需的时间。因此,将其保留在事件处理程序方法中

注:


首先将侦听器添加到myLoader,然后才调用load()方法。在本地环境(从硬盘驱动器)上进行测试时,可能会立即加载“slides.xml”,并在连接eventListener之前触发完整的事件

这是未经测试的代码,但类似的代码应该可以工作:

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循环,因为您可以使用它来定位每个图像的位置


读一读这门课。对于类特定事件,提供了许多示例,您可以根据自己的具体需要使用这些示例。

这是未经测试的代码,但类似的代码应该可以工作:

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循环,因为您可以使用它来定位每个图像的位置


读一读这门课。提供了许多用于类特定事件的示例,您可以根据自己的特定需要使用这些示例。

请注意:事件侦听器需要从其分派器中删除。例如myLoader.removeEventListener(Event.COMPLETE,processXMLSlides);,evt.target.removeEventListener。。。或者evt.currentTarget.removeEventListener…@1978年的天空你为什么这么说?只有在有原因的情况下才需要删除eventListeners,而不是每次。对不起,我不清楚。我已经说过,上面的代码是不正确的,因为myLoader正在添加事件侦听器并分派事件,但是myLoader的父级正在尝试删除它不拥有的事件侦听器。此外,如果事件侦听器未被使用,则应将其删除,否则您将在垃圾收集方面遇到问题。请注意:事件侦听器需要从其Dispatcher中删除。例如myLoader.removeEventListener(Event.COMPLETE,processXMLSlides);,evt.target.removeEventListener。。。或者evt.currentTarget.removeEventListener…@1978年的天空你为什么这么说?只有在有原因的情况下才需要删除eventListeners,而不是每次。对不起,我不清楚。我已经说过,上面的代码是不正确的,因为myLoader正在添加事件侦听器并分派事件,但是myLoader的父级正在尝试删除它不拥有的事件侦听器。此外,如果事件侦听器未被使用,则应将其删除,否则您将在垃圾收集方面遇到麻烦。谢谢,现在我对整个问题有了更好的了解。谢谢,现在我对整个问题有了更好的了解。
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);
    }