一、事件分发机制流程
(1)Activity的事件分发
- Activity.dispatchTouchEvent()方法,内部调用getWindow.superDispatchTouchEvent()方法。
- 因为Window是抽象方法,所以调用子类PhoneWindows.superDispatchTouchEvent()方法,内部调用
mDecor.superDispatchTouchEvent()方法。 - DecorView继承于FrameLayout作为顶层View,是所有界面的父类。而FrameLayout作为ViewGroup的子类,所以直接调用了ViewGroup的dispatchTouchEvent()。
- ViewGroup.dispatchTouchEvent()
true:Activity.dispatchTouchEvent()返回为true
false:Activity.onTouchEvent()
super:将事件传递到ViewGroup.onInterceptTouchEvent()
(2)ViewGroup的事件分发
- ViewGroup.dispatchTouchEvent()调用ViewGroup.onInterceptTouchEvent()方法拦截事件。
- ViewGroup.onInterceptTouchEvent()默认不拦截向下传递,拦截需要手动复写设置。
true:拦截事件不允许事件继续向子View传递,调用ViewGroup.dispatchTouchEvent()自己处理事件:onTouch → onTouchEvent → onClick。
false:不拦截允许事件继续向子View传递,遍历ViewGroup中所有子View,找到被点击的子View,调用子View的dispatchTouchEvent()方法。
super:不拦截允许事件继续向子View传递,遍历ViewGroup中所有子View,找到被点击的子View,调用子View的dispatchTouchEvent()方法。
(3)View的事件分发
- View.dispatchTouchEvent()方法调用View.onTouch方法判断是否消费事件。返回true事件被消费,dispatchTouchEvent()方法返回true;返回false事件没有被消费继续向下传递,dispatchTouchEvent()调用View.onTouchEvent方法。
- onTouchEvent()判断当前点击和长按点击有一个为true,onTouchEvent()就返回为true消费掉当前事件;false将事件传给ViewGroup.onTouchEvent()方法;
- mOnClickListener不为空,调用onClick方法。
(4)事件分发工作流程
- Activity.dispatchTouchEvent()
true:消费
false:Activity.onTouchEvent()
super:ViewGroup.dispatchTouchEvent() - ViewGroup.dispatchTouchEvent()
true:消费
false:Activity.onTouchEvent()
super:ViewGroup.onInterceptTouchEvent() - ViewGroup.onInterceptTouchEvent()
true:ViewGroup.onTouchEvent()
false:View.dispatchTouchEvent()
super:View.dispatchTouchEvent() - View.dispatchTouchEvent()
true:消费
false:ViewGroup.onTouchEvent()
super:View.onTouchEvent() - View.onTouchEvent()
true:消费
false:ViewGroup.onTouchEvent()
super:View.onTouchEvent() - ViewGroup.onTouchEvent()
true:消费
false:Activity.onTouchEvent()
super:Activity.onTouchEvent() - Activity.onTouchEvent()
true:无处理结束
false:无处理结束
super:无处理结束