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);
Android Touch事件流程解析
本文详细解析了Android中ViewGroup和View的Touch事件处理流程,包括dispatchTouchEvent、onInterceptTouchEvent及onTouchEvent方法的作用和调用顺序。同时介绍了焦点冲突处理方式及如何请求父容器不要拦截事件。
1390

被折叠的 条评论
为什么被折叠?



