Android中View的事件分发机制——Android开发艺术探索笔记
原文链接 http://sparkyuan.me/ 转载请注明出处
介绍
点击事件的事件分发就是对MotionEvent事件的分发过程。当一个MotionEvent产生了以后,系统须要把这个事件传递给一个详细的View,而这个传递的过程就是分发的过程。
涉及到的三个方法
- dispatchTouchEvent:用来进行事件的分发,假设事件可以传递给当前View。那么此方法一定会被调用,返回结果受当前View的onTouchEvent和View的dispatchTouchEvent方法的影响,表示是否当消耗当前事件
- onInterceptTouchEvent:用来推断是否拦截某个事件,假设当前View拦截了某个事件,那么在同一个事件序列其中,此方法不会被再次调用,返回结果表示是否拦截当前事件;
- onTouchEvent:在dispatchTouchEvent方法中调用。用来处理点击事件,返回结果表示是否消耗当前事件,假设不消耗,则在同一个事件序列中。当前View无法再次接收到事件。
三个方法之间的关系
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if(onInterceptTouchEvent(ev)) {
consume = onTouchEvent(ev);
} else {
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
上面的伪代码非常好的描写叙述了三者之间的关系。假设当前View拦截事件,就交给自己的onTouchEvent去处理,否则就传给子View。直到事件被终于处理。
事件分发顺序
当一个点击事件产生后。它的传递步骤例如以下:Activity -> Window -> View。假设View的onTouchEvent返回false,那么它的父容器onTouchEvent将会被调用。以此类推。终于将由Activity的onTouchEvent处理。
Activity对事件的分发过程
Activity -> Window -> DecorView。
Windows是一个抽象类。可以控制顶级View的外观和行为策略,PhoneWindow是这个类的唯一个实现。
DecorView就是当前界面的底层容器。即setContentView所设置的View是它的一个子View。
顶级View对点击事件的分发过程
ViewGroup -> dispatchTouchEvent -> onInterceptTouchEvent -> onTouch or onTouchEvent
顶级View一般都是一个ViewGroup。
拦截事件之后,假设ViewGroup设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。假设onTouchEvent设置了mOnClickListener。则Listener里的onClick会被调用。假设ViewGroup没有拦截则传给子View直到整个事件分发完毕。
View对点击事件的处理过程
假设View设置了mOnTouchListener,则Listener里的onTouch方法会屏蔽掉onTouchEvent。
假设onTouchEvent设置了mOnClickListener,则Listener里的onClick会被调用。
View没有onInterceptTouchEvent方法,一旦有点击事件传递给他。他就会处理。
注:上面仅仅是描写叙述了事件分发过程的原理,关于源代码的分析请參考书本的对应章节。
欢迎转载。转载请注明出处http://blog.csdn.net/l664675249/article/details/50738102
Android中View的事件分发机制——Android开发艺术探索笔记的更多相关文章
- Android中View的事件分发机制
简介 事件也称MotionEvent,事件分发机制就是对MotionEvent事件的分发过程,即当一个MotionEvent发生之后,系统需要把这个事件传递给一个具体的View. 点击事件的分发过程由 ...
- Android View的事件分发机制和滑动冲突解决方案
这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...
- Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)
http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...
- Android View的事件分发机制
准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup ...
- 【Android - 自定义View】之View的事件分发机制
参考资料: View事件分发:http://blog.csdn.net/pi9nc/article/details/9281829 ViewGroup事件分发:http://blog.csdn.net ...
- 【Android - 进阶】之事件分发机制
参考资料: View事件分发:http://blog.csdn.net/pi9nc/article/details/9281829 ViewGroup事件分发:http://blog.csdn.net ...
- View的事件分发机制解析
引言 Android事件构成 在Android中,事件主要包含点按.长按.拖拽.滑动等,点按又包含单击和双击,另外还包含单指操作和多指操作.全部这些都构成了Android中的事件响应.总的来说.全部的 ...
- Android开发艺术探索笔记——View(二)
Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...
- Android开发艺术探索笔记—— View(一)
Android开发艺术探索笔记 --View(一) View的基础知识 什么是View View是Android中所有控件的基类.是一种界面层控件的抽象. View的位置参数 参数名 获取方式 含义 ...
随机推荐
- 关于学习Mongodb的几篇文章
一.Mongodb分片的使用 http://www.caiyiting.com/blog/2014/mongodb-sharding.html 二.MongoDB分布式高可用集群实现 http://w ...
- VBS脚本获取安全标识符SID(Security Identifiers)的方法
一.SID简介 SID也就是安全标识符(Security Identifiers),是标识用户.组和计算机帐户的唯一的号码.在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SI ...
- xtu数据结构 H. City Horizon
H. City Horizon Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java cl ...
- 【Kubernetes】Deployment控制器模型
在Kubernetes中,Deployment是最基本的控制器对象 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploym ...
- BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
腊鸡题目,实在卡不过去. (改了一下午) 就是裸的斯坦纳树的题目,一方面合并子集,另一方面SPFA迭代求解. 优化了许多地方,甚至基数排序都写了. 还是T到死,不打算改了,就这样吧 #include ...
- [BZOJ2733] [HNOI2012]永无乡(并查集 + 线段树合并)
传送门 一看到第k大就肯定要想到什么权值线段树,主席树,平衡树之类的 然后就简单了 用并查集判断连通,每个节点建立一颗权值线段树,连通的时候直接合并即可 查询时再二分递归地查找 时间复杂度好像不是很稳 ...
- [BZOJ1589] [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果(tarjan缩点 + 记忆化搜索)
传送门 先用tarjan缩点,再记忆话搜索一下 #include <stack> #include <cstdio> #include <cstring> #inc ...
- [TJOI2009]开关 (线段树)
题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成一排,从左到右依次编号为:1,2,......,N.然后依次执行M(1 ≤ M ≤ 100000)项操作,操作分为两种:第一种操作指定一个区间[ ...
- C++ 中的 C_str() 函数用法
转中转 ~\(≧▽≦)/~ :http://blog.csdn.net/nancy_m/article/details/7583550 语法: const char *c_str(); c_str() ...
- uva 11021
题意:有k只麻球,每只活一天就会死亡,临死之前可能会生出一些新的麻球.具体来说,生i个麻球的概率为pi.给定m,求m天后所有麻球死亡的概率.注意,不足m天时就已经全部死亡的情况也算在内. 分析:由于每 ...