首页 > 代码库 > 事件分发时候的onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent调用顺序

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

一直想弄清楚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。

技术分享

 

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