首先明确要分析的对象为MotionEvent,所谓的点击事件的事件分发就是对MotionEvent事件分发的过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而传递的过程就是分发的过程,这个过程由3个重要的方法共同完成:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。
- dispatchTouchEvent
用来进行事件分发,如果能够传递给当前view,那么此方法一定会被调用,返回结果受当前view的onTouchEvent和下级view的dispatchTouchEvent方法影响,表示是否消耗当前事件。 - onInterceptTouchEvent
在上述方法内部调用,用来判断是否拦截某个事件,如果当前view拦截了某个事件,那么在同一个事件序列当中,此方法不会被在此调用,返回结果表示是否拦截当前事件。 - onTouchEvent
在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前view无法再次接受到事件。
对于一个根ViewGroup来说,当点击事件产生后,它的dispatchTouchEvent就会被调用,在该方法内部会判断onInterceptTouchEvent方法的返回值,如果onInterceptTouchEvent返回true就表示它要拦截当前事件,拦截后就会交给onTouchEvent处理,如果它的onInterceptTouchEvent返回false,就表示它不拦截当前事件,这时当前事件就会传递给它的子元素,接着它的子元素的dispatchTouchEvent就会被调用,如此反复直到事件被处理。如果传递到最低层控件依然没有被处理,则会从最底层依次调用父控件的onTouchEvent方法。
未完待续…