Android中的触摸事件流程就是指MotionEvent如何传递,主要包括两个阶段:

  1. onInterceptTouchEvent触摸事件拦截方法传递,从外到里传递
  2. onTouchEvent触摸事件处理方法传递,从里到外传递

现在做一个例子探索触摸事件的流程,效果图如下:

从外到里的视图依次是ViewGroup1、ViewGroup2、View。

ViewGroup1的触摸相关方法如下(ViewGroup2类似):

private boolean intercept = false;//拦截方法返回的标志位,是否拦截触摸事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.e("touch", "MyViewGroup1 return " + this.intercept + " onInterceptTouchEvent " + ev.toString());
return this.intercept;
}
private boolean handle = false;//触摸处理方法返回的标志位,是否处理触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("touch", "MyViewGroup1 return " + this.handle + " onTouchEvent " + event.toString());
return this.handle;
}
View的触摸相关方法如下(View并没有onInterceptTouchEvent方法):
private boolean handle = false;//触摸处理方法返回的标志位,是否处理触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("touch", "MyView return " + this.handle + " onTouchEvent " + event.toString());
return this.handle;
}
现在点击中间的View,Log日志如下: 

总结1:在onInterceptTouchEvent和onTouchEvent中都返回false时,MotionEvent的ACTION_DOWN会走一遍传递和处理流程,然后就再没有传递进来了。

下面修改ViewGroup2触摸事件拦截方法的标志位并且截图Log日志

总结2:在触摸事件传递的过程中,如果遇到了一个onInterceptTouchEvent返回true,那么表示不再往下传,直接从此View的onTouchEvent返回。

然而,我们发现只有ACTION_DOWN事件传进来了,其他类型的触摸都不会进来了,原因是在所有的onTouchEvent中都返回了false,也就是他们都表示不会去处理这一次的触摸事件,所以系统就不会自作多情再传触摸事件进来了。

要想系统不断的传递触摸事件进来,只能在某一个onTouchEvent中返回true,修改ViewGroup2的onTouchEvent标志位并截图Log日志

总结3:当某个onTouchEvent返回true并且触摸事件传递到这个方法时,表示自己要处理这个触摸事件,不再向上传递;后来的其他类型的触摸事件还是会走一下onInterceptTouchEvent(但不会走到已经在处理触摸事件的View以及之后的View的onInterceptTouchEvent),然后再传给正在处理触摸事件的View的onTouchEvent方法,并且此时也不会再向上传递。

所以我们可以得到一些非常宝贵并且非常常用的技巧:

1、在onTouchEvent中处理我们需要做的触摸事件,并且返回true。

2、在onInterceptTouchEvent中获取ACTION_DOWN、ACTION_MOVE、ACTION_UP等触摸事件(可能只是获取其中一两种触摸事件),然后判断是否满足拦截的条件,在此之前返回false,一旦满足则返回true。

源代码下载:http://files.cnblogs.com/files/linyibiao/Android_TouchEvent.zip

Android触摸事件流程剖析的更多相关文章

  1. 对于android触摸事件模型的一些理解

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  2. 初识Android触摸事件传递机制

    前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...

  3. iOS 和 Android 触摸事件传递

    先看文章,写得很好 ios 触摸事件传递 http://www.cnblogs.com/Quains/p/3369132.html 另外一篇 http://blog.csdn.net/yongyinm ...

  4. Android触摸事件的应用

    前言 上一篇讲了Android触摸事件的传递机制,具体可以看这里 初识Android触摸事件传递机制.既然知道Android中触摸事件的传递分发,那么它能解决什么样的问题,在我们实际开发中如何应用,这 ...

  5. Android触摸事件(一)-TouchEventHelper

    文件夹 文件夹 概述 关于更新 2016-08-31 2016-06-20 关于单点触摸事件singleTouch 单击的两种方式 关于双击事件 双击事件的检測逻辑 双击事件触发的时机 关于多点触摸事 ...

  6. Android触摸事件传递机制

    简单梳理一下Android触摸事件传递机制的知识点. 一.View与ViewGroup的关系 View和ViewGroup二者的继承关系如下图所示: View是Android中最基本的一种UI组件,它 ...

  7. 一个demo让你彻底理解Android触摸事件的并发

    注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOW ...

  8. 【知识梳理1】Android触摸事件机制

    前言 随着科学技术的发展,智能手机早已成为我们当代人身边不可缺少的"伙伴"之中的一个,堪比对象女友.每天我们对着手机反复的做着点击.滑动操作,而手机则随着我们的操作给我们展示她的精 ...

  9. Android触摸事件传递机制,这一篇就够了

    整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...

随机推荐

  1. jQuery之on

    在jQuery1.9版本中,已经去掉了live和delegate方法,从而将on方法的地位进一步提升. jQuery如此推崇on方法,必有其牛逼的地方.那么我们就有必要了解这个on,并在代码中利用它, ...

  2. 前端工程优化:javascript的优化小结

     我觉得优化javascript是一门高深的学问,在这里也只能站在前人的肩膀上,说一些我浅显的认识,更希望的是抛钻引玉,如有不对,敬请斧正. 首先,要认识到是,优化js的关键之处在于,优化它的运行速度 ...

  3. 支持向量机原理(四)SMO算法原理

    支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五) ...

  4. 在Windows环境中开始Docker的学习和体验

    研究docker有一段时间了,当然我主要的使用环境还是在Linux中,确实很方便. 但也有不少朋友希望使用Windows来工作学习,这里介绍一下在Windows中如何快速开始Docker的学习和体验吧 ...

  5. GCD 扫盲篇

    GCD有四个概念:串行队列.并行队列.同步.异步四者. 如下简介: 这里不仅给出了不确定性,而且也给出了确定性.对于初学者而言,有时候因为那些不确定的东西所造成的疑问会像没有闸却在疾驰的汽车一样让人惊 ...

  6. ASP.NET实现微信功能(1)(创建菜单,验证,给菜单添加事件)

    LZ实在 不知道怎么起名字了,索性就取了这个名字,开始吧,说实在的,想给自己的平常的学习做一个总结,总是忘了总结.也只能给工作做一个总结了. 我打算用2篇文章来写,第一篇是关于订阅号的,就是这个号,另 ...

  7. ThinkPHP学习(一)

    下载3.2框架后,解压缩到web目录下面,可以看到初始的目录结构如下: 3.2版本相比之前的版本自带了一个完整的应用目录结构和默认的应用入口文件,开发人员可以在这个基 础之上灵活调整.其中, Appl ...

  8. Angularjs学习笔记9_JSON和JSONP

    说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?数据可以用自定义字符串或者用XML来描述,跨域可以通过服务器端代理来解决.最被推崇或者说首选的 ...

  9. Win10 UWP 开发系列:支持异步的SQLite

    上篇文章已经实现了在UWP中使用SQLite作为本地存储,作为移动端的程序,及时响应用户的操作是提高用户体验的重要途径,因此UWP的很多api都是异步的.那么如何使SQLite支持异步呢? 参考SQL ...

  10. C#基础知识四之override和new的区别

    override override是派生类用来重写基类方法的.调用的派生类方法,如需调用基类方法用base关键字 override不能重写非虚方法或静态方法. override重写必须用abstrac ...