прослушиватель событий flash для глобальных событий

У меня есть серия MovieClips, содержащихся в нескольких MovieClips, которые отправляют настраиваемое событие перемещения, которое я хотел бы, чтобы сцена слушала и взаимодействовала с ним. Есть ли способ добавить на сцену (или любой объект) прослушиватель событий для любого события одного типа, независимо от того, откуда оно было отправлено?

Например, могу ли я добавить на сцену прослушиватель событий для прослушивания любого EVENT.COMPLETE, отправленного от дочернего элемента, или любого из его дочерних элементов, или любого из его дочерних элементов?


person Jeff Winkworth    schedule 29.05.2009    source источник


Ответы (2)


То, что вы ищете, - это всплытие событий. Задайте для третьего свойства нового события значение true, чтобы включить восходящую цепочку, и оно будет всплывать в списке отображения, начиная с объекта, отправляющего событие на сцену. См. Официальную документацию для получения дополнительной информации.

Тайлер.

Отредактировано: заменить "начиная с этапа" на "объект, отправляющий событие".

person Tyler Egeto    schedule 29.05.2009
comment
Идеально! Я всегда встречал термин "пузыри", но никогда не понимал, это то, к чему он относится. +1 - person Jeff Winkworth; 30.05.2009

Что ж, этого я никогда не пойму ... Почему люди всегда используют всплывающие события для захвата событий на сцене?

Если вы посмотрите на документ, событие распространяется от сцены к целевому объекту (фаза захвата), а затем пузырится, если вы включаете восходящую цепочку.

Итак ... просто используйте захват:

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);
        }

    }
}
person Florian F    schedule 30.05.2009
comment
Привет, PeZ, это абсолютно правильно во многих случаях, особенно с событиями мыши. Однако в ситуации, описанной на плакате, для всплытия необходимо установить значение true. Это связано с тем, что отправка события вручную, Event.COMPLETE в этом случае начинается с дочернего клипа, а не со сцены, поэтому реальной фазы захвата не происходит. - person Tyler Egeto; 30.05.2009
comment
Тайлер, я думаю, твое утверждение неверно. Пока объект, отправляющий событие, находится на сцене, будет фаза захвата, даже если это отправка события вручную. Посмотрите на мой пример, это отправка события вручную, и в моем настраиваемом событии для восходящей цепочки установлено значение false. - person Florian F; 31.05.2009
comment
PeZ, какой тип события расширяет ваше CustomEvent? MouseEvents всплывает по умолчанию, а Events - нет. Можете ли вы добавить это в свой обработчик CustomEvent, чтобы увидеть, что он показывает? Просто чтобы помочь прояснить это для всех. трассировка (e.eventPhase == EventPhase.CAPTURING_PHASE); - person Tyler Egeto; 31.05.2009
comment
CustomEvent расширяет Event. Я обновил свой код классом CustomEvent. Я также добавил трассировку (e.eventPhase == EventPhase.CAPTURING_PHASE); в обработчике событий. Результат верный. - person Florian F; 31.05.2009
comment
Хорошо спасибо! Я собираюсь немного покопаться здесь, у меня очень похожая ситуация с разными результатами. Попробую разыскать, очень интересно. - person Tyler Egeto; 01.06.2009
comment
Нет проблем :) Если у вас есть вопросы, не стесняйтесь спрашивать меня. Кроме того, отличная работа на форуме pv3d, и ваш блог тоже интересен! - person Florian F; 01.06.2009
comment
Хорошо, чувствуя себя немного глупо прямо сейчас, забыл установить для useCapture значение true ... Да, так что оба являются допустимыми решениями, но useCapture, вероятно, лучший выбор в этой ситуации (хотя это не будет иметь большого значения) Существует важная разница между хотя два, и их стоит поискать в документации. Спасибо PeZ за исправление! - person Tyler Egeto; 01.06.2009
comment
Я поэкспериментировал, и оба решения являются действительными. Я собираюсь проверить документацию. Может ли кто-нибудь вкратце объяснить, почему это лучшее решение? - person Jeff Winkworth; 02.06.2009