日別アーカイブ: 2011年8月10日

Android 3.1 と GamePad のイベントコード

Acer ICONIA TAB A500 が Android OS 3.1 になったので早速つないでみました。
Android 3.1 からは USB でゲームパッドがつながります。

 ・Xbox 360 用の USB コントローラ
 ・Playstation3 用コントローラを USB (有線)接続

どちらもきちんと認識しました。
判定の仕方は下記のとおりです。

ボタン類は通常のキーボードと同じ、onKey~ でキーコードとして通知されます。

十字キーはカーソルキーと同じ KEYCODE_DPAD_UP/DOWN/LEFT/RIGHT
(19~22) です。
そのため取り敢えずつないだけでも HOME 画面などでカーソル移動に使えます。
未確認ですが、おそらく KeyEvent.isGamepadButton() で本来のカーソルキーと
区別できると思われます。
訂正2011/08/10 13:22

ボタン類は専用のキーコード(96~)が割り当てられているようです。

KEYCODE_BUTTON_A        96  □
KEYCODE_BUTTON_B        97  △
KEYCODE_BUTTON_C        98
KEYCODE_BUTTON_X        99  ×
KEYCODE_BUTTON_Y       100  ◯
KEYCODE_BUTTON_Z       101
KEYCODE_BUTTON_L1      102
KEYCODE_BUTTON_R1      103
KEYCODE_BUTTON_L2      104
KEYCODE_BUTTON_R2      105
KEYCODE_BUTTON_THUMBL  106
KEYCODE_BUTTON_THUMBR  107
KEYCODE_BUTTON_START   108
KEYCODE_BUTTON_SELECT  109  (BACK)
KEYCODE_BUTTON_MODE    110  (Xbox)
                       188  (PS)

Xbox360 と PS3 ほぼ上記のキーアサイン通りなのですが微妙に互換性がありません。
BUTTON_X は 360 だと (X) ボタンで PS3 は (×) バツボタンです。
AB/XY が入れ替わっているような感じです。
360 Pad 中央の Xbox ボタンは KEYCODE_BUTTON_MODE ですが、
PS ボタンは異なる数値 (188) でした。

アナログ操作は onGenericMotionEvent で MotionEvent が来ます。
L/Rトリガは 360 は MotionEvent だけですが PS3 だと
MotionEvent + BUTTON_L2/R2 の両方が返るようです。

もう少し調査が必要ですが、取り敢えず PC 等と操作方法の
互換性が保てるので便利になりそうです。