全局事件的flash事件监听器

时间:2009-05-29 21:08:25

标签: flash actionscript-3 events event-handling

我有一系列MovieClip,在几个MovieClip中保存,它发送一个自定义移动事件,我希望舞台能够收听和交互。有没有办法为一个类型的任何事件添加到舞台(或任何Object)的事件侦听器,无论它从何处被调度?

例如,我可以在舞台上添加一个事件监听器来监听从孩子或其任何孩子或其子女的孩子中分派的任何EVENT.COMPLETE吗?

2 个答案:

答案 0 :(得分:6)

您正在寻找的是事件冒泡。将新事件的第三个属性设置为true以启用冒泡,并且它将从将对象分派到舞台的对象开始冒泡显示列表。有关详细信息,请参阅官方文档。

泰勒。

编辑:将“从舞台开始”更改为“调度事件的对象”

答案 1 :(得分:2)

嗯,这是我永远不会理解的......为什么人们总是使用冒泡事件来捕捉舞台上的事件?

如果查看文档,事件会从舞台传播到目标对象(捕获阶段),然后如果启用冒泡则会冒泡。

所以...只需使用捕获:

Main.as

package {
    import flash.display.Sprite;

    public class Main extends Sprite
    {
        public function Main()
        {
            var c:Circle = new Circle();
            var r:Rect = new Rect();
            c.addChild(r);
            addChild(c);
            addEventListener(CustomEvent.CUSTOM, customEventHandler, true);//don't forget third parameter to use capture
        }

        private function customEventHandler(e:CustomEvent):void
        {
            trace(e.eventPhase == EventPhase.CAPTURING_PHASE);//shows true
        }
    }
}

Circle.as

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class Circle extends Sprite
    {
        public function Circle()
        {
            super();
            init();
        }

        private function init():void
        {
            with(graphics)
            {
                beginFill(0xFF0000);
                drawCircle(25, 25, 50);
                endFill()
            }

        }
    }
}

Rect.as

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

    public class Rect extends Sprite
    {
        public function Rect()
        {
            super();
            init();
        }

        private function init():void
        {
            with(graphics)
            {
                beginFill(0x000000);
                drawRect(0, 0, 25, 25);
                endFill();
            }

            addEventListener(MouseEvent.CLICK, mouseClickHandler);
        }

        private function mouseClickHandler(e:MouseEvent):void
        {
            dispatchEvent(new CustomEvent(CustomEvent.CUSTOM));
        }


    }
}

CustomEvent.as

package
{
    import flash.events.Event;

    public class CustomEvent extends Event
    {
        public static const CUSTOM:String = "custom";

        public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
        }

    }
}