一.Activity的事件分发机制
当一个点击事件发生后,最先由Activity.dispatchTouchEvent()分发,接着是getWindow().superDispatchTouchEvent(),然后是mDecor.superDispatchTouchEvent()(即ViewGroup的dispatchTouchEvent()),从这里开始区分,
如果返回false直接走Activity.onTouchEvent(),无论这个方法返回什么,这个事件直接结束.
如果返回true,事件直接结束.
二.ViewGroup的事件分发机制
ViewGroup.dispatchTouchEvent(),然后调用ViewGroup的拦截方法onInterceptTouchEvent(),从这里开始区分
如果返回false(默认),那么事件会继续向子View传递,找到被点击的子View(通过for循环遍历ViewGroup的所有子View),调用子View的dispatchTouchEvent(),这就实现了ViewGroup的View的传递.
如果返回true或者无子View点击事件(点击空白)不允许事件继续向子View传递,然后调用super.dispatchTouchEvent(),自己处理事件,并调用自身的onTouch,接着是onTouchEvent(),performClick(),onClick().
三. View事件的分发机制
View.dispatchTouchEvent()只有满足三个条件时才会返回true
条件1.
mOnTouchListener != null 即mOnTouchListener变量在View.setOnTouchListener()方法里赋值
条件2:(mViewFlags & ENABLED_MASK) == ENABLED
a. 该条件是判断当前点击的控件是否enable
b. 由于很多View默认enable,故该条件恒定为true
条件3:mOnTouchListener.onTouch(this, event)
即 回调控件注册Touch事件时的onTouch()
若在onTouch()返回true,就会让上述三个条件全部成立,从而使得View.dispatchTouchEvent()直接返回true,事件分发结束
若在onTouch()返回false,就会使得上述三个条件不全部成立,从而使得View.dispatchTouchEvent()中跳出If,执行onTouchEvent(event)
每当控件被点击时调用View.dispatchTouchEvent(),再调用onTouch(),从这里区分
如果onTouch返回true,事件被消费,不会在向下传递,不调用onClick(),结束
如果onTouch返回false,事件继续向下传递调用onTouchEvent(),调用performClick(),onClick(),结束
注:onTouch先执行于onClick