1、明确几个概念
事件分发对象:指的是motionevent即点击事件。所谓点击事件的事件分发,其实就是对motionevent事件的分发过程,即当一个motionevent产生以后,系统需要把这个事件传递给一个具体的view,而这个传递的过程就是分发过程。
时间序列:指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程产生的一系列事件,这个事件序列以down事件开始,中间含有数量不定的move事件,最终以up事件结束。
传递顺序:Activity -> Window -> View
主要调用的三个方法:dispatchTouchEvent(是否分发)、onInterceptTouchEvent(是否拦截)、onTouchEvent(是否消耗)。
当一个点击操作发生时,事件最先传递给当前Activity,由Activity的dispatchTouchEvent来进行事件派发---事件起点;
Activity中的dispatchTouchEvent调用Window的superDispatchTouchEvent方法进行派发-----事件到达Window;
Window的superDispatchTouchEvent调用DecorView的superDispatchTouchEvent方法进行派发----事件到达DecorView;
DecorView的superDispatchTouchEvent调用自己的dispatchTouchEvent方法进行派发;
DecorView的dispatchTouchEvent调用ViewGroup的dispatchTouchEvent方法----事件到达ViewGroup;
2、一些简写
由于DecorView和PhoneWindows不好打印,但是DecorView是一个FrameLayout,FrameLayout的继承ViewGroup,可以推测出是否经过DecorView,但是PhoneWindows我只能猜测,如果猜测不对还请联系我。
2、全部返回的是super
3、ViewGroup分发事件的情况
(1)、ViewGroup拦截DOWN事件时
(2)、ViewGroup不拦截DOWN事件时
不消耗DOWN事件时,和情况2一样;
消耗DOWN事件时,和情况3中的(1)消耗DOWN事件一样。
4、View分发事件的情况(GroupView返回的都是super)
(1)消耗DOWN事件
(2)不消耗DOWN事件
和情况2一样
5、FLAG_DISALLOW_INTERCEPT标记
这个标记位通过requestDisallowInterceptTouchEvent方法来设置的,一般用于子View中。这个标记位一旦后,ViewGroup将无法拦截除了DOWN以外的其它点击事件。由于点击事件是DOWN时,会重置这个标记位导致这个标记位无效,所以这个标记位一般在子View的onTouchEvent事件中设置在构造函数中设置一般无效。
6、onTouch方法
当GroupView拦截事件后mOnTouchListener==1时调用onTouch方法,不在执行onTouchEvent方法了。
7、onClick方法
当mOnClickListener== 1时,在onTouchEvent方法中调用onClick方法。