经过了拦截与寻找消费down事件的控件之后,无论前面的处理结果如何,最终都是需要将事件进行派发,不管是派发给自己还是子控件。这里派发的对象只有两个:viewGroup自身或TouchTarget。
经过了前面的寻找消费down事件子控件步骤,那么每个触控点都找到了消费自己事件序列的控件并绑定在了TouchTarget中;而如果没有找到合适的子控件,那么消费的对象就是viewGroup自己。因此派发事件的主要任务就是:把不同触控点的信息分发给合适的viewGroup或touchTarget。
派发的逻辑需要结合前面MotionEvent和TouchTarget的内容。我们知道MotionEvent包含了当前屏幕所有触控点信息,而viewGroup的每个TouchTarget则包含了不同的view所感兴趣的触控点。
如果不需要进行事件分离,那么直接将当前的所有触控点的信息都发送给每个TouchTarget即可;
如果需要进行事件分离,那么会将MotionEvent中不同触控点的信息拆开分别创建新的MotionEvent,并发送给感兴趣的子控件;
如果TouchTarget链表为空,那么直接分发给viewGroup自己;所以touchTarget不为空的情况下,viewGroup自己是不会消费事件的,这也就意味着viewGroup和其中的view不会同时消费事件。
上图展示了需要事件分离的情况下进行的事件分发。
在把原MotionEvent拆分成多个MotionEvent时,不仅需要把不同的触控点信息进行分离,还需要对坐标进行转换和改变事件类型:
我们接收到的触控点的位置信息并不是基于屏幕坐标系,而是基于当前view的坐标系。所以当viewGroup往子view分发事件时,需要把触控点的信息转换成对应view的坐标系。