自定义事件的麻烦

时间:2013-08-25 19:15:41

标签: actionscript-3 flash

我最近在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);
        }

    }

}

和动画片段作为文件:

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

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

1 个答案:

答案 0 :(得分:3)

问题似乎是你在错误的地方听你的自定义事件。您可以使用事件冒泡,事件的捕获阶段或通过侦听调度事件的对象(事件目标)来解决这几种方式。

Flash Event Model遵循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()时更改了第二个参数,允许事件“冒泡”。

由于事件现在会使显示列表重新启动,因此事件目标的任何父级也可以在目标处理

之后侦听事件。