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

MotionEvent.ACTION_UP在onTouchEvent中未触发,求原因及解决方案?

问题原因

你的onTouchEvent方法返回false是导致ACTION_UP事件无法触发的核心原因。

Android触摸事件的传递规则是:当View在处理ACTION_DOWN事件时返回false,系统会判定该View不消费后续的触摸事件(包括ACTION_UP、ACTION_MOVE等),所以松开手指时的事件根本不会传递到这个onTouchEvent方法中。

在你的代码里,不管是否命中左按钮区域,onTouchEvent最终都返回false——哪怕按下按钮时触发了ACTION_DOWN的逻辑,系统也不会再给这个View发送后续的ACTION_UP事件。

修复方案

修改onTouchEvent的返回逻辑,同时优化触摸事件的处理逻辑:

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (x >= 100 && x < 400 && y >= 1700 && y < 3600) {
                leftButton.isDown = true;
                Log.d("Touch Event", "Pressed Down");
                // 命中按钮区域,返回true表示要消费后续触摸事件
                return true;
            }
            // 没命中按钮,返回false让事件继续传递
            break;

        case MotionEvent.ACTION_UP:
            leftButton.isDown = false;
            Log.d("Touch Event", "Released");
            // 处理完UP事件后返回true
            return true;
    }
    // 其他事件默认交给父类处理
    return super.onTouchEvent(event);
}
额外优化建议
  • 把按钮的坐标范围抽成常量(比如private static final int LEFT_BUTTON_LEFT = 100;),方便后续维护和修改。
  • 如果担心用户按下按钮后滑动到区域外再松开,可以在ACTION_UP时也判断坐标,或者在ACTION_MOVE中补充按钮状态的切换逻辑,让交互更严谨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:37:04