View的Touch事件分发
- 现象 OnTouchListener OnTouch OnClickListener 三个都有的情况下 前提是OnTouchListener 返回false
OnTouchListener.DOWN -> OnTouch.DOWN -> OnTouchListener.MOVE -> OnTouch.MOVE -> OnTouchListener.UP-> OnTouch.UP-> OnClickListener
2. 现象 OnTouchListener OnTouch OnClickListener 三个都有的情况下 前提是OnTouchListener 返回true
OnTouchListener.DOWN -> OnTouchListener.MOVE -> OnTouchListener.UP
- 现象 只有OnTouch OnClickListener ,前提是 OnTouch 返回true
OnTouch .DOWN -> OnTouch .MOVE -> OnTouch.UP 不会执行onClick
ViewGroup 的事件分发
dispatchTouchEvent()
onInterceptTouchEvent()
onTouchEvent()
1. 正常情况下
第一次DOWN ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> View.dispatchTouchEvent -> View.onTouch -> View.onTouchEvent
第二次MOVE ViewGroup.dispatchTouchEvent -> ViewGroup onInterceptTouchEvent -> View.dispatchTouchEvent -> View.onTouch -> View.onTouchEvent
第三次UP ViewGroup.dispatchTouchEvent -> ViewGroup onInterceptTouchEvent -> View.onTouch -> View.onTouchEvent -> View.onclick
2. onClick 没有 理解为没有消费事件
ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> View.dispatchTouchEvent -> View.onTouch -> View onTouchEvent -> ViewGroup.onTouchEvent
3. 在 View 的 onTouchEvent() 方法里面返回true 的情况下
第一次DOWN ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> View.dispatchTouchEvent -> View.onTouch -> View.onTouchEvent
第二次MOVE ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> View.dispatchTouchEvent -> View.onTouch -> View.onTouchEvent
第三次UP ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> View.onTouch -> View.onTouchEvent
4. 在 ViewGroup 的 onInterceptTouchEvent() 方法里面返回 true 的情况下
ViewGroup.dispatchTouchEvent -> ViewGroup.onInterceptTouchEvent -> ViewGroup.onTouchEvent
总结
如果说子 View 没有一个地方返回 true ,只会进来一次只会响应 DOWN 事件,代表不需要消费该事件,如果你想响应 MOVE,UP 必须找个地方ture。
对于ViewGroup来讲,如果你想拦截子 View 的 Touch 事件,可以覆写 onInterceptTouchEvent 返回 true 即可 , 如果说 onInterceptTouchEvent 返回的是 true 会执行该 ViewGroup 的 onTouchEvent 方法 , 如果子 View 没有消费 touch 事件 也会调用该 ViewGroup 的 onTouchEvent 方法。