Adobe Air‎ > ‎

Flex(Air)画面でのKeyイベント


Keyイベントの登録方法

Air(Flex)の画面にてKeyイベントをListenして処理を組み込む場合には、KeyboardEventをaddEventListenerします。

addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace(e.keyCode);
        }
}

KeyboadEventにはKEY_DOWN,KEY_UPがあります。
KeyboadEventには、alt,shift,control,commandが押されているかどうかのboolean値と、keycode, charcodeの情報が含まれています。

keycodeの値は、flash.ui.Keyboad にて定数が切られています。(Swingでいう、KeyEvent)
これらを使って、ESCAPEキーを押された場合のイベントは以下のように記述が出来ます。

addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    if (e.keyCode == Keyboard.ESCAPE) {
                trace("Escapeキーが押されました);
             }
        }
}

ESCAPEキーが押されたときに画面を閉じる処理などを書く場合には上記のようにKEY_DOWNのタイミングでもいいと思うのですが、Ctrl+ESCAPEのようにModifierを組み合わせた場合には、KEY_DOWNでなく、KEY_UPを使うと良いみたいです。
addEventListener(KeyboardEvent.KEY_UP,
        function(e:KeyboardEvent):void {
    if (e.ctrlKey && e.keyCode == Keyboard.ESCAPE) {
                trace("Ctrl+Escapeキーが押されました);
             }
        }
}
ちなみに、上記のコードでKeyboardEvent.KEY_DOWNにすると、keyCodeの値はCtrlキーになってしまいます。

GUIコントロール部品でのKeyListener

mx:TextInputなどのGUIコントロール部品にてKeyLitenerを行ないたい場合には、その部品に対してaddEventListenerすればOKです。

var text:TextInput;
text.addEventListener(KeyboardEvent.KEY_UP,
        function(e:KeyboardEvent):void {
    trace(e.keyCode);
        }
}

画面内でのKeyListener

mx:WindowedApplicationの場合

WindowedApplication#addEventListenerではなぜか反応しませんでした。
Stage#addEventListenerだと反応するようなので、以下のようなコードになります。

var window:WindowedApplication;
window.stage.addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace(e.keyCode);
        }
}

mx:Windowの場合

WindowedApplication同様、Stageに対してaddEventListenerします。

mx:TitleWindowの場合

TitleWindow#addEventListenerで反応します。
var window:TitleWindow;
window.addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace(e.keyCode);
        }
}

Airアプリケーション全体へのKeyListener

Windowメニューへのショートカットなど、アプリケーション全体としてショートカットKeyを使いたい場合。
NativeApplicationに対してaddEventListenerするとOKのようです。

mx:WindowedApplicationからの場合だと、以下のような感じ。
var window:WindowedApplication;
window.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace(e.keyCode);
        }
}

複数EventListenerを登録した場合の順序

Stageに対して、複数EventLitener(KeyboadEvent.KEY_DOWN)を登録した場合は、登録された順序で実行されるようです。
var window:WindowedApplication;
window.stage.addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace("event1");
        }
}
window.stage.addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace("event2");
        }
}

実行結果
event1
event2

StageとNativeApplicationと両方に登録した場合には、Stageのものが優先的に実行されるようです。
var window:WindowedApplication;
window.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace("native1");
        }
}
window.stage.addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace("stage1");
        }
}
window.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace("native2");
        }
}
window.stage.addEventListener(KeyboardEvent.KEY_DOWN,
        function(e:KeyboardEvent):void {
    trace("stage2");
        }
}

実行結果
stage1
stage2
native1
native2
Comments