web-dev-qa-db-ja.com

Android)ですべてのマウスイベントを処理します

質問はかなり単純です-左/右/中央のクリック、ホイール、(!)ホバーの移動をどのように処理できますかAndroid 2/3/4。

私はこのトピックを掘り下げていて、次のことを見つけました

  • aPI 14では、新しいMotionEventを使用してほとんどすべてを処理できます
  • また、API 12以降はUSBマウスで問題ないように見えるオープンアクセサリもあります(Bluetoothがまだありません)(UPD OAは2.3.4にバックポートされています)
  • マウスは実際にはICSおよびHoneycombとシアン2.3.7のタブレットでうまく機能しますが、すべてのボタンを1回タッチするだけのように動作します。マウスメッセージを傍受する方法があるのでしょうか。

Androidの各バージョンでBluetoothとUSBマウスを最も簡単で正しい方法で処理する方法を理解するのを手伝ってください。またはそれは不可能だと言います。

UPD2:3.1以降でのみUSBホストのように見えますが、このタスクにはUSBアクセサリは役に立ちません

16
mjollneer

これらは私の発見です:

APIレベル<9の場合:

  • 外部マウスのプライマリボタンは、通常の指のタッチと同じように処理されます。マウスを検出する方法がないようです。
  • セカンダリボタンは、KeyEventと_KeyEvent.KEYCODE_BACK_を介してディスパッチされます。実際の「戻る」押下と2番目のボタン押下を区別する方法はありません。

Apiレベル9以降の場合:

  • 新しいメソッドが追加されましたMotionEvent.getSource()。これを使用して、入力がマウスからのものかどうかを検出します。
  • セカンダリボタンは、KeyEventを介して_KeyEvent.KEYCODE_BACK_でディスパッチされます。一部のデバイスでは、KeyEvent.getSource()が_InputDevice.SOURCE_MOUSE_を返すため、セカンダリボタンの検出が機能する場合があります。

Apiレベル12+の場合:

  • OnGenericMotionListenerが追加されました。これを使用して、_ACTION_HOVER_MOVE_でマウスの動きを検出し、_ACTION_SCROLL_でホイールの変化を検出します。

Apiレベル14以上の場合:

  • 新しいメソッドMotionEvent.getButtonState()MotionEvent.getActionMasked()が_ACTION_MOVE_、_ACTION_DOWN_、または_ACTION_UP_のときに、一次、二次、三次マウスボタンが押されたかどうかを区別するためにこれを追跡します。

上記で説明した方法ですべてのマウスイベントを追跡できるため、Apiレベル15/16またはツールタイプについては調べていません。誰かが追加情報を持っているか、私が15/16/tooltypesを見逃しているなら、興味深いでしょう。

20
Maik

OK。手がかりを得たと思います。私は読んだ Androidについてのハイライト 3.x/4.xそしてそれを実現した...

  1. Android 3+でマウスを使用できます。古いバージョンでは、マウスはデバイス固有です。

  2. 認識されたマウスイベントを任意のソース(BTまたはUSB)から傍受できます...

2.1。 ... onGenericMotionEventの3.1以降でスクロールまたはhover_move

2.2。 ...プライマリ、セカンダリ、およびターシャリボタンとホバーEnter/Leave in Android 4.0+(そして最後にTOOL_TYPE_MOUSE定数)

もう1つのオプションは、ホストモードでBluetoothソケットまたはUSBからかなり低レベルのデータを解析することです。

私は正しいですか?誰かがより良い解決策を持っているかどうかまだ疑問に思います。

1
mjollneer