分发  dispatchTouchEvent  触碰屏幕时会触发的view方法,原理需要看更深层次的源码,这里可以理解为入口

拦截  onInterceptTouchEvent

消费  onTouchEvent

总结

View中有 dispatchTouchEvent分发  onTouchEvent消费

ViewGroup是由多个View组成。继承View   onInterceptTouchEvent拦截 和 重写了dispatchTouchEvent分发

ConstraintLayout、ViewPager、LinearLayout、RelativeLayout、FrameLayout等又是继承ViewGroup

我们在这些布局中重写的onTouchEvent都是重写的View中的onTouchEvent

事件是往下传递的

事件处理了又是往上汇报的

一、Activity开始

设置点击事件都是基于view  而Activity的view又是来源于我们设置的setContentView

再看getWindow()  发现是个DecorView,而DecorView 继承 FrameLayout。FrameLayout又是继承ViewGroup

Activity -> Window -> DecorView -> FrameLayout -> ViewGroup

二、ViewGroup  dispatchTouchEvent方法

ViewGroup是继承View  重写了dispatchTouchEvent方法

代码很多,逻辑很多,看的很懵逼。但是只找关键代码,往下看

首先是检查拦截

记住intercepted是拦截变量

再往下看

这个 if 里面的代码比较多,也挑重点看看

添加触碰目标。进入这个方法看看

主要功能是根据二进制的指针ID从子View中获取触碰目标

mFirstTouchTarget 的描述是 First touch target in the linked list of touch targets.大概的意思是 触摸目标链表中的第一个触摸目标。

next顾名思义就是下一个的意思

刚开始mFirstTouchTarget为null的话,next就是null,mFirstTouchTarget再重新赋值触碰目标

回到dispatchTouchEvent方法中

如果上面的if语句中  取消或者拦截  一方为true,则不会进入addTouchTarget 方法,mFirstTouchTarget肯定也是为null的

再往下看

不论mFirstTouchTarget是否为空,都会执行dispatchTransformedTouchEvent这个方法。

区别只是child  view是否为空

看下dispatchTransformedTouchEvent这个方法,返回值是boolean类型

OK,都是调用View的dispatchTouchEvent方法,不管是ViewGroup本身的,还是子View

得出结论如果ViewGroup的onInterceptTouchEvent拦截方法返回为true,则触碰事件在ViewGroup这层就被消费,无法往ViewGroup中的子View走下去

三、View dispatchTouchEvent方法

这个方法的返回值,可以查看上面流程。最终回到的还是View dispatchTouchEvent或者ViewGroup dispatchTouchEvent

从返回值来看,只有2种情况,没有焦点直接返回false   另外个就是result了

1、如果你设置了view的OnTouchListener   并且在onTouch方法中返回true 也不会往下走了

2、如果重写onTouchEvent,返回值为true,result则为true,代表已经处理

四、View onTouchEvent方法

手势有几个属性,先从按下开始吧

MotionEvent.ACTION_DOWN中

1方法里面  也是调用了2方法

checkForLongClick方法----》CheckForLongPress方法

performLongClick方法----》performLongClickInternal方法

扯得有点远,拉回

MotionEvent.ACTION_UP

如果长按监听返回的是false,才会往下执行点击

追着performClick下去  会发现有个li.mOnClickListener.onClick(this);   执行点击事件

14年的时候看过的东西,只是源码也改动很大。最近整理点东西,给自己留个备份

