Flex アプリケーションにロードされた SWF ファイルから (SWFLoader を使用して) イベントを発生させるにはどうすればよいですか?
検出できるようになりたい
a) when a button is pressed
b) when the animation ends
Flex アプリケーションにロードされた SWF ファイルから (SWFLoader を使用して) イベントを発生させるにはどうすればよいですか?
検出できるようになりたい
a) when a button is pressed
b) when the animation ends
次の 2 つのことを行う必要があります。
メイン アプリケーションからイベントをリッスンします。SWFLoader インスタンスの content プロパティでそれを行うことができるはずだと思います。
mySWFLoader.content.addEventListener("myEvent", myEventHandler);
I took a lazier approach for raising the event inside flash
<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));
Flash と Flex で 2 つの個別のカスタム イベント クラスを作成するためだと思います。Flex には独自のバージョンの EV_NOTIFY.ANIMATION_ENDED があるため、Flash から EV_NOTIFY.ANIMATION_ENDED を 1 つディスパッチしても、Flex では認識されない場合があります。
Christophe Herremanによる回答の補助として、そしてあなたが疑問に思っている場合に備えて、ここにあなた自身のイベントを作る方法があります...
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_
は私自身のイベントの規則なので、コード完了ポップアップで簡単に見つけることができます。明らかに自分の名前を選択します。
引用する2つのケースでは、2つのイベントを作成して両方をリッスンするか、イベントにプロパティを追加して、何が起こったかを示すことができます。これは、次のようなコントロールによって採用されるアプローチ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...
}
HTH
この最後のアプローチは機能しませんでした (Flash CS4 と Flex 3 を使用)。Flash アニメーションの最後のフレームの 1 つに dispatchEvent 呼び出しを配置しましたが、Flex でそれを取得できませんでした。
カウンター変数に頼り、ENTER_FRAME イベントを使用して既知の最後のフレーム番号に到達するまでインクリメントしました。これは、ほぼ同じコードを使用して取得できます。
これを拾うことができるなら、カスタム イベントを拾えないのはなぜですか?