事件分发机制总结

103 阅读1分钟

event.png

事件分发机制

  1. activity、viwe: 只有 dispatchTouchEvent(分发)onTouchEvent(消费)
  2. viewGroup: dispatchTouchEvent(分发),onInterceptTouchEvent(拦截),onTouchEvent(处理)
  3. 顺序是:activity(dispatchTouchEvent) -> viewGroup(dispatchTouchEvent) -> viewGroup(onInterceptTouchEvent) -> view(dispatchTouchEvent) -> view(onTouchEvent) -> viewGroup(onTouchEvent) -> activity(onTouchEvent)

总结:(嵌套关系: activity - viewGroup - view)

1. 分发顺序dispatchTouchEvent,reture true/false,都不再会向下分发,
  • 本身不会执行onInterceptTouchEvent拦截或者onTouchEvent消费,只有return super.dispatchTouchEvent(ev),才会继续向下分发调度
2. 拦截onInterceptTouchEvent(viewGroup) :return true,向下拦截,拦截子view的事件dispatchTouchEvent、onTouchEvent
3. 消费顺序return true:activity(onTouchEvent) -> viewGroup(onTouchEvent) -> view(onTouchEvent)
  1. 子view 消费onTouchEvent,parent.requestDisallowInterceptTouchEvent(true) 可以拦截父view及上面(activity)的onTouchEvent。
  2. 子view都不消费(return false/super.onTouchEvent(event)),则最终被activity消费
  3. viewGroup、view 都消费(onTouchEvent return true),view的有效
  4. view,设置了setOnClickListener后,该view的onTouchEvent会自动被消费,此时,如果onTouchEvent return true/false,则不会触发setOnClickListener,return super.onTouchEvent(event),会触发setOnClickListener。
  5. 父布局的onInterceptTouchEvent,return true,会使 上面(5)这步失效
  6. 父布局消费onTouchEvent,return true,上面(5)这步仍任有效。且父布局(或者activity)onTouchEvent消费不会执行
  7. viewGroup,设置了setOnClickListener后,子view如果消费onTouchEvent(return true),不会执行viewGroup的setOnClickListener,而是触发子view消费onTouchEvent
  8. 上一步(7),如果viweGroup 消费onTouchEvent(return true),则不会执行viewGroup的setOnClickListener