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中的上一节点进行处理,整个过程类似于捕获和冒泡的过程。
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中的上一节点进行处理,整个过程类似于捕获和冒泡的过程。
相关文章推荐
- 解決Linux下Android开发真机调试设备不被识别问题
- [软件咨询]WPS2012正式版已发布 金山Office移动版4.0发布
- Android笔记-Linux Kernel Ftrace (Function Trace)解析
- jQuery中的常用事件总结
- extjs 为某个事件设置拦截器
- jQuery bind事件使用详解
- javascript下利用for( in )语句 获得所有事件名称的代码
- JavaScript 学习笔记(十六) js事件
- 表单Form的submit事件不响应的解决方法
- javascript中window.event事件用法详解
- 表单元素事件 (Form Element Events)
- js鼠标、键盘事件实例代码
- jQuery学习笔记之jQuery的事件
- 从零开始学习jQuery (五) jquery事件与事件对象
- jQuery简单绑定单个事件的方法示例
- 如何让div span等元素能响应键盘事件操作指南
- android 多线程技术应用
- C# 事件的设计与使用深入理解
- 动态创建的表格单元格中的事件实现代码
- javascript 鼠标滚轮事件