You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:29:55