Android 6.0平板如何判断MotionEvent.ACTION_UP时松开的鼠标按键
解决Android 6.0平板鼠标松开事件无法判断按键的问题
这个问题我之前也碰到过,Android 6.0里处理鼠标松开事件确实有个小坑——因为ACTION_UP触发时,getButtonState()返回的是当前正在按下的按键集合,松开后自然就是0了,没法直接通过它判断是哪个键松了。
核心原因
getButtonState()的设计是返回当前所有处于按下状态的按键掩码,当某个按键松开时,这个掩码里就不再包含该按键,所以返回0。而要判断是哪个按键触发了松开事件,得用另一个方法:event.getActionButton(),它会直接返回触发本次ACTION_UP(或ACTION_POINTER_UP)事件的具体按键。
修改后的代码示例
下面是适配后的代码,能准确监听左右键的按下和松开事件:
@Override public boolean onTouch(View v, MotionEvent event) { if (event.getSource() == InputDevice.SOURCE_MOUSE) { int action = event.getActionMasked(); int targetButton = event.getActionButton(); switch (action) { // 处理按键按下事件 case MotionEvent.ACTION_DOWN: int buttonState = event.getButtonState(); if ((buttonState & MotionEvent.BUTTON_PRIMARY) != 0) { // 鼠标左键按下 // 这里写你的业务逻辑 } else if ((buttonState & MotionEvent.BUTTON_SECONDARY) != 0) { // 鼠标右键按下 // 这里写你的业务逻辑 } break; // 处理单按键松开事件 case MotionEvent.ACTION_UP: if (targetButton == MotionEvent.BUTTON_PRIMARY) { // 鼠标左键松开 // 这里写你的业务逻辑 } else if (targetButton == MotionEvent.BUTTON_SECONDARY) { // 鼠标右键松开 // 这里写你的业务逻辑 } break; // 处理多按键同时操作的情况(比如左右键一起按后松开) case MotionEvent.ACTION_POINTER_DOWN: case MotionEvent.ACTION_POINTER_UP: if (targetButton == MotionEvent.BUTTON_PRIMARY) { String actionDesc = action == MotionEvent.ACTION_POINTER_DOWN ? "按下" : "松开"; // 鼠标左键"+actionDesc } else if (targetButton == MotionEvent.BUTTON_SECONDARY) { String actionDesc = action == MotionEvent.ACTION_POINTER_DOWN ? "按下" : "松开"; // 鼠标右键"+actionDesc } break; } return true; // 消费鼠标事件,避免传递给其他视图 } return super.onTouchEvent(event); }
额外说明
getActionButton()从API 18开始引入,Android 6.0(API 23)完全支持,不用担心兼容性问题。- 如果你的场景不需要处理多按键同时操作,可以忽略
ACTION_POINTER_DOWN和ACTION_POINTER_UP的分支。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

