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没有处理,事件消失。
如果按住控件不放,再移到其它地方,事件就会取消。
对应图示:
2.焦点冲突
比如:ListView条目点击事件,里面的子view还有点击事件:在item的根节点里面设置:
android:descendantFocusability=“blocksDescendants”
3.请求父容器不要拦截我的事件:
getParent().requestDisallowInterceptTouchEvent(false);