ViewGroup 事件分发
2016-04-14 本文已影响69人
ivolianer
单纯的知识是无力的,需要灵活运用,转化为实际的开发经验。
ViewGroup 的事件分发非常复杂的,这里略过了多点触控的部分。
详细的可以看:
http://wangkuiwu.github.io/2015/01/04/TouchEvent-ViewGroup/
第一,重置状态。
接收 DOWN 事件时,如果 TouchTarget 不为 null,则向 TouchTarget 发送 CANCEL 事件,并则将其重置为 null。
一般来说,接收到新的 DOWN 事件时, TouchTarget 应该已经被重置为 null 了。
但不排除父视图拦截了 UP 事件的可能性(或其他情况)。
重置状态是为确保上一次 touch gesture 不会影响到接下来的一系列操作。
第二 ,拦截判断
如果没有子视图消费 DOWN 事件(即 TouchTarget 为 null,无论是被父视图拦截了,还是没可以消费该事件的子视图,又或者明明接收了事件并做出相应的处理,最终却返回个 false),那么后续事件会被分发给父视图。
如果 TouchTarget 不为 null,后续事件会被分发给 TouchTarget 处理,事件相对坐标可能有所变化。
第三,别记结论。
以上只是使用 ViewGroup 默认 dispatchTouchEvent 的结论。
如果重载了 dispatchTouchEvent 或其内部调用的其他函数,需要重新分析。