AS3: распространение пользовательских событий

#actionscript-3 #flash #external #event-propagation

#actionscript-3 #flash #внешний #событие-распространение

Вопрос:

Я пытаюсь собрать проектор последовательности загруженных извне SWF-файлов, и мой общий вопрос будет настолько коротким, насколько это возможно.

Если внешний swf-файл, загруженный в ctrl (экземпляр MovieClip, размещенный на сцене во время разработки), содержит в своем первом и последнем кадрах:

  dispatchEvent(new Event("FIRST_FRAME")); // in the first frame, and: 
 dispatchEvent(new Event("LAST_FRAME")); // in the last frame 
  

тогда — должны ли эти события «прослушиваться» в контейнере ctrl?

В настоящее время я, похоже, могу прослушивать только эти события в загруженном контенте, а не «выше», я имею в виду — если я скажу в загрузчике complete listener полный прослушиватель:

 mc:MovieClip = MovieClip(e.currentTarget.content);
mc.addEventListener("LAST_FRAME", function(){ // something });
  

затем события прослушиваются, но не тогда, когда я говорю:

 ctrl.addEventListener("LAST_FRAME", function(){ // something });
  

Последний кажется более надежным, поэтому я изо всех сил пытаюсь заставить его работать, но, думаю, я пропустил некоторые уроки 😉
Кто-нибудь проходил через это? Правильный ли мой подход или мне следует выбрать другой путь?

Приветствую всех.

Комментарии:

1. Итак, у вас есть swf-файл, который отправляет событие, загружаемое в ваше текущее приложение, затем вы добавляете этот swf-файл в отображаемый объект с именем ctrl ? Если это так, вам нужно включить пузырящийся процесс при отправке события, например, так `dispatchEvent(новое событие(«FIRST_FRAME», true));».

Ответ №1:

Вы можете заставить свой crtl экранный объект получать событие, отправленное из вашего внешнего swf-файла, установив для параметра bubbles значение true при отправке вашего события. Посмотрите на следующий пример, где SWFB.swf загружается в SWFA.swf:

SWFB:

 package swfb
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            const SECOND:int = 1000;

            var timer:Timer = new Timer(5 * SECOND, 1);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
            timer.start();

        }// end function

        private function onTimerComplete(e:TimerEvent):void
        {
            dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE, true, true));

        }// end function

    }// end class

}// end package
  

SWFA:

 package swfa
{
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.net.URLRequest;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
            loader.load(new URLRequest("swf/SWFB.swf"));


        }// end function

        private function onLoaderComplete(e:Event):void
        {
            var loaderInfo:LoaderInfo = LoaderInfo(e.target);

            var container:Sprite = new Sprite();
            container.addChild(loaderInfo.content);
            container.addEventListener(TimerEvent.TIMER_COMPLETE, onContainerTimerComplete);
            addChild(container);

        }// end function

        private function onContainerTimerComplete(e:TimerEvent):void
        {
            trace("TIMER COMPLETE!");

            e.stopPropagation();

        }// end function

    }// end class

}// end package
  

SWFB.swf отправляет Timer событие через 5 секунд после его добавления на сцену. Когда он отправляет событие, для параметров bubbles и cancelable устанавливается значение true.

В SWFA.swf в него загружается SWFB.swf, а затем добавляется в вызываемый контейнер отображаемых объектов container . Затем в контейнер добавляется прослушиватель событий, который прослушивает Timer событие из SWFB.swf для отправки. При отправке onContainerTimerComplete() обработчик события вызывает stopPropagation() метод события таймера, чтобы (как следует из его названия) остановить распространение события.

Комментарии:

1. огромное спасибо за ваш подробный урок. Я не подумал о двух свойствах события, но это имеет смысл. К сожалению, на данный момент я не могу погрузиться в эту работу, но попробую это на днях в ближайшее время. Еще раз спасибо!