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

NativeActivity中AMotionEvent_getButtonState鼠标释放时返回0的问题

问题原因

在Android NativeActivity的鼠标事件机制中,AMOTION_EVENT_ACTION_BUTTON_RELEASE事件触发时,AMotionEvent_getButtonState()返回的是按钮释放后的当前状态——也就是已经移除了刚释放的那个按钮的标记位,所以此时返回0是正常行为(如果这是最后一个按下的按钮)。

你要获取的被释放的具体按钮,不能通过AMotionEvent_getButtonState()拿到,得用AMotionEvent_getActionButton()接口,这个接口专门用来返回触发当前按钮事件(按下/释放)的具体按钮值。

另外你提到释放时日志输出Mouse Button Press: 0,核对代码后发现AMOTION_EVENT_ACTION_BUTTON_RELEASE分支的日志字符串是"Mouse Button Release: %d",如果实际输出是Press,大概率是代码拼写错误或者测试时的代码未同步,需要你检查日志语句。

修复后的代码
// LOGI is a macro for logging to Logcat

int32_t handle_app_input(struct android_app* app, AInputEvent* event)
{
    int32_t event_type = AInputEvent_getType(event);
    
    switch(event_type)
    {
        case AINPUT_EVENT_TYPE_MOTION:
        {
            int32_t motion_input_action = AMotionEvent_getAction(event);
            int32_t event_pointer_index = (motion_input_action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
            motion_input_action &= AMOTION_EVENT_ACTION_MASK;
            
            switch(motion_input_action)
            {
                case AMOTION_EVENT_ACTION_BUTTON_PRESS:
                {
                    int32_t mouse_button_state = AMotionEvent_getButtonState(event);
                    LOGI("Mouse Button Press: %d", mouse_button_state);
                    
                    break;
                }
                case AMOTION_EVENT_ACTION_BUTTON_RELEASE:
                {
                    // 改用AMotionEvent_getActionButton获取被释放的按钮
                    int32_t released_button = AMotionEvent_getActionButton(event);
                    LOGI("Mouse Button Release: %d", released_button);                   
                    
                    break;
                }
                default:
                    break;
            }
        }
        return 1;
    }
    
    return 0;
}
补充说明
  • AMotionEvent_getButtonState():返回当前所有处于按下状态的按钮的位掩码,适用于ACTION_BUTTON_PRESS或者持续按下的场景(比如长按过程中)。
  • AMotionEvent_getActionButton():返回触发当前按钮事件(按下/释放)的单个按钮值,仅在ACTION_BUTTON_PRESS和ACTION_BUTTON_RELEASE事件中有效。

内容的提问来源于stack exchange,提问作者Live Dojo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:38:57