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 事件分发机制源码分析的更多相关文章

  1. Android事件分发机制源码分析

    Android事件分发机制源码分析 Android事件分发机制源码分析 Part1事件来源以及传递顺序 Activity分发事件源码 PhoneWindow分发事件源码 小结 Part2ViewGro ...

  2. Android查缺补漏(View篇)--事件分发机制源码分析

    在上一篇博文中分析了事件分发的流程及规则,本篇会从源码的角度更进一步理解事件分发机制的原理,如果对事件分发规则还不太清楚的童鞋,建议先看一下上一篇博文 <Android查缺补漏(View篇)-- ...

  3. Qt事件分发机制源码分析之QApplication对象构建过程

    我们在新建一个Qt GUI项目时,main函数里会生成类似下面的代码: int main(int argc, char *argv[]) { QApplication application(argc ...

  4. Android View事件分发-从源码分析

    View事件分发-从源码分析 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/details/78555397?lo ...

  5. Android View 事件分发机制 源码解析 (上)

    一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...

  6. Android异步消息传递机制源码分析

    1.Android异步消息传递机制有以下两个方式:(异步消息传递来解决线程通信问题) handler 和 AsyncTask 2.handler官方解释的用途: 1).定时任务:通过handler.p ...

  7. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  8. Android事件分发机制完全解析,带你从源码的角度彻底理解

    Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...

  9. [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...

  10. 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

随机推荐

  1. Vuex----Getters

    Getter 用于对 Store中的数据进行加工处理形成新的数据. Getter 不会修改 Store 中的原数据,它只起到一个包装器的作用,将Store中的数据加工后输出出来. const stor ...

  2. AT212 P-CASカードと高橋君

    题目描述 高桥君为了准备即将到来的7月27日土用丑日,打算邮购一些高级鳗鱼食材,通过网上银行来支付. 高桥君使用的银行卡背面有下图所示的9×9密码表.支付的时候从表中某一位置开始根据指定的方向连续读4 ...

  3. 荔枝派Licheepi nano裸机移植ZLG_GUI和3D旋转立方体

    一:前言 以前申请到了荔枝派zero,在发了两个开箱贴后就放在一边吃灰了.后来又购买了荔枝派nano,刷了几个教程中的系统之后又放到一边吃灰了.虽然有屯板子的习惯,却没有使用板子的能力. 后来,经过断 ...

  4. 优先使用C++的别名声明(using)来替换typedef

    C++98中,我们如果想用简写的方式表达一个类型,那么可以使用typedef关键字: typedef std::unique_ptr<std::unordered_map<std::str ...

  5. 单向链表&有关类和对象

    // Test515.cpp: 定义控制台应用程序的入口点.// #include "stdafx.h"#include <iostream>using namespa ...

  6. NX二次开发VS环境搭建

    1.安装VS2019(直接安装高版本:与NX匹配时向下兼容,不需要纠结) 2.安装习惯使用的NX(建议直接上NX1980,新版不管是功能还是界面都比低版好用得多.很多人说新版不好用,这只是个人习惯和接 ...

  7. [ABC284F] ABCBAC(字符串哈希)

    思路 这里我们要注意以下几点: 字符串哈希自然溢出(\(\pmod 2^64\))会被卡,会\(WA~5\)个点 注意有模数的时候不要用\(unsigned\ long \ long\)类型 代码 # ...

  8. Less8-Less10 时间注入

    Less-8和Less-5使用的是一样的布尔盲注,为了学习,这里我们使用时间盲注 Less-8 这里使用到了mysql中的if语句,格式为if(条件,正确执行,错误执行) 实例如图: sleep(秒速 ...

  9. Less-7 '))闭合 和 secure_file_priv 配置写入一句话木马

    Less-7使用的文件导出select ... into outfile ....,一个文件上传. mysql安全配置里有一个配置secure_file_priv控制文件的导出导入. secure_f ...

  10. 快速部署LAMP黄金架构,搭建disuz论坛

    快速部署LAMP架构 [root@zhanghuan ~]# iptables -F[root@zhanghuan ~]# systemctl stop firewalld[root@zhanghua ...