您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android事件分发机制

时间:2019-08-19 11:00:14  来源:  作者:

前言

Android的事件分发机制看了很多文章,背都背出来了,但是一直没有自己去看源码追一遍,现在写下这篇文章记录下从源码分析Android的事件分发机制,如果有哪个地方说的不对的,望大家指出!谢谢!

事件分发示意图

Android事件分发机制

 

解析

本文基于API 26

点击事件到Activity

详情可见这一篇,引用大佬的文章 Touch事件如何传递到Activity

Activity到PhoneWindow再到DecorView

Activity收集到点击事件后会调用到自己的dispatchTouchEvent方法,并且在其中通过调用window的superDispatchTouchEvent的方法来判断是否消费该事件,因为window是一个抽象类,他有一个唯一的子类Phonewindow,所以实际上会调用到PhoneWindow中的superDispatchTouchEvent,而到了PhoneWindow那就是直接调用DecorView,没有其他的判断

  • Activity中调用PhoneWindow的superDispatchTouchEvent方法判断是否消费该事件
Android事件分发机制

 

  • PhoneWindow直接调用DecorView中的superDispatchTouchEvent方法
Android事件分发机制

 

  • DecorView到ViewGroup再到View

DecorView继承自FrameLayou,FrameLayout继承于ViewGroup,所以DecorView也是ViewGroup的子类,DecorView中的superDispatchTouchEvent调用父类ViewGroup的dispatchTouchEvent进行事件的分发

  • DecorView调用父类的dispatchTouchEvent方法
Android事件分发机制

 

  • ViewGroup中dispatchTouchEvent进行了事件拦截的处理,首先判断了当前是否可以进行拦截,然后调用onInterceptTouchEvent进行拦截判断,如果返回为false,则继续向子View进行分发事件(前提是存在子View的情况下,如果不存在,并且拦截为false,则dispatchTouchEvent返回为false,向上级传递告诉他们你们自己消费去吧)
Android事件分发机制

 


Android事件分发机制

 

  • 向子类分发事件,首先判断是否存在子View,如果存在子View,则调用dispatchTransformedTouchEvent方法去筛选,调用子View的dispatchTouchEvent方法
Android事件分发机制

 


Android事件分发机制

 

  • 子View中判断自身的onTouchEvent是否执行,如果不执行,则返回false,如果执行返回true
Android事件分发机制

 

总结

事件分发理解起来比较容易,就是一层一层的关系,中间任何一个环节出现了消费事件的操作,则都不用下发给下一层了,并且消费过后告诉上一层我已经消费了,然后上一层再告诉上上层,直到顶层。

事件cancel的时机

ACTION_CANCEL事件是收到前驱事件后,后续事件被父控件拦截的情况下产生,onTouchEvent的事件回传到父控件只会发生在ACTION_DOWN事件中。 所以当父View拦截到后续事件时才会触发ACTION_CENCEL,我们正常的流程只有DOWN,UP,MOVE,这三个事件,所以保证ACTION_CENCEL事件不会触发即可"。

解决自定义View触发ACTION_CANCEL

Android事件分发机制

 

结束

漫漫开发之路,我们只是其中的一小部分……只有不断的学习、进阶,才是我们的出路!才跟得上时代的进步!

今年年初我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,可以私信我【安卓,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。

重要的事说三遍,转发+转发+转发,让更多需要的朋友们都可以看到并且领到!

Android事件分发机制

 



Tags:Android   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  Tags: Android  点击:(8)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  Tags: Android  点击:(8)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  Tags: Android  点击:(17)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  Tags: Android  点击:(22)  评论:(0)  加入收藏
新型Android恶意木马程序伪装成数十款街机、射击和策略游戏,通过华为应用市场AppGallery进行分发,从而窃取设备信息和用户的手机号码,全球目前至少有930万台Android设备被该恶...【详细内容】
2021-12-01  Tags: Android  点击:(24)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  Tags: Android  点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  Tags: Android  点击:(28)  评论:(0)  加入收藏
如果你是一名忠实的Android玩家,那么可能会知道,今年的Android 12系统在版本规划上与“往届”相比可以说是很有些特殊。具体来说,除了前段时间刚刚推出正式版的Android 12外,谷...【详细内容】
2021-11-10  Tags: Android  点击:(24)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  Tags: Android  点击:(37)  评论:(0)  加入收藏
今年5月,谷歌推出了Android 12,这是原生安卓系统史上最大的设计变化,10月4日,谷歌推出全新的Android12正式版本,并且宣布会在今年晚些时候应用于安卓设备,对比Android11的挤牙膏式...【详细内容】
2021-10-29  Tags: Android  点击:(125)  评论:(0)  加入收藏
▌简易百科推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  像程序那样思考    Tags:Android开发   点击:(8)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  YuCoding    Tags:Android   点击:(8)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  网易Leo    Tags:Android开发   点击:(17)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  网易Leo    Tags:Android开发   点击:(22)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  像程序那样思考    Tags:Android开发   点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  永沧    Tags:Android   点击:(28)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  羊城小阳    Tags:Android   点击:(37)  评论:(0)  加入收藏
谷歌离推出Play Store应用程序的新数据隐私部分又近了一步。应用程序开发人员现在可以通过谷歌在Play控制台的新 "数据安全表 "填写相关细节。该公司表示,所需信息将从2022年...【详细内容】
2021-10-20    中关村在线  Tags:安卓   点击:(58)  评论:(0)  加入收藏
架构究竟是什么?如何更好的理解架构?我们知道一个APP通常是由class组成,而这些class之间如何组合,相互之间又如何产生作用,就是影响这个APP的关键点。细分的话我们可以将其分为类...【详细内容】
2021-09-17  像程序那样思考    Tags:Android架构   点击:(52)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  SecTr安全团队    Tags:Android开发   点击:(66)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条