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

