17

好吧,这个问题相当简单——我如何在 android 2/3/4 中处理左/右/中键、滚轮和(!)悬停移动。

我一直在研究这个话题,发现了以下内容

  • 在 api 14 中,我们几乎可以用花哨的新 MotionEvent 处理任何事情
  • 自 api 12(仍然缺少蓝牙)(UPD OA backported to 2.3.4)以来,我们也有似乎与 USB 鼠标兼容的 Open Accessory
  • 鼠标实际上在具有 ICS 和 Honeycomb 和 cyanogen 2.3.7 的平板电脑上运行良好,但就像在每个按钮上单击一样。我想知道有没有办法拦截鼠标消息。

请帮助我了解如何在每个版本的 android 中以最简单和正确的方式处理蓝牙和 USB 鼠标。或者说不可能。

UPD2:似乎只有 3.1+ 中的 USB 主机,而 USB 附件对这项任务无用

4

2 回答 2

22

这些是我的发现:

对于 API 级别 < 9:

  • 外部鼠标主按钮的处理方式与普通手指触摸一样。似乎没有办法检测到鼠标。
  • 辅助按钮是通过一个KeyEventwith发送的KeyEvent.KEYCODE_BACK。无法区分实际的“返回”按下和辅助按钮按下。

对于 API 级别 9+:

  • 添加了一种新方法MotionEvent.getSource()。我用这个来检测输入是否来自鼠标。
  • 辅助按钮仍通过KeyEventwith调度KeyEvent.KEYCODE_BACK。在某些设备上KeyEvent.getSource()返回InputDevice.SOURCE_MOUSE,因此辅助按钮检测在某些情况下有效。

对于 API 级别 12+:

  • OnGenericMotionListener已添加。我用这个来检测鼠标移动ACTION_HOVER_MOVE和滚轮变化ACTION_SCROLL

对于 API 级别 14+:

  • 新方法MotionEvent.getButtonState()。我跟踪这个以区分在MotionEvent.getActionMasked()isACTION_MOVE或.ACTION_DOWNACTION_UP

我没有研究过 Api Level 15/16 或工具类型,因为我能够使用上面描述的内容跟踪所有鼠标事件。如果有人有其他信息或者我错过了 15/16/tooltypes,那将会很有趣。

于 2012-10-05T10:03:56.520 回答
1

好的。我想我有一个线索。我已经阅读了有关 android 3.x/4.x 的亮点并意识到......

  1. 我们可以在 android 3+ 中使用鼠标,在旧版本中,鼠标是特定于设备的

  2. 我们可以从任何来源(BT 或 USB)拦截已识别的鼠标事件...

2.1。...滚动或悬停移动在 3.1+ 中 onGenericMotionEvent

2.2. ... 主要、次要和三次按钮以及在 android 4.0+ 中悬停进入/离开(最后是 TOOL_TYPE_MOUSE 常量)

另一种选择是在主机模式下从蓝牙套接字或 USB 解析相当低级的数据。

我对吗?仍然想知道是否有人有更好的解决方案。

于 2012-10-03T13:25:31.173 回答