1. View.onTouchEvent()
- 这里只说点击事件的事件分发
滑动冲突请看这一篇
- 如果View可点击的,clickable为true
比如 Button: super.onTouchEvent(event) 返回true
- 如果View不可点击,clickable为false
比如 TextView: super.onTouchEvent(event) 返回false
- 如果想让move和up都执行,那么需要onTouchEvent返回true。
但是明确的返回true的话,点击事件不会被执行(至于为什么请自行上网查);如果又想让move、up执行,又想有点击事件怎么办?设置该控件的clickable为true。
比如:button就自带clickable=true。剩下的 如TextView就需要手动设置clickable。
以上总结:
clickable为true,super为true;
clickable为false,super为falsereturn false,View只能处理DOWN事件,并且down之后的事件都不会被接收到
return true,则View的DOWN、MOVE、UP都能触发
2. ViewGroup.onInterceptTouchEvent()
return true,由viewGroup本身的onTouchEvent处理,事件不再往下分发
return false,由子view的onTouchEvent处理它的move和up是否执行,由子View的onTouchEvent返回值决定。
- 子view的onTouchEvent返回值为true,则onInterceptTouchEvent的move和up会执行
3. dispatchTouchEvent()
return true ,move和up都能走,
return false,只走down
return super,走不走move up由onTouchEvent返回值决定
4. ViewGroup.requestDisallowInterceptTouchEvent(boolean);
如果为true,则该View所在的ViewGroup的onInterceptTouchEvent不会被执行
5. 返回值的问题
直接返回 true 或 false,决定的是接下来能否接收到 MOVE 和 UP
返回 super.onTouchEvent(ev) 表示不处理,回调上一层的事件分发