以一个简单的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, 代表不消费事件,并且不再接收同一个事件序列的事件。