View 事件传递,分发与拦截
2015-11-25 10:28
253 查看
目录[-]
1、基础知识
2、传递流程
(1) 所有 Touch 事件都被封装成了 MotionEvent 对象,包括 Touch 的位置、时间、历史记录以及第几个手指(多指触摸)等。
(2) 事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每个事件都是以 ACTION_DOWN 开始 ACTION_UP 结束。
(3) 对事件的处理包括三类,分别为传递——dispatchTouchEvent()函数、拦截——onInterceptTouchEvent()函数、消费——onTouchEvent()函数和 OnTouchListener
(1) 事件从 Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的 View(ViewGroup)开始一直往下(子 View)传递。子 View 可以通过 onTouchEvent()对事件进行处理。
(2) 事件由父 View(ViewGroup)传递给子 View,ViewGroup 可以通过 onInterceptTouchEvent()对事件做拦截,停止其往下传递。
(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子 View 没有消费事件,事件会反向往上传递,这时父 View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到 Activity 的 onTouchEvent()函数。
(4) 如果 View 没有对 ACTION_DOWN 进行消费,之后的其他事件不会传递过来。
(5) OnTouchListener 优先于 onTouchEvent()对事件进行消费。
上面的消费即表示相应函数返回值为 true。
更多请直接阅读 PDF 英文原文:Mastering
the Android Touch System
示例代码:Demo@Github
附上两张原文中流程图:
(1) View 不处理事件流程图
(2) View 处理事件流程图
1、基础知识
2、传递流程
1、基础知识
(1) 所有 Touch 事件都被封装成了 MotionEvent 对象,包括 Touch 的位置、时间、历史记录以及第几个手指(多指触摸)等。(2) 事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL,每个事件都是以 ACTION_DOWN 开始 ACTION_UP 结束。
(3) 对事件的处理包括三类,分别为传递——dispatchTouchEvent()函数、拦截——onInterceptTouchEvent()函数、消费——onTouchEvent()函数和 OnTouchListener
2、传递流程
(1) 事件从 Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的 View(ViewGroup)开始一直往下(子 View)传递。子 View 可以通过 onTouchEvent()对事件进行处理。(2) 事件由父 View(ViewGroup)传递给子 View,ViewGroup 可以通过 onInterceptTouchEvent()对事件做拦截,停止其往下传递。
(3) 如果事件从上往下传递过程中一直没有被停止,且最底层子 View 没有消费事件,事件会反向往上传递,这时父 View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到 Activity 的 onTouchEvent()函数。
(4) 如果 View 没有对 ACTION_DOWN 进行消费,之后的其他事件不会传递过来。
(5) OnTouchListener 优先于 onTouchEvent()对事件进行消费。
上面的消费即表示相应函数返回值为 true。
更多请直接阅读 PDF 英文原文:Mastering
the Android Touch System
示例代码:Demo@Github
附上两张原文中流程图:
(1) View 不处理事件流程图
(2) View 处理事件流程图
相关文章推荐
- 【FastDev4Android框架开发】神器ViewDragHelper完全解析,妈妈再也不担心我自定义ViewGroup滑动View操作啦~(三十三)
- 最容易赚钱、最难赚钱的城市分别在哪?
- 《从零开始学Swift》学习笔记(Day 40)——析构函数
- Git详解之五 分布式Git
- android中Intent和uri的应用实例
- 运行SQL Server Profiler提示权限的问题
- VMware10中的Linux系统利用NAT网络连接方式访问外网配置
- $.ajax,$.post,$.get参数详解
- SIP和VoIP协议及其应用
- Git详解之四 服务器上的Git
- neo4j的examples之EmbeddedNeo4j.java
- Java中二元运算符被简化后带来的变化
- Google七夕情人节Doodle背后技术揭秘
- iOS禁用第三方输入法
- 正影社区发布了最新tipask的手机版下载地址
- 计量模块 Ceilometer 中的数据收集机制
- Android自定义View入门(一)
- EF CodeFirst 关系配置
- Eclipse中使用SVN
- Egit Patch