面向火箭编程之事件分发

77 阅读1分钟

View的Touch事件分发

  1. 现象   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  

  1. 现象  只有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 方法。