Android Touch(1)事件的传递流程(*)
1,Activity,ViewGroup,View的关系
本文按层次比喻,ViewGroup与其中的View的关系不是父子,而是上下层。父子描述继承关系更准确些。
最下层是Activity,Activity上面是一系列ViewGroup,ViewGroup上面是View。
事件总是从Activity向上层传递。

2,触摸事件
一个手指在屏幕上触摸动作产生一组事件,其中常见的是 ACTION_DOWN,ACTION_MOVE...MOVE…MOVE、最后ACTION_UP。每一个事件都是从下层向上层传递。
单手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP
多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.
3,传递事件时的重要函数
▐ 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
▐ 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
▐ 事件响应:public boolean onTouchEvent(MotionEvent ev)
它们在同一层调用顺序是 dispatchTouchEvent--->onInterceptTouchEvent --->onTouchEvent
只有ViewGroup有onInterceptTouchEvent方法,如下表:
| 方法 | Activity |
ViewGroup |
View |
| public boolean dispatchTouchEvent(MotionEvent ev) | 有 | 有 | 有 |
| public boolean onInterceptTouchEvent(MotionEvent ev) | 无 | 有 | 无 |
| public boolean onTouchEvent(MotionEvent ev) | 有 | 有 | 有 |
它们的返回值含义或功能表如下:
| 方法\返值 | true | false | super.同名函数 | |
| Activity | dispatchTouchEvent | 消费 | 消费 | 不消费,续传 |
| onTouchEvent | 消费 | 消费 | 消费 | |
| ViewGroup | dispatchTouchEvent | 消费 |
不消费,回溯 |
不消费,续传 |
| onInterceptTouchEvent |
拦截 |
不消费,续传 | 不消费,续传 | |
| onTouchEvent |
消费 |
不消费,回溯 | 不消费,回溯 | |
| View | dispatchTouchEvent | 消费 | 不消费,回溯 | 不消费,续传 |
| onTouchEvent | 消费 | 不消费,回溯 | 不消费,回溯 |
4,事件传递流程参考图
图中:
- 每条泳道是不同的处理类,
- 整个图是U型,绿色粗箭头。事件以Activity开始,也以它结束(所有人都没处理时,最后就由activity处理)。
- 细实箭头是返回true,虚线是返回false,粗线是返回super.XX同名方法。
- super.xxx是保证事件能继续传递的调用。是U型图的主线。
- dispatchTouchEvent、onTouchEvent返回true表示处理了事件。返回false都表示把事件传回前一层。

- 当down在某处被消费(返回true)后,后续的move,up就以短路径过去,不是按原路径。

5,其它参考资料
点击下载 PRE_andevcon_mastering-the-android-touch-system.pdf
Android Touch(1)事件的传递流程(*)的更多相关文章
- Android webkit 事件传递流程详解
前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索性研究了一下keyevent 事件的传递流程. frameworks 层 keyevent ...
- Android webkit 事件传递流程通道分析
前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索性研究了一下keyevent 事件的传递流程. frameworks 层 keyevent ...
- Android Touch事件之二:dispatchTouchEvent()和onTouchEvent()篇
2015-12-01 15:06:14 Android Touch事件第一篇:Touch事件在父ViewGroup和子View之间的传递简单分析了事件的传递流程,这次深入了解下dispatchTouc ...
- android中的事件传递和处理机制
一直以来,都被android中的事件传递和处理机制深深的困扰!今天特意来好好的探讨一下.现在的感觉是,只要你理解到位,其实事件的 传递和处理机制并没有想象中的那么难.总之,不要自己打击自己,要相信自己 ...
- Android webkit keyevent 事件传递过程
前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索性研究了一下keyevent 事件的传递流程. frameworks 层 keyevent ...
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android touch 事件传递机制
前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...
- Android touch事件的派发流程
Android TouchEvent事件传递机制 通俗易懂,能够了解Touch事件派发的基本流程. Android中的dispatchTouchEvent().onInterceptTouchEven ...
- Android Touch事件传递机制解析 (推荐)
最近新闻列表里的下拉 down up move 等等让我十分头疼 ,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把a ...
随机推荐
- 【POJ】【1821】Fence
DP/单调队列优化 题意:k个人粉刷总长为n的墙壁(或者说栅栏?),每个人有一个必刷点s[i](这个人也可以一点也不刷,如果刷就必须刷这个点),最大粉刷长度l[i](必须是连续粉刷一段),和粉刷一格的 ...
- 3-Highcharts 3D图之3D柱状图分组叠堆3D图
<!DOCTYPE> <html lang='en'> <head> <title>3-Highcharts 3D图之3D柱状图分组叠堆3D图</ ...
- sprytabbedpanels.js库之在页面中插入Tabbed Panels
向页面加入sprytabbedpanels.js文件.<script src="SpryAssets/SpryTabbedPanels.js" type="text ...
- codeforces #240 div 2
A:语文题,估计大家都会, B题:假如答案是ans,求最大的ans,是w*a/b==(w-ans)*a/b; 明显的二分,可是我的二分写的没水准,还有是直接做: #include<string. ...
- ubuntu 点点滴滴
pptpd http://linux.cn/article-3376-1.html 命令行升级ubuntu版本 do-release-upgrade -d 寻找最新的稳定版本,加上-d参数则包括不稳 ...
- ECMAScript5下Array的方法
声明:ECMAScript不会兼容IE8及以下版本IE浏览器. 一.迭代方法 注:这些迭代方法不会影响数组的值. 每个方法都有两个参数: array.方法(执行函数体,当前作用域(比如this,这个可 ...
- HDU 4006 The kth great number(multiset(或者)优先队列)
题目 询问第K大的数 //这是我最初的想法,用multiset,AC了——好吧,也许是数据弱也有可能 //multiset运用——不去重,边插入边排序 //iterator的运用,插入的时候,如果是相 ...
- cf div2 234 D
D. Dima and Bacteria time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- swift-网络请求
跟着网上大神写了个,还有待提高啊:http://pan.baidu.com/s/1sjC5Pl7
- POJ 1027 The Same Game(模拟)
题目链接 题意 : 一个10×15的格子,有三种颜色的球,颜色相同且在同一片内的球叫做cluster(具体解释就是,两个球颜色相同且一个球可以通过上下左右到达另一个球,则这两个球属于同一个cluste ...