关于onInterceptTouchEvent一旦返回true,不会再被调用问题
2024-01-09 18:09:39
事件分发机制概述
在Android中,事件分发是一个复杂的过程,涉及多个组件的协同工作。事件分发从Activity开始,然后传递给DecorView、ViewGroup、View,最终到达最低级的View。在分发过程中,每个组件都有机会处理事件或将事件传递给下一个组件。
onInterceptTouchEvent方法的作用
onInterceptTouchEvent是View类中的一个重要方法,用于决定当前View是否拦截事件。如果返回true,则表示该View拦截事件,后续事件不再分发到子view。如果返回false,则表示该View不拦截事件,事件继续分发到子view。
分析onInterceptTouchEvent返回true时后续事件不被调用的原因
当onInterceptTouchEvent返回true时,该View就拦截了事件,事件不再分发到子view。此时,该View会处理所有后续的事件,包括ACTION_MOVE事件。ACTION_MOVE事件不会再被调用,因为该事件已被当前View消费。
示例代码
以下是一个示例代码,演示了onInterceptTouchEvent返回true时,后续事件不被调用的情况:
public class MyView extends View {
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
return true;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
// ACTION_MOVE事件不会被调用
Log.d("MyView", "ACTION_MOVE");
}
return true;
}
}
在这个示例中,MyView的onInterceptTouchEvent方法在ACTION_DOWN事件时返回true,表示该View拦截事件。因此,ACTION_MOVE事件不会被调用,因为该事件已被MyView消费。
结论
在Android中,onInterceptTouchEvent方法用于决定当前View是否拦截事件。如果返回true,则表示该View拦截事件,后续事件不再分发到子view。此时,该View会处理所有后续的事件,包括ACTION_MOVE事件。因此,如果onInterceptTouchEvent返回true,后续事件就不会再被调用。