2

Flex アプリケーションにロードされた SWF ファイルから (SWFLoader を使用して) イベントを発生させるにはどうすればよいですか?

検出できるようになりたい

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

5 に答える 5

2

次の 2 つのことを行う必要があります。

  1. ロードされた swf からイベントをディスパッチします。ネストされたビューからイベントを送信した場合は、イベントがバブルしていることを確認してください。バブリングは、イベントの bubbles プロパティを使用して設定できます。
  2. メイン アプリケーションからイベントをリッスンします。SWFLoader インスタンスの content プロパティでそれを行うことができるはずだと思います。

    mySWFLoader.content.addEventListener("myEvent", myEventHandler);
    
于 2008-10-12T06:55:39.063 に答える
2

I took a lazier approach for raising the event inside 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));
于 2008-10-12T20:22:19.403 に答える
1

Flash と Flex で 2 つの個別のカスタム イベント クラスを作成するためだと思います。Flex には独自のバージョンの EV_NOTIFY.ANIMATION_ENDED があるため、Flash から EV_NOTIFY.ANIMATION_ENDED を 1 つディスパッチしても、Flex では認識されない場合があります。

于 2011-05-10T11:38:17.133 に答える
0

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

于 2008-10-12T08:55:51.613 に答える
0

この最後のアプローチは機能しませんでした (Flash CS4 と Flex 3 を使用)。Flash アニメーションの最後のフレームの 1 つに dispatchEvent 呼び出しを配置し​​ましたが、Flex でそれを取得できませんでした。

カウンター変数に頼り、ENTER_FRAME イベントを使用して既知の最後のフレーム番号に到達するまでインクリメントしました。これは、ほぼ同じコードを使用して取得できます。

これを拾うことができるなら、カスタム イベントを拾えないのはなぜですか?

于 2009-03-30T12:43:42.277 に答える