touch事件分发

根据阅读源码整理,以作记录,可能有误:
1.view构成一个树形结构,touch事件从上往下分发
2.view  tree中叶子节点的事件首先由OnTouchListener处理,如果没有OnTouchListener或者没有处理事件则调用view的onTouchEvent回调方法进行处理。
3.非叶子节点(ViewGroup)的事件分发逻辑:
    3.1.由dispatchTouchEvent方法负责分发
    3.2每个ViewGroup维护一个消费事件目标链表
    3.3可以通过onInterceptTouchEvent方法中断事件向下分发,如果中断则调用super(是ViewGroup对象的super,不是view tree节点的上级节点,也就是View:优先OnTouchListener,若没处理则调用onTouchEvent)来处理,如果中断事件,则不会更新消费事件的目标链表。
    3.4只有在手指按下(ACTION_DOWN)和没有中断分发时才会去更新这个列表,也就是说如果子view没有接收到ACTION_DOWN事件,则后继的事件(ACTION_MOVE)也接收不到
    3.5更新目标链表:通过自上而下深度优先的方法寻找消费事件的子view,只要找到一个更新链表的过程结束
    3.6子view要能进入目标列表的必要条件是:
        1)子view是可视的或者有动画
        2)事件发生的坐标在view的范围内
    3.7事件分发:不受中断标志的影响,事件将会分发到全部目标链表上的view,和更新目标链表方式不一样(找到一个即停止),新加入到目标链表中的view在更新链表的时候已经处理,这里不再处理。
    3.8如果有子view消费了事件并且有动画,ACTION_MOVE事件分发的时候不会调用onInterceptTouchEvent,此时不能中断子view的事件,因为子view通过设置mGroupFlags绕过直接onInterceptTouchEvent方法,直接分发事件
    3.9如果ACTION_MOVE事件中断,则会给子view发送一个ACTION_CANCLED事件。
    3.10如果中断了事件的分发或者没有子view处理事件,则由自己进行处理,如果自己也没处理则交给tree view中的上一节点进行处理,整个过程类似于捕获和冒泡的过程。

touch事件分发_第1张图片

你可能感兴趣的:(android,事件,onTouchEvent,touch)