- 三个主要对象:
一个事件产生之后,都是先传给Activity,在传给ViewGroup,最后传给View。
- 三个重要方法:
这里要注意一点,Activity和View是没有onInterceptTouchEvent()也就是事件拦截这个方法的,仔细想想就可以想明白,Activity是处于分发机制的最顶端,如果一开始就吧事件拦截了,那么会导致整个屏幕都无法响应用户的操作;而view处于事件分发的最末端,它不需要拦截,事件分发到View的时候,view能处理就处理,不处理就返回给他的父控件;
- 事件分发流程:
在讲上面这个图之前呢,我先解释一下这个phonewindow和decorview
手机屏幕我们可以称为一个窗口,也就是一个window,在android中这个window类是一个抽象类,它规定了一些管理窗口的方法,但是具体实现是由它的唯一实现类phonewindow去实现的,这样phonewindow就是整个屏幕的实际“掌控者”,而phonewindow又是通过它的内部类decorview去对view进行管理;
接下来进行流程分析,我们就以点击事件为例:
当用户点击了屏幕,首先Activity先监测到,事件先传递到Activity中,Activity通过它的dispatchTouchEvent将事件分发到phoneWindow,phonewindow则会调用superdispatchTouchEvent方法的内部是调用了其内部类DecorView的superdispatchTouchEvent,而DecorView又会调用dispatchTouchEvent去进行事件分发,如果不拦截事件,那么就会继续下传到rootview,rootview中的操作是一样的,同样在dispatchTouchEvent内部调用onInterceptTouchEvent去判断是否拦截,不拦截就会把事件分发给下一个viewgroupA,拦截就直接在onTouchEvent返回true,viewgroupA中做的判断也是一样,最后事件传递到view1,view1是最底层控件,不会有onInterceptTouchEvent,它的选择就只有处理后不处理,处理就在onTouchEvent进行处理并返回true,不处理的话事件也不会被销毁,view1这时会把事件回传,经过上述流程后回传给activity,如果Activity还不处理,那么这个事件才会被销毁;