MotionEventでマルチタッチを検出する ではidによるマルチタッチ制御の方法を紹介しました。マルチタッチ検出の導入と同時に、入力デバイスを特定するための仕組み、InputEventも追加されています。InputEventはKeyEvent, MotionEventの親クラスで、入力機器に関する情報を持っています。
InputDeviceの主な定数
定数名 | 概要 |
---|---|
SOURCE_DPAD | 513 (0x00000201)十字キー |
SOURCE_KEYBOARD | 257 (0x00000101)キーボード |
SOURCE_MOUSE | 8194 (0x00002002)マウス |
SOURCE_TOUCHPAD | 1048584 (0x00100008)タッチパッド |
SOURCE_TOUCHSCREEN | 4098 (0x00001002)タッチスクリーン |
SOURCE_TRACKBALL | 65540 (0x00010004)トラックボール |
SOURCE_UNKNOWN | 0 (0x00000000)不明なデバイス |
入力デバイス(ソース)を示す定数を抜粋しました。これらの定数値はビット演算のために、キリの良い値になっていません。たとえばSOURCE_KEYBOARDは0x00000101ですが下2桁が入力デバイスの分類(SOURCE_CLASS)を表します。
入力デバイスを特定するためのInputDeviceはInputEvent(MotionEvent, KeyEvent)から取得できます。
以下はサンプルコードです
MotionEventの場合
@Override public boolean onTouchEvent(MotionEvent event) { // InputDeviceの取得 InputDevice inputDevice = event.getDevice(); int deviceId = event.getDeviceId(); // デバイスIDを取得 int source = event.getSource(); Log.d("TouchEvent", "Input Device " + deviceId + " Source:" + source + " X:" + event.getX() + ",Y:" + event.getY()); return true; }
MotionEvent#getDeviceでInputDeviceを取得できます。同時にgetDeviceIdでデバイスIDを取得していますが、デバイスIDに関しては、どのデバイスからの入力なのか、判断のために利用します(今回は取得して表示)。ユニークであることは保証されていますが、Android端末の種類によって値は異なりますので注意してください。
MotionEvent#getSource()で入力デバイスを取得できます。
Logcat
12-20 18:44:04.613: DEBUG/TouchEvent(369): Input Device 0 Source:4098 X:188.0,Y:213.0 12-20 18:44:04.703: DEBUG/TouchEvent(369): Input Device 0 Source:4098 X:188.0,Y:213.0
Source:4098 はSOURCE_TOUCHSCREENですね。
KeyEventの場合
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO 自動生成されたメソッド・スタブ // InputDeviceの取得 InputDevice inputDevice = event.getDevice(); int deviceId = event.getDeviceId(); // デバイスIDを取得 int source = event.getSource(); Log.d("KeyEvent", "Input Device " + deviceId + " Source:" + source + " key:" + event.getKeyCode()); return super.onKeyDown(keyCode, event); }
KeyEventの場合もMotionEventと同様です。
Sourceは257(=SOURCE_KEYBOARD)です。
Logcat
12-20 18:44:17.772: DEBUG/KeyEvent(369): Input Device 0 Source:257 key:34 12-20 18:44:18.283: DEBUG/KeyEvent(369): Input Device 0 Source:257 key:35