Android 事件分发机制源码分析
if(MotionEvent.ACTION_DOWN || mFirstTouchTarget != null){
//初次的down事件到来的时候,只有父view具有决定事件是否拦截的权利。因为此时的disallowIntercept初始值是false,原因是down事件之前会重置这个标志位
final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
//第一个down进来下面这个if条件是成立的,因此父view的onInterceptTouchEvent方法就决定了是否拦截
if(!disallowIntercept){
intercepted = onInterceptTouchEvent(ev)
}else{
//这个条件是子view要求父view不要拦截,其实就是后续的move和up事件不要拦截,因为能进到这个地方不可能是down事件并且mFirstTouchTarget != null
intercepted = false;
}
}else{
//进到这个地方说明事件是move或者up并且mFirstTouchTarget == null。
//move或者up能进到这个地方说明mFirstTouchTarget == null,那么就意味着要么down被父view消费了(down事件被父view拦截了或者子view不处理down事件又把down事件交给父view处理)
//要么就是在move或者up的事件子view要求父view进行拦截并且父view拦截了,这样也会导致mFirstTouchTarget == null成立。这样的话子view就再也拿不到事件了
intercepted = true
}
//新的事件会重置这两个值
TouchTarget newTouchTarget = null;
boolean alreadyDispatchedToNewTouchTarget = false;
//只有不拦截才会命中
if(!canceled && !intercepted){
//只有down事件才会进行分发
if (actionMasked == MotionEvent.ACTION_DOWN){
for(){
//利用循环遍历按住的子view
if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) {
//如果找到了处理down事件的子view 就会在addTouchTarget方法里面把 mFirstTouchTarget的值设置成非空
newTouchTarget = addTouchTarget(child, idBitsToAssign);
//把已经消费的标记为设置成true
alreadyDispatchedToNewTouchTarget = true;
break;
}
}
}
}
//上面已经解释过mFirstTouchTarget==null的原因了,1、down事件被父view消费掉了 2、子view的move事件交给了父view拦截并且拦截了
if(mFirstTouchTarget == null){
//自己处理事件
handled = dispatchTransformedTouchEvent(ev, canceled, null, TouchTarget.ALL_POINTER_IDS);
}else {
//子view处理事件
TouchTarget target = mFirstTouchTarget;
while(target != null){
if (alreadyDispatchedToNewTouchTarget && target == newTouchTarget) {
//如果当前事件是down并且down事件被子view处理了这个就会成立
handled = true;
}else{
//事件来的时候会重置alreadyDispatchedToNewTouchTarget = false 能进到这里说明1、down事件被子view处理并且此时的事件不是down事件。
//如果move或者up事件被拦截了cancelChild则是true否则false
final boolean cancelChild = resetCancelNextUpFlag(target.child)|| intercepted;
//交给自己或者子view去处理
if (dispatchTransformedTouchEvent(ev, cancelChild, target.child, target.pointerIdBits)) {
handled = true;
}
//如果是自己处理也就是move事件被父view拦截了
if (cancelChild) {
//mFirstTouchTarget设置成next 单指为null
mFirstTouchTarget = next
}
}
target = next;
}
}
}
Android 事件分发机制源码分析的更多相关文章
- Android事件分发机制源码分析
Android事件分发机制源码分析 Android事件分发机制源码分析 Part1事件来源以及传递顺序 Activity分发事件源码 PhoneWindow分发事件源码 小结 Part2ViewGro ...
- Android查缺补漏(View篇)--事件分发机制源码分析
在上一篇博文中分析了事件分发的流程及规则,本篇会从源码的角度更进一步理解事件分发机制的原理,如果对事件分发规则还不太清楚的童鞋,建议先看一下上一篇博文 <Android查缺补漏(View篇)-- ...
- Qt事件分发机制源码分析之QApplication对象构建过程
我们在新建一个Qt GUI项目时,main函数里会生成类似下面的代码: int main(int argc, char *argv[]) { QApplication application(argc ...
- Android View事件分发-从源码分析
View事件分发-从源码分析 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/details/78555397?lo ...
- Android View 事件分发机制 源码解析 (上)
一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...
- Android异步消息传递机制源码分析
1.Android异步消息传递机制有以下两个方式:(异步消息传递来解决线程通信问题) handler 和 AsyncTask 2.handler官方解释的用途: 1).定时任务:通过handler.p ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- Android事件分发机制完全解析,带你从源码的角度彻底理解
Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...
- [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...
- 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...
随机推荐
- web之jquery
jquery 插件 下载解压插件 加载jQuery 加载插件 插件样式 按照使用例子给元素添加类名,id,函数.
- SpringMVC配置文件applicationContext.xml头信息
applicationContext.xml头信息 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- 基于C语言的小学生四则运算出题器
一.实验目的以及项目来源: 目的: 1.帮助老师产出随机的海量四则运算符的运算题目. 2.每次题目的产出均为随机,增强同学的四则运算能力. 项目来源: 项目来源于软件开发与创新课程的结对编程,对100 ...
- MySql数据库读取字段错误问题
一个小小的BUG,断断续续搞了一个月才搞定,使用MySql的时候使用mysql_fetch_fields()获取的字段始终始终是错误的,因为是修改别人的代码,一直找不到问题,Debug了无数次还是搞不 ...
- 使用阿里云镜像安装tensorflow
pip --default-timeout=1000 install --index-url https://mirrors.aliyun.com/pypi/simple tensorflow pip ...
- webpack 3/4踩坑,我太难了,从安装、卸载、到使用,各相应的版本号,sass-loader报错-版本的原因,webpack -v 不识别,没卸载干净
-先说卸载: wabpack@4对应的每个插件的版本号都在最后 1 全局安装的话,npm uninstall webpack -g 有时候并不能卸载干净, 2 webpack -v 可判断是否安装成 ...
- 前端访问Tornado跨域问题
- jquery中,某些写法后来更新导致版本不支持的替代方法
等号后面的书写替换前面老的书写方法 $.browser.mozilla = /firefox/.test(navigator.userAgent.toLowerCase());$.browser.we ...
- python练习--1
ID_CARD = input("Input your ID Card: ") length = len(ID_CARD) if length < 5: NEW_ID_CAR ...
- linux 打包各种后缀的命令
01-.tar格式解包:[*******]$ tar xvf FileName.tar打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是压缩! ...