Android触摸事件流程剖析
Android中的触摸事件流程就是指MotionEvent如何传递,主要包括两个阶段:
- onInterceptTouchEvent触摸事件拦截方法传递,从外到里传递
- 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触摸事件流程剖析的更多相关文章
- 对于android触摸事件模型的一些理解
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- 初识Android触摸事件传递机制
前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...
- iOS 和 Android 触摸事件传递
先看文章,写得很好 ios 触摸事件传递 http://www.cnblogs.com/Quains/p/3369132.html 另外一篇 http://blog.csdn.net/yongyinm ...
- Android触摸事件的应用
前言 上一篇讲了Android触摸事件的传递机制,具体可以看这里 初识Android触摸事件传递机制.既然知道Android中触摸事件的传递分发,那么它能解决什么样的问题,在我们实际开发中如何应用,这 ...
- Android触摸事件(一)-TouchEventHelper
文件夹 文件夹 概述 关于更新 2016-08-31 2016-06-20 关于单点触摸事件singleTouch 单击的两种方式 关于双击事件 双击事件的检測逻辑 双击事件触发的时机 关于多点触摸事 ...
- Android触摸事件传递机制
简单梳理一下Android触摸事件传递机制的知识点. 一.View与ViewGroup的关系 View和ViewGroup二者的继承关系如下图所示: View是Android中最基本的一种UI组件,它 ...
- 一个demo让你彻底理解Android触摸事件的并发
注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOW ...
- 【知识梳理1】Android触摸事件机制
前言 随着科学技术的发展,智能手机早已成为我们当代人身边不可缺少的"伙伴"之中的一个,堪比对象女友.每天我们对着手机反复的做着点击.滑动操作,而手机则随着我们的操作给我们展示她的精 ...
- Android触摸事件传递机制,这一篇就够了
整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...
随机推荐
- WordPress上传含有中文文件出现乱码
最近打算学习安装配置WordPress,当然同时也在学习PHP+MySQL,希望以后能做一些关于WordPress定制和二次开发,包括主题和插件.在成功安装WordPress3.5中文版之后,就测试了 ...
- IOS开发之自动布局显示网络请求内容
在上一篇博客中详细的介绍了IOS开发中的相对布局和绝对布局,随着手机屏幕尺寸的改变,在App开发中为了适应不同尺寸的手机屏幕,用自动布局来完成我们想要实现的功能和效果显得尤为重要.本人更喜欢使用相对布 ...
- 用队列模拟jquery的动画算法
Aaron最近疯狂的爱上了算法研究,估计又要死伤不少脑细胞了,我喜欢捡现成的,可以省些力气.发现他写的一段源码,运行一下,还蛮好玩的,于是拿来分析一下,一来吸收下里边的营养,二来加深一下源码学习的功力 ...
- Difference Between HashMap and IdentityHashMap--转
原文地址:https://dzone.com/articles/difference-between-hashmap-and Most of the time I use HashMap whenev ...
- 到处都是坑的微信支付V3之 微信支付回调页面
据上次 到处都是坑的微信支付V3 后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程. 1. html中根据前台支付后反馈信息成功 ...
- “全能”选手—Django 1.10文档中文版Part2
第一部分传送门 第三部分传送门 第四部分传送门 3.2 模型和数据库Models and databases 3.2.2 查询操作making queries 3.3.8 会话sessions 目录 ...
- Moon.Orm性能报告
以下为有网友公司的评估测试及使用规范 大家可以下载word看看 http://pan.baidu.com/s/1hquvRuc 一.和ADO.NET进行的压力测试 说明:2000并发用户,此图为一网友 ...
- 使用QUnit进行自动化单元测试
前言 前阵子由于项目需求接触了java的单元测试JUnit,就顺带着学习了前端的单元测试:Qunit. 既然跟测试有关,不妨介绍一下测试中的黑盒测试.白盒测试以及单元测试. 1.黑盒测试:所谓的黑盒, ...
- Xamarin.Android之给我们的应用加点过渡效果
零.前言 试想一下,我们的应用正在请求一些数据,假设网络不是很好,要花比较长的时间等待,这个时候界面什么反应也没有, 一动不动,用户可能就会认为应用挂掉了,这么久都没反应的,说不定下一分钟用户就把它卸 ...
- asp.net获取客户端浏览器及主机信息
在线预览效果:http://tool.hovertree.com/info/client/ 其中aspx页面的控件代码: <asp:ListBox runat="server" ...