浅谈Android事件分发
Android事件分发不论是实际应用中还是面试中都是经常用到的知识,所以今天简单的介绍一下。
首先,事件分发的"事件“是指Android中的点击(Touch)事件,事件分发渐大的讲就是讲点击事件传递到相应的View并处理的过程。
Android中对点击事件进行处理的对象及其顺序为:Activity->ViewGroup->view及其子类。
首先是Activity对事件进行分发:从用户手指接触到手机屏幕开始,事件就已经开始产生,Activity接收到用户点击的事件之后开始对事件进行分发(Activity.diapatchTouchEvent()),和消息传递机制一样,Android对事件的分发其实也是一种消息传递,总是从事件接收的“顶层”先往下传,如果“底层”无法处理事件才会回传由“顶层"处理,即是说,Activity.dispatchTouchEvent()会调用ViewGroup.dispatchTouchEvent();ViewGroup.dispatchTouchEvent()再调用view.dispatchTouchEvent()对事件进行处理(默认情况下)。
Activity对事件的分发过程如下:
Activity的dispatchTouchEvent()会对事件进行分发,首先调用ViewGroup.dispatchTouchEvent()来对事件进行处理,如果ViewGroup.dispatchTouchEvent()返回true,则Activity对事件的分发结束;如果ViewGroup.dispatchTouchEvent()返回false,那么Activity会调用自身的OnTouchEvent对事件进行处理,window.shouldCloseOnTouch()会对点击的位置进行判断,判断是位于边界内还是边界外。
ViewGroup对事件的分发过程如下:
ViewGroup对事件的分发从ViewGroup.dispatchTouchEvent()开始,在对事件进行分发之前,会先调用ViewGroup.OnInterceptTouchEvent()对是否拦截点击事件进行判断(默认不拦截),如果ViewGroup不对事件进行拦截,ViewGroup会遍历其中的view,如果找到相应的view则将该事件分发给相应的view处理,并返回true;如果没有找到相应的view则返回false,并有ViewGroup调用自己的ViewGroup.OnTouchEvent()对该事件进行处理,其中会调用ViewGroup父类的dispatchTouchEvent()对事件进行再次分发给ViewGroup,然后调用ViewGroup.OnTouch(),ViewGroup.performClick(),ViewGroup.OnClick(),消费掉这个点击事件。
view对点击事件的处理同样也是从view.dispatchTouch()事件开始,view首先会检查view是否注册了Touch监听,即view.setOnTouchLister()如果注册了Touch事件监听则会执行view.OnTouch()对事件进行处理、消费,如果view消费了这个事件,那么view.dispatchTouch()返回true,否则调用View.OnTouchEvent()处理,如果是Down事件,那么处理结束,如果是抬起事件则会调用view.performClick(),view.onClick()对事件进行消费。如果view最后消费了这个事件,那么view.dispatchTouchEnevnt()返回true,否则返回false。
Android事件分发机制大概就是这样,欢迎大家指正!
这里推荐一篇大佬的文章,讲的非常详细:
https://www.jianshu.com/p/38015afcdb58
浅谈Android事件分发相关推荐
- 浅谈Android事件分发机制
在Android实际开发过程中经常会遇到View之间的滑动冲突,如ScrollView与Listview.RecyclerView之间的嵌套使用.在很好的解决此类问题之前,我们应深入的了解Androi ...
- Android事件分发浅谈
Android事件分发机制浅谈 前言:可能Android的事件分发对于刚学Android的童鞋来说接触得不多,这样不奇怪.因为刚学的时候,一般人很难注意到或是会选择主动去了解.那么究竟什么是Andro ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...
- 浅谈Android Architecture Components
浅谈Android Architecture Components 浅谈Android Architecture Components 简介 Android Architecture Componen ...
- 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解 本篇文章小编为大家介绍,Android onTouchEvent 与 onInterceptTo ...
- Android事件分发-来龙去脉
文章目录 情境(Situation) 冲突(Complication) 疑问(Question) 答案(Answer) 剖析 论点 约法三章 点 论据 人机交互 View树 类图 注释 DecorVi ...
- 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台
一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
<div id="container"> <div id="header"> <div class=&qu ...
- 浅谈Android游戏开发基础和经验
Android游戏开发基础和经验是本文要介绍的内容,主要是来了解并学习Android游戏开发的内容实例,具体关于Android游戏开发内容的详解来看本文. 做一个类似俄罗斯方块的android游戏开发 ...
- 浅谈Android中的MVP与动态代理的结合
浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...
最新文章
- Windows PE变形练手2-开发一套自己的PE嵌入模板
- Dubbo Admin —— Spring Cloud Alibaba 2021.1 + Nacos + Dubbo Admin参考配置
- java中 a_java中 a++ 和 ++a
- lisp 河道水面线计算_天然河道水面线计算的几种方法解剖.pdf
- “数”驰天下,华为云DRS 高效支撑T3出行平稳迁移
- 查看被docker-proxy占用的端口
- ASP.NET中Request.InputStream使用
- 8. CSS/JS 文件管理
- 结队编程与日程管理系统维护改善
- 自定义list-style的兼容性问题解决办法
- 信号与线性系统分析(吴大正,郭宝龙)(2-冲激函数)
- 连接部分蓝牙耳机播放音乐无声音(aptx)问题
- 【Unity3D插件】AnyPortrait插件分享《(一)制作史莱姆动画》
- html插入swf自动播放,html嵌入播放器,flv视频播放器 Flvplayer.swf 可自动播放参数说明...
- 不开机win7计算机还原,Win7开机出现Windows错误恢复解决方法
- qq互联--qq登录例子 java版 源码_PHP版QQ互联OAuth示例代码分享
- me909嵌入式linux,linux4.1.4上移植ME909s-821,MU609 4G模块驱动
- kali的vmtool工具安装
- python3 题解(20)-五位数黑圈
- C#圆形卡尺测量程序基于halcon
热门文章
- 打印机提示连接计算机,电脑突然不识别连接的打印机,打印机突然显示未连接...
- pocket英语语法入门
- php程序 导出表格文件后缀,PHPExcel生成Excel文件---提示导出文件或者文件扩展名不一致,或导出的文件或文件扩展名无效...
- Android Gradle构建脚本
- python实现英文新闻摘要自动提取_自然语言处理之自动摘要
- python生成复合饼图
- 软件质量(六大要素及其分析)
- CAN网络dbc格式
- 【捣鼓】TypeError: “x” is not a constructor
- Java程序员学习必看 干货