返回

关于onInterceptTouchEvent一旦返回true,不会再被调用问题

Android

事件分发机制概述

在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,后续事件就不会再被调用。