Android源码解析触碰机制
分发 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源码解析触碰机制相关推荐
- Android源码解析(一)动画篇-- Animator属性动画系统
Android源码解析-动画篇 Android源码解析(一)动画篇-- Animator属性动画系统 Android源码解析(二)动画篇-- ObjectAnimator Android在3.0版本中 ...
- java 事件分发机制_读Android源码之事件分发机制最全总结
原标题:读Android源码之事件分发机制最全总结 本文源码来自andorid sdk 22,不同版本会有细微差别,但核心机制是一致的 一.概述 事件分发有多种类型, 本文主要介绍Touch相关的事件 ...
- Android源码解析--AlertDialog及AlertDialog.Builder
昨天晚上弄到很晚,简单的看了下Dialog的源码,说要分析下建造者模式,在dialog里面的应用其实是在AlertDialog中. 按照惯例,先看类说明: [java] view plaincopy ...
- Redis源码解析(15) 哨兵机制[2] 信息同步与TILT模式
Redis源码解析(1) 动态字符串与链表 Redis源码解析(2) 字典与迭代器 Redis源码解析(3) 跳跃表 Redis源码解析(4) 整数集合 Redis源码解析(5) 压缩列表 Redis ...
- Android 源码解析之Adapter和AdapterView与适配器模式
概述 在Android中大量存在着适配器模式,其中的设计思路就是Adapter(提供数据)设在到AdapterView(展示数据集合的视图),其中Adapter体系结构如下 而AdapterView有 ...
- Android源码解析--SwipeMenuListView仿QQ聊天左滑
版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/lyhhj/article/details/50612714 绪论: 好久没写博客了,最近比较懒,不想写博客 ...
- Android源码解析
一.Android系统启动过程 启动电源以及系统启动:当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行.加载引导程序BootLoader到RAM中并执行 引导程序BootLoader:它 ...
- Android 源码解析之AsyncTask
AsyncTask相信大家都不陌生,它是为了简化异步请求.更新UI操作而诞生的.使用它不仅可以完成我们的网络耗时操作,而且还可以在完成耗时操作后直接的更新我们所需要的UI组件.这使得它在android ...
- Android源码解析--dropbox日志:DropBoxManagerService(DBMS)服务详解
DropBoxManagerService 简介 DropBoxManagerService(简称DBMS)是日志相关的服务,用于生成与管理 系统运行时的一些日志文件.日志文件大多记录的是系统或某个应 ...
最新文章
- 谈谈图像的style transfer(二)
- 三大阶段,四大领域,详解你不知道的AIoT!
- python画图哆啦a梦-Python小白绘图 哆唻A梦 turtle真的很强大!
- 设计模式(四)OkHttp的责任链模式
- [architecture]-arm exclusive机制介绍
- vc编写供vb使用的dll文档
- 计算力学专业和计算机专业区别,力学类包括哪些专业
- 顽皮狗 多线程分享_谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!...
- Java工作笔记-IntelliJ IDEA中的精确搜索
- android微信预览pdf,网页的pdf、office链接安卓版面微信浏览器无法打开
- java输入某年某个季度_Java获取某年某季度的第一天出错
- 不用计算机怎么连接无线,不用电脑可以装wifi吗 不通过电脑装wifi方法【图文】...
- 递归法:实现指数型枚举(二叉树递归)
- 【Luogu4921】情侣?给我烧了!(组合计数)
- 11月末全球域名商新增量18强:西数居首 易名第二
- string字符串比较
- echarts入门基础教程
- 魔界/指环王三部曲(加长版)在线观看免费bt下载
- plotm matlab,MATLAB画地图的工具:worldmap和m_map
- SpringBoot项目H5界面手机拍照调用腾讯云OCR卡证识别接口完整例子