Android源码解析触碰机制相关推荐

  1. Android源码解析(一)动画篇-- Animator属性动画系统

    Android源码解析-动画篇 Android源码解析(一)动画篇-- Animator属性动画系统 Android源码解析(二)动画篇-- ObjectAnimator Android在3.0版本中 ...

  2. java 事件分发机制_读Android源码之事件分发机制最全总结

    原标题:读Android源码之事件分发机制最全总结 本文源码来自andorid sdk 22,不同版本会有细微差别,但核心机制是一致的 一.概述 事件分发有多种类型, 本文主要介绍Touch相关的事件 ...

  3. Android源码解析--AlertDialog及AlertDialog.Builder

    昨天晚上弄到很晚,简单的看了下Dialog的源码,说要分析下建造者模式,在dialog里面的应用其实是在AlertDialog中. 按照惯例,先看类说明: [java] view plaincopy ...

  4. Redis源码解析(15) 哨兵机制[2] 信息同步与TILT模式

    Redis源码解析(1) 动态字符串与链表 Redis源码解析(2) 字典与迭代器 Redis源码解析(3) 跳跃表 Redis源码解析(4) 整数集合 Redis源码解析(5) 压缩列表 Redis ...

  5. Android 源码解析之Adapter和AdapterView与适配器模式

    概述 在Android中大量存在着适配器模式,其中的设计思路就是Adapter(提供数据)设在到AdapterView(展示数据集合的视图),其中Adapter体系结构如下 而AdapterView有 ...

  6. Android源码解析--SwipeMenuListView仿QQ聊天左滑

    版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/lyhhj/article/details/50612714 绪论: 好久没写博客了,最近比较懒,不想写博客 ...

  7. Android源码解析

    一.Android系统启动过程 启动电源以及系统启动:当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行.加载引导程序BootLoader到RAM中并执行 引导程序BootLoader:它 ...

  8. Android 源码解析之AsyncTask

    AsyncTask相信大家都不陌生,它是为了简化异步请求.更新UI操作而诞生的.使用它不仅可以完成我们的网络耗时操作,而且还可以在完成耗时操作后直接的更新我们所需要的UI组件.这使得它在android ...

  9. Android源码解析--dropbox日志:DropBoxManagerService(DBMS)服务详解

    DropBoxManagerService 简介 DropBoxManagerService(简称DBMS)是日志相关的服务,用于生成与管理 系统运行时的一些日志文件.日志文件大多记录的是系统或某个应 ...

最新文章

  1. 谈谈图像的style transfer(二)
  2. 三大阶段,四大领域,详解你不知道的AIoT!
  3. python画图哆啦a梦-Python小白绘图 哆唻A梦 turtle真的很强大!
  4. 设计模式(四)OkHttp的责任链模式
  5. [architecture]-arm exclusive机制介绍
  6. vc编写供vb使用的dll文档
  7. 计算力学专业和计算机专业区别,力学类包括哪些专业
  8. 顽皮狗 多线程分享_谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!...
  9. Java工作笔记-IntelliJ IDEA中的精确搜索
  10. android微信预览pdf,网页的pdf、office链接安卓版面微信浏览器无法打开
  11. java输入某年某个季度_Java获取某年某季度的第一天出错
  12. 不用计算机怎么连接无线,不用电脑可以装wifi吗 不通过电脑装wifi方法【图文】...
  13. 递归法:实现指数型枚举(二叉树递归)
  14. 【Luogu4921】情侣?给我烧了!(组合计数)
  15. 11月末全球域名商新增量18强:西数居首 易名第二
  16. string字符串比较
  17. echarts入门基础教程
  18. 魔界/指环王三部曲(加长版)在线观看免费bt下载
  19. plotm matlab,MATLAB画地图的工具:worldmap和m_map
  20. SpringBoot项目H5界面手机拍照调用腾讯云OCR卡证识别接口完整例子

热门文章

  1. 物理实验-用牛顿环法测球面的曲率半径 实验报告 重庆理工大学
  2. java webservice 高并发_浅谈WEB中的高并发
  3. 基于SQLite开发的Android记账APP
  4. 微信小程序6位支付密码输入框
  5. CV2模块使用(详细教程)
  6. C++ this指针
  7. Linux FHS结构
  8. 偶数科技发布第四代数据仓库产品 完美契合AI应用
  9. 如何修复word文档
  10. PNAS:音乐能增强早产儿的高级认知脑网络