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

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

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

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

Ответы [ 5 ]

2 голосов
/ 13 октября 2008

Я выбрал более ленивый подход для вызова события во flash

Flex:

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

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

Flash:

dispatchEvent(new Event("continueClicked", true, true));
2 голосов
/ 12 октября 2008

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

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

    mySWFLoader.content.addEventListener("myEvent", myEventHandler);
    
1 голос
/ 10 мая 2011

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

0 голосов
/ 30 марта 2009

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

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

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

0 голосов
/ 12 октября 2008

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

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...
}

НТН

...