5

プロジェクトにリスナーを追加し、EVENT.ACTIVATEAltキーを押しながらプロジェクトに戻ると、2回トリガーされます。

編集:shaunhusainと私は問題の原因を見つけたようですが、解決策はありません。スタンドアロンプ​​レーヤーバージョン11以降を実行すると、イベントが2回トリガーされます。スタンドアロンプ​​レーヤーバージョン<11またはブラウザの任意のバージョンを実行すると、1xがトリガーされます。そのため、最近のバージョンのフラッシュプレーヤープロジェクターにはバグがあるようです。正確なバージョンを特定し、それをadobeに報告して、何が起こるかを確認します。これを読んで助けようとした人に感謝します!!

フォーカスを変更するたびに起動したいのですが、フォーカスを変更するたびに2回起動したくないだけです。

どうしてこれなの?私は何か間違ったことをしていますか?この動作を防ぐための最良の方法は何ですか?

よくある質問のようですが、Googleは何もしませんでした。

コード:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            stage.addEventListener(Event.ACTIVATE, test);
        }

        private function test(e:Event):void
        {
            trace(e.target);
        }

    }

}

実結果:

[object Stage]
[object Stage]

望ましい結果:

[object Stage]

リスナーをステージに追加しても、他の何かに追加しても、違いはないようです。動作は同じです。

同じことがEVENT.DEACTIVATEでも起こります。マウスアップなどの他の機能は正常に機能します。

私の目標は、ゲームを一時停止し、一時停止EVENT.DEACTIVATEを解除することEVENT.ACTIVATEです。問題は、イベントが2回発生すると、一時停止解除関数が2回呼び出され、望ましくない結果が生じることです。

4

2 に答える 2

1

ActionScript® 3.0 Reference for the Adobe® Flash® Platform says about this event:

Dispatched when the Flash Player or AIR application gains operating system focus and becomes active. This event is a broadcast event, which means that it is dispatched by all EventDispatcher objects with a listener registered for this event. For more information about broadcast events, see the DisplayObject class.

For me it looks like you want to prevent its designed behavior? I suppose it was designed to fire every time you change focus, or am I wrong? What do you want to accomplish? However this is an answer, so based on what you wrote - you can do a workaround by just removing a listener after he fired once:

    private function test(e:Event):void
    {
        stage.removeEventListener(Event.ACTIVATE, test);

        trace(e.target);
    }

But I would recommend you to write something more about why are you using it and what want to accomplish if this is not satisfactory.

于 2012-06-04T23:55:29.837 に答える
0

AIR Mobile アプリでも同じ問題が発生しました。

この問題を修正するために、Activate / Deactivate イベントでトリガーされた最後のイベント名を保存しました。連続して 2 回試行された場合は、return;

private static function onAppStateChanged(e:Event):void {
    if (_STATE == e.type) {
        return;
    }

    _STATE =    e.type;
    switch(_STATE) {
        case Event.ACTIVATE: whenActivated.dispatch(); break;
        case Event.DEACTIVATE: whenDeactivated.dispatch(); break;
    }
}

最初、 _STATE の値はnullで始まるため、最初は通過できるはずです。

次のように、アプリの初期化メソッドでEvent.ACTIVATEEvent.DEACTIVATEの両方を同じリスナーにバインドします。onAppStateChanged

_STAGE.addEventListener(Event.ACTIVATE, onAppStateChanged);
_STAGE.addEventListener(Event.DEACTIVATE, onAppStateChanged);

Switch-Statementは好きなように置き換えることができます。個人的には、 Robert Penner の AS3Signals ( GitHub ) を使用して、再開/中断信号をアプリ全体にブロードキャストすることを好みます。

于 2012-12-03T18:52:21.767 に答える