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
相关产品推荐
相关产品推荐

