您的位置:首页 > 移动开发 > Android开发

touch事件分发

2013-01-09 00:00 99 查看
根据阅读源码整理,以作记录,可能有误:

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中的上一节点进行处理,整个过程类似于捕获和冒泡的过程。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息