0

我最近在 as3 中遇到了很多自定义事件的问题,我用谷歌搜索了一堆没有帮助的东西,并使用本教程试图找出它们,但我仍然感到困惑。

所以我设置了一个新的 flash fla 文件来测试它们,但无法弄清楚,这就是我所拥有的:

文件作为文件:

package  

{
import flash.events.MouseEvent;
import flash.display.MovieClip;

public class Custom extends MovieClip 
{
    var intializer:Initializer;

    var added:Added;

    public function Custom() 
    {
        intializer=new Initializer();
        addChild(intializer);
        intializer.addEventListener(MouseEvent.CLICK, OnClicker);
        addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch);
    }

    private function OnClicker(event:MouseEvent):void
    {
        added=new Added();
        added.x=300; added.y=300; 
        addChild(added);
    }

    private function OnCatch(event:CustomEvent):void
    {
        trace("hi");
        removeChild(added);
    }
}

}

事件作为文件:

package  
{
    import flash.events.Event;

    public class CustomEvent extends Event
    {
        public static const EVENT_CUSTOM="event1";

        public function CustomEvent(type) 
        {
            super(type, false, false);
        }

    }

}

和movieclips作为文件:

package  
{
    import flash.events.MouseEvent;
    import flash.display.MovieClip;

    public class Added extends MovieClip 
    {
        var addedButton:AddedButton;

        public function Added() 
        {
            addedButton=new AddedButton();
            addedButton.x=30; addedButton.y=30;
            addChild(addedButton);
            addedButton.addEventListener(MouseEvent.CLICK, OnClickie);
        }

        private function OnClickie(event:MouseEvent):void
        {
            dispatchEvent(new CustomEvent(CustomEvent.EVENT_CUSTOM));
        }
    }

}

按钮使用一个空类,这给了我这个结果:(第一个按钮的左上角。) http://www.fastswf.com/_EfGSoQ

很抱歉这么多代码,但自定义事件似乎需要很多代码。

4

1 回答 1

3

问题似乎是您在错误的位置监听自定义事件。您可以使用事件冒泡、事件的捕获阶段或通过侦听调度事件的对象(事件目标)上的事件来解决这个问题。

Flash 事件模型遵循W3C 事件模型(用于 DOM/Javascript)。当一个事件被调度时,它会经历三个阶段:捕获阶段、目标阶段和冒泡阶段。它在上面的链接中进行了描述(在“事件传播和阶段”部分)。

出于性能原因(我的假设),默认情况下不启用捕获和冒泡阶段。

请注意,您只需要执行以下 3 件事之一。我建议使用事件目标,这是最容易理解的。其他人各司其职,可能非常有用,但您可以在目标阶段完成大部分工作。

如何使用目标阶段

在您的文档类中,从构造函数中删除这一行:

addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch);

删除它,因为我们将直接监听来自Added对象的事件(它是事件目标)。为此,请更改在文档类中添加对象的代码:

private function OnClicker(event:MouseEvent):void
{
    added=new Added();
    added.x=300; added.y=300; 
    addChild(added);
    added.addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch);
}

如何使用捕获阶段

在您的文档类中,添加事件侦听器以启用捕获阶段时添加一个附加参数:

addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch, true);

这允许事件目标的任何父级在目标处理事件之前处理事件。

如何使用冒泡阶段:

要使用冒泡阶段,您的自定义事件对象需要“冒泡”。因此,您需要修改自定义事件类中的构造函数:

public function CustomEvent(type) 
{
    super(type, true, false);
}

在这里,我将调用中的第二个参数更改为super(),允许事件“冒泡”。

由于事件现在冒泡显示列表,因此事件目标的任何父级也将能够在目标处理事件侦听该事件。

于 2013-08-25T20:04:26.380 回答