Android中整个touch事件的分发流程:
手指点击屏幕 --> 屏幕驱动通知linux系统 ---> 系统通知WindowManagerService(WMS) --> WMS分发给Activity --> Activity再分发给view
1.onInterceptTouchEvent
onInterceptTouchEvent是viewGroup中的方法,非ViewGroup是没有的。该方法有个 boolean类型的返回值,当返回false(默认值)的时候,则表示将touch事件继续向下分发给子view。如果返回true则不再将事件分发,意思就是子view不会接收到touch事件
2.dispatchTouchEvent
dispatchTouchEvent是View中的方法,即所有的view都拥有此方法。dispatchTouchEvent的作用是事件分发。
在ViewGroup中重写了dispatchTouchEvent方法,普通的view中直接判断onTouchEvent返回是否为true,如果为true则dispatchtouchEvent也为true。但viewGroup中却不是,viewGroup中会先去调用onInterceptTouchEvent返回是否为true,如果不为true,则会去分发子控件中的touch事件,如果事件被子控件消费了,那么它会返回true,且不会调用自己的onTouchEvent方法
假如,该view的dispatchtouchEvent方法返回了false,那么该view在这次touch事件中将不会再被调用,包括该view的子view。
3.onTouchEvent
ontouchEvent是对touch事件的消费,整个调用链中,只会有一个view的onTouchEvent方法会被执行,谁消费了就谁执行,如果onInterceptTouchEvent不拦截子view,那么就会由子view先决定是否进行消费,子view不消费才会轮到上层view去消费。