事件分发时候的onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent调用顺序

本文详细解析了Android中触摸事件的处理流程,包括onTouchEvent、onInterceptTouchEvent和dispatchTouchEvent的执行顺序及其内部switch(event.getAction())的执行逻辑。通过具体代码示例和日志输出,帮助读者理解不同场景下这些方法的调用过程。

一直想弄清楚onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent的执行顺序,以及内部使用switch (event.getAction())中的执行顺序。趁这次机会赶紧弄清楚。

 

public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        Log.e(TAG, "onTouchEvent");
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.e(TAG, "onTouchEvent_ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.e(TAG, "onTouchEvent_ACTION_MOVE");
            break;
        case MotionEvent.ACTION_UP:
            Log.e(TAG, "onTouchEvent_ACTION_UP");
            break;
        default:
            break;
        }
        Log.e(TAG, "onTouchEvent_return");
        return isOnTouchEvent;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        Log.e(TAG, "onInterceptTouchEvent");
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.e(TAG, "onInterceptTouchEvent_ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.e(TAG, "onInterceptTouchEvent_ACTION_MOVE");
            break;
        case MotionEvent.ACTION_UP:
            Log.e(TAG, "onInterceptTouchEvent_ACTION_UP");
            break;
        default:
            break;
        }
        Log.e(TAG, "onInterceptTouchEvent_return");
        return isOnInterceptTouchEvent;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        super.dispatchTouchEvent(event);
        Log.e(TAG, "dispatchTouchEvent");
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.e(TAG, "dispatchTouchEvent_ACTION_DOWN");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.e(TAG, "dispatchTouchEvent_ACTION_MOVE");
            break;
        case MotionEvent.ACTION_UP:
            Log.e(TAG, "dispatchTouchEvent_ACTION_UP");
            break;
        default:
            break;
        }
        Log.e(TAG, "dispatchTouchEvent_return");
        return isDispatchTouchEvent;
    }

重写上面几个方法后。我们在LogCat中看看打印的结果。

一.isOnInterceptTouchEvent==true时。

1.isOnTouchEvent==true,isDispatchTouchEvent==true。

因为onInterceptTouchEvent返回true,这说明要拦截此事件,因此在同一个事件序列中该方法不会再次被调用。下同。

2.isOnTouchEvent==true,isDispatchTouchEvent==false。

3.isOnTouchEvent==false,isDispatchTouchEvent==true。

4.isOnTouchEvent==false,isDispatchTouchEvent==false。

二.如果isOnInterceptTouchEvent==false。

1.isOnTouchEvent==true,isDispatchTouchEvent==true。

因为onInterceptTouchEvent返回tfalse,这说明不拦截此事件,因此不调用onTouchEvent。下同。

 2.isOnTouchEvent==true,isDispatchTouchEvent==false。

 

3.isOnTouchEvent==false,isDispatchTouchEvent==true。

4.isOnTouchEvent==false,isDispatchTouchEvent==false。

 

转载于:https://www.cnblogs.com/tangZH/p/5931509.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值