Activity、ViewGroup和View触摸事件分发机制总结

View触摸屏事件传递机制
整个View的事件转发流程是:
View.dispatchEvent->View.setOnTouchListener->View.onTouchEvent
View事件分发机制图:

Activity、ViewGroup和View触摸事件分发机制总结
文章图片
View事件分发
1、View的触摸事件首先执行dispatchTouchEvent()方法。
2、其次在dispatchTouchEvent()方法中执行view.setOnTouchListener()方法的判断(onTouch()方法啦),如果OnTouchListener不为null且返回true,则表示事件被消费,onTouchEvent不会被执行,dispatchTouchEvent也返回true;否则之后执行onTouchEvent()方法,dispatchTouchEvent返回值与onTouchEvent返回一样。。
3、最后在onTouchEvent()的ACTION_UP分支执行onClick()事件
4、当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发下一个action(也就是说dispatchTouchEvent返回true才会进行下一次action派发)。
ViewGroup触摸屏事件传递机制
1、Android事件派发先传递到最顶层的ViewGroup,再由ViewGroup递归传递给View(举个例子,比如国家下发文件通知,肯定是先发给总部,再由总部下发给员工,不可能先发给员工再发给总部)。如果传递给了子View,则ViewGroup的onTouchEvent不会被触发。
2、在ViewGroup中通过onInterceptTouchEvent对事件进行拦截,返回true代表不允许事件继续向子View传递。返回false代表不对事件拦截,默认为false。
3、子View将事件消费掉,ViewGroup中将无法接收任何事件。
4、子View可以调用getParent().requestdisallowInterceptTouchEvent()阻止父ViewGroup对其事件拦截。
Activity触摸屏事件传递机制
【Activity、ViewGroup和View触摸事件分发机制总结】1、首先会触发Activity的dispatchTouchEvent方法。
2、dispatchTouchEvent方法中如果是ACTION_DOWN的情况下会接着触发onUserInteraction方法。
3、接着在dispatchTouchEvent方法中会通过Activity的root View(id为content的FrameLayout),实质是ViewGroup,通过super.dispatchTouchEvent把touchevent派发给各个activity的子view,也就是我们再Activity.onCreat方法中setContentView时设置的view。
4、若Activity下面的子view拦截了touchevent事件(返回true)则Activity.onTouchEvent方法就不会执行。

    推荐阅读