1.ViewGroup有三个方法:

Touch 事件相关方法

方法功能

标记

dispatchTouchEvent(MotionEvent ev)

事件分发

1

onInterceptTouchEvent(MotionEvent ev)

事件拦截

2

onTouchEvent(MotionEvent ev)

处理事件

3

这样,ViewGroup和View对应的方法:

ViewGroup/View

方法

ViewGroup

1、2、3

View

1、3

第一次进入ViewGroup:



走1:


Return true:停止传递,直接走自己的3方法
False:传给下一个ViewGroup的1方法
Return super.dispatchTouchEvent(ev):走自己的2方法—–>




走2:


True:停止传递,走自己的3方法
False:传给下一个View的1方法
Return super.onInterceptTouchEvent(ev):走自己的3方法(与true相同)—–>(默认的是父类拦截)




走3:


True:自己处理掉事件
False:事件向上传递,由上一级的3处理
Return super.onTouchEvent(ev):事件向上传递,由上一级的3处理(与false相同)—->




事件回传的时候走的是各自View的3方法:


true:在当前View消费掉事件
False:返到上一级,由上一级的onTouchEvent处理—->




上一级返回为true就处理;返回false就接着往上一级传递!如果最外层的View没有处理,事件消失。

如果按住控件不放,再移到其它地方,事件就会取消。

对应图示:

Android 简述事件分发机制_控件

2.焦点冲突

比如:ListView条目点击事件,里面的子view还有点击事件:在item的根节点里面设置:

​android:descendantFocusability=“blocksDescendants”

3.请求父容器不要拦截我的事件:

​getParent().requestDisallowInterceptTouchEvent(false);