Как создать событие из SWF-файла в SWFLoader для родительского приложения Flex?

Как вызвать событие из SWF-файла, загруженного в приложение Flex (с использованием SWFLoader)?

Я хочу быть в состоянии обнаружить

a) when a button is pressed
b) when the animation ends

5 ответов

Я применил более ленивый подход к освещению события во flash

Flex:

<mx:SWFLoader  source="homeanimations/tired.swf"  id="swfTired" complete="swfTiredLoaded(event)" />

private function swfTiredLoaded(event:Event): void {
     mySWFLoader.content.addEventListener("continueClicked", continueClickedHandler);
}

Вспышка:

dispatchEvent(new Event("continueClicked", true, true));

Вам нужно будет сделать 2 вещи:

  1. Отправьте событие из загруженного SWF. Убедитесь, что событие вспыхивает, если вы отправили его из вложенных представлений. Bubbling может быть установлен через свойство bubbles события.
  2. Слушайте событие из вашего основного приложения. Я думаю, вы должны быть в состоянии сделать это на свойстве содержимого экземпляра SWFLoader.

    mySWFLoader.content.addEventListener("myEvent", myEventHandler);
    

Я верю в это, потому что вы будете создавать два отдельных пользовательских класса событий, один во Flash, а другой во Flex. Flex не может понять отправку одного EV_NOTIFY.ANIMATION_ENDED из Flash, поскольку у него есть собственная версия EV_NOTIFY.ANIMATION_ENDED.

Я не мог заставить этот последний подход работать (с Flash CS4 и Flex 3). Я поместил вызов dispatchEvent в один из последних кадров моей Flash-анимации, но не смог поднять его во Flex.

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

Если я могу забрать это, то почему я не могу забрать пользовательское событие?

Как дополнение к ответу Кристофа Хермермана, и если вам интересно, вот способ сделать ваши собственные события...

package yourpackage.events
{
    import flash.events.Event;

    [Event(name="EV_Notify", type="yourpackage.events.EV_Notify")]
    public class EV_Notify extends Event
    {
        public function EV_Notify(bubbles:Boolean=true, cancelable:Boolean=false)
        {
            super("EV_Notify", bubbles, cancelable);
        }

    }
}

Я взял на себя смелость установить значение по умолчанию bubbles Значение true и передача пользовательского типа события суперструктору по умолчанию, поэтому вы можете просто сказать...

dispatchEvent(new EV_Notify());

В вашем конкретном случае я сомневаюсь, что бывают случаи, когда вы не хотите, чтобы ваше событие вспыхнуло.

Префикс EV_ на имени мое соглашение о событиях, поэтому я легко могу найти их во всплывающих окнах завершения кода, вы, очевидно, выберете свое собственное имя.

В двух случаях, которые вы цитируете, вы можете либо иметь два события и прослушивать оба из них, либо добавить свойство к событию, которое сообщает о том, что только что произошло, - это подход, который используется такими элементами управления, как Alert...

package yourpackage.events
{
    import flash.events.Event;

    [Event(name="EV_Notify", type="yourpackage.events.EV_Notify")]
    public class EV_Notify extends Event
    {
        public static var BUTTON_PRESSED:int = 1;
        public static var ANIMATION_ENDED:int = 2;

        public var whatHappened:int;

        public function EV_Notify(whatHappened:int, bubbles:Boolean=true, cancelable:Boolean=false)
        {
            this.whatHappened = whatHappened;
            super("EV_Notify", bubbles, cancelable);
        }

    }
}

тогда вы называете это следующим образом...

dispatchEvent(new EV_Notify(EV_NOTIFY.ANIMATION_ENDED));

Затем вы можете проверить поле whatHappened в вашем обработчике событий.

private function handleNotify(ev:EV_Notify):void
{
    if (ev.whatHappened == EV_Notify.ANIMATION_ENDED)
    {
        // do something
    }
    else if (ev.whatHappened == EV_Notify.BUTTON_PRESSED)
    {
        // do something else
    }
    etc...
}

НТН

Другие вопросы по тегам