Как создать событие из 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 вещи:
- Отправьте событие из загруженного SWF. Убедитесь, что событие вспыхивает, если вы отправили его из вложенных представлений. Bubbling может быть установлен через свойство bubbles события.
Слушайте событие из вашего основного приложения. Я думаю, вы должны быть в состоянии сделать это на свойстве содержимого экземпляра 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...
}
НТН