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 ...
随机推荐
- 设计模式之桥接模式(Bridge)
桥接模式与原理:将抽象部分与实现部分分离,使它们都可以独立的变化.最终的结果表现在实现类中.两者之间属于等价关系,即实现部分和抽象部分可以相互交换. 代码如下 #include <iostrea ...
- MVC 基础知识
一. MVC架构1.MVC模式是一种严格实现应用程序各部分隔离的架构模式.隔离:分离关注点,松耦合2.模型(Model) 代表着核心的业务逻辑和数据.模型封装了域实体的属性和行为3.视图(View) ...
- matrix_world_final_2011
C http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98613#problem/C 题意:输入16进制的n*m矩阵,其在二进制表示下有6种 ...
- SQLSERVER中WITH(NOLOCK)详解
在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST .有关 NOLOCK 和 READPAST的一些技术知识 ...
- 获取iframe中的元素
父窗口中获取iframe中的元素 var ifr = document.getElementById('suggustion').contentWindow.document.body; 在ifram ...
- ssh-copy-id(双机互信)
最简单的2步骤: ssh-keygen -t rsa 需要输入的地方就回车 ssh-copy-id root@192.168.0.10 详细:ssh-keygen 创建公钥和密钥. ssh-copy- ...
- hdu 1800 Flying to the Mars(简单模拟,string,字符串)
题目 又来了string的基本用法 //less than 30 digits //等级长度甚至是超过了int64,所以要用字符串来模拟,然后注意去掉前导零 //最多重复的个数就是答案 //关于str ...
- HDU 4034 Graph(floyd,最短路,简单)
题目 一道简单的倒着的floyd. 具体可看代码,代码可简化,你有兴趣可以简化一下,就是把那个Dijsktra所实现的功能放到倒着的floyd里面去. #include<stdio.h> ...
- Simulate a seven-sided die using only five-sided
问题描述: 如题 转述一下问题,就是说你现在有一个正五面体骰子,然后你怎么用这个正五面体骰子去模拟一个正七面体骰子. 这个问题我接触到几种方法,下面一一阐述. 方法一: rand7()=( rand5 ...
- iOS多线程的初步研究(十)-- dispatch同步
GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量. 一.dispatch组(dispatch group) 1. 创建dispatch组 dispatch_group_t ...