android事件分发机制分析(一)
android事件分发机制分析(二)
android事件分发机制分析(三)
总结一下事件分发,下图源自Kelin的简书文章,介绍了对于ACTION_DOWN事件的分发,上面是activity,中间是ViewGroup,下面是View,当然多层ViewGroup也是同样的道理。
ACTION_DOWN
Activity:
- 首先调用dispatchTouchEvent对事件进行分发。
- 若ViewGroup或者子view不消费,调用自身的onTouchEvent;
GroupView:
onInterceptTouchEvent不拦截:
- 对于accessbility的事件,首先分发给accessbility的view。
- 先按照y轴顺序,再按照绘画顺序分发给所有的子view。
- 若子view都不消费,调用本身onTouchEvent。
- 若自身不消费,交给上层的onTouchEvent处理。
onInterceptTouchEvent拦截:
- 调用本身onTouchEvent。
- 若自身不消费,交给上层(ViewGroup或者Activity)的onTouchEvent处理。
View
- 首先交给已注册的onTouchListener进行处理。
- 若onTouchListener不消费,交给onTouchEvent。
- 若自身不消费,交给上层(ViewGroup或者Activity)的onTouchEvent处理。
ACTION_UP、ACTION_MOVE等
首先要说两个重要的点。
第一:ViewGroup只对ACTION_DOWN事件进行拦截,所以此等事件会被分发下去。
第二:对于已经消费的ACTION_DOWN事件,ViewGroup会新建TouchTarget记录下来放在内部的mFirstTouchTarget成员头部。随后收到ACTION_UP等就会遍历mFirstTouchTarget链表,将事件分发下去。
于是乎,可以说是谁消费谁处理,哪个View(ViewGroup)消费了ACTION_DOWN,谁就会收到UP等的事件。如果上次DOWN没有被消费,也就不会有TouchTarget,自然就不会分发下去了。