【问题标题】:How to distinguish mouse events from touchscreen events?如何区分鼠标事件和触摸屏事件?
【发布时间】:2019-08-08 20:59:24
【问题描述】:

在我的应用程序中,我需要知道哪个输入设备产生了触摸事件:鼠标、触摸屏、触摸板或其他东西。

event.getSource() 返回:

for mouse: 8194
for touchscreen: 4098

我已经做了一个输出到 logcat 类型源的方法:

void dumpSource(MotionEvent e) {
    int s = e.getSource();
    Log.e("LorieService", "Motion event is from sources: " +
            ((s&InputDevice.SOURCE_KEYBOARD)!=0?"keyboard ":"") +
            ((s&InputDevice.SOURCE_DPAD)!=0?"dpad ":"") +
            ((s&InputDevice.SOURCE_GAMEPAD)!=0?"gamepad ":"") +
            ((s&InputDevice.SOURCE_TOUCHSCREEN)!=0?"touchscreen ":"") +
            ((s&InputDevice.SOURCE_MOUSE)!=0?"mouse ":"") +
            ((s&InputDevice.SOURCE_STYLUS)!=0?"stylus ":"") +
            ((s&InputDevice.SOURCE_BLUETOOTH_STYLUS)!=0?"bt_stylus ":"") +
            ((s&InputDevice.SOURCE_TRACKBALL)!=0?"trackball ":"") +
            ((s&InputDevice.SOURCE_MOUSE_RELATIVE)!=0?"mouse_relative ":"") +
            ((s&InputDevice.SOURCE_TOUCHPAD)!=0?"touchpad ":"") +
            ((s&InputDevice.SOURCE_TOUCH_NAVIGATION)!=0?"touch_navigation ":"") +
            ((s&InputDevice.SOURCE_ROTARY_ENCODER)!=0?"rotary_encoder ":"") +
            ((s&InputDevice.SOURCE_JOYSTICK)!=0?"joystick ":"") +
            ((s&InputDevice.SOURCE_HDMI)!=0?"hdmi":"")

    );
}

但它为鼠标和触摸屏输出touchscreen mouse stylus bt_stylus

如何正确区分鼠标和触屏事件?

【问题讨论】:

  • 有 View.isInTouchMode() 方法,它是区分鼠标和触摸屏的答案,但不是游戏手柄。如果您从鼠标更改为触摸,它的行为是正确的,但是如果您使用触摸然后移动鼠标,则会出现光标但视图仍处于触摸模式。我只能将 ACTION_HOVER_MOVE 视为鼠标,它不会打扰我。
  • 但是游戏手柄和手写笔还是有问题

标签: java android input mouse touchscreen


【解决方案1】:

这不是检查它的方法。检查它的正确方法是type = s&InputDevice.SOURCE_MASK; 然后检查类型上的相等匹配。如果源的任何位对于两种设备类型相同,那么您执行此操作的方式将返回 true。类型本身不是位掩码,它是一个整数枚举。

【讨论】:

  • 好的。在 SDK 源代码中找到它。 InputDevice.SOURCE_TOUCHSCREEN = 4098 和 InputDevice.SOURCE_MOUSE = 8194 在我的例子中。
  • @TwaikYont 您只需检查 type == InputDevices.SOURCE_TOUCHSCREEN,无需查找值。事实上,如果你这样做,它的可读性就会降低。
  • 喜欢吗? switch(e.getSource()) { case InputDevice.SOURCE_TOUCHSCREEN: return onTouchscreen(v, event); case InputDevice.SOURCE_MOUSE: return onMouse(v, event); case InputDevice.SOURCE_GAMEPAD: 返回 onGamepad(v, event); }
  • 你需要使用我的代码来获取类型。然后打开类型
  • boolean isMouse = (e.getSource()&InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE ?
猜你喜欢
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多