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

How to distinguish mouse events from touchscreen events?

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

event.getSource() returns:

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

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

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