View的事件分发机制分析

122 阅读1分钟

以一个简单的demo来分析事件分发机制,点击textView以后,控制台打印的事件。

事件传输顺序

一个事件序列:表示手指第一次touch屏幕DOWN直到手指离开屏幕UP,期间一些列事件ACTION

一个点击事件产生以后,他的传输过程以这个顺序传输: Activity -> Window(PhoneWindow) -> (DecorView)-> ViewGroup -> View 可以看到事件传输由dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent 3个方法共同作用的。

dispatchTouchEvent(MotionEvent ev)

对事件进行分发,view一旦接收到事件就会调用它,由它来对事件进行分配,它的返回结果代表是否事件被消费。若该view的onTouchEvent返回true,或者它的子view们的dispatchTouchEvent返回true,则返回true。

onInterceptTouchEvent(MotionEvent ev)

拦截事件,返回结果为ture的时候表示拦截该事件,事件(包括同一个事件序列)不会往下传递全部交由它处理,并且在同一个事件序列里不在调用这个方法。会直接调用该viewGroup的onTouchEvent,如果onTouchEvent返回true,代表事件被消费,如果为false,则事件将向上传递,如果一直没被消费则由Activit消费此事件。

onTouchEvent(MotionEvent event)

由dispatchTouchEvent里面调用,用于处理事件,返回false, 代表不消费事件,并且不再接收同一个事件序列的事件。