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事件分发相关推荐

  1. 浅谈Android事件分发机制

    在Android实际开发过程中经常会遇到View之间的滑动冲突,如ScrollView与Listview.RecyclerView之间的嵌套使用.在很好的解决此类问题之前,我们应深入的了解Androi ...

  2. Android事件分发浅谈

    Android事件分发机制浅谈 前言:可能Android的事件分发对于刚学Android的童鞋来说接触得不多,这样不奇怪.因为刚学的时候,一般人很难注意到或是会选择主动去了解.那么究竟什么是Andro ...

  3. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...

  4. 浅谈Android Architecture Components

    浅谈Android Architecture Components 浅谈Android Architecture Components 简介 Android Architecture Componen ...

  5. 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解

    浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解 本篇文章小编为大家介绍,Android onTouchEvent 与 onInterceptTo ...

  6. Android事件分发-来龙去脉

    文章目录 情境(Situation) 冲突(Complication) 疑问(Question) 答案(Answer) 剖析 论点 约法三章 点 论据 人机交互 View树 类图 注释 DecorVi ...

  7. 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台

    一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...

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

    <div id="container">         <div id="header">     <div class=&qu ...

  9. 浅谈Android游戏开发基础和经验

    Android游戏开发基础和经验是本文要介绍的内容,主要是来了解并学习Android游戏开发的内容实例,具体关于Android游戏开发内容的详解来看本文. 做一个类似俄罗斯方块的android游戏开发 ...

  10. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

最新文章

  1. Windows PE变形练手2-开发一套自己的PE嵌入模板
  2. Dubbo Admin —— Spring Cloud Alibaba 2021.1 + Nacos + Dubbo Admin参考配置
  3. java中 a_java中 a++ 和 ++a
  4. lisp 河道水面线计算_天然河道水面线计算的几种方法解剖.pdf
  5. “数”驰天下,华为云DRS 高效支撑T3出行平稳迁移
  6. 查看被docker-proxy占用的端口
  7. ASP.NET中Request.InputStream使用
  8. 8. CSS/JS 文件管理
  9. 结队编程与日程管理系统维护改善
  10. 自定义list-style的兼容性问题解决办法
  11. 信号与线性系统分析(吴大正,郭宝龙)(2-冲激函数)
  12. 连接部分蓝牙耳机播放音乐无声音(aptx)问题
  13. 【Unity3D插件】AnyPortrait插件分享《(一)制作史莱姆动画》
  14. html插入swf自动播放,html嵌入播放器,flv视频播放器 Flvplayer.swf 可自动播放参数说明...
  15. 不开机win7计算机还原,Win7开机出现Windows错误恢复解决方法
  16. qq互联--qq登录例子 java版 源码_PHP版QQ互联OAuth示例代码分享
  17. me909嵌入式linux,linux4.1.4上移植ME909s-821,MU609 4G模块驱动
  18. kali的vmtool工具安装
  19. python3 题解(20)-五位数黑圈
  20. C#圆形卡尺测量程序基于halcon

热门文章

  1. 打印机提示连接计算机,电脑突然不识别连接的打印机,打印机突然显示未连接...
  2. pocket英语语法入门
  3. php程序 导出表格文件后缀,PHPExcel生成Excel文件---提示导出文件或者文件扩展名不一致,或导出的文件或文件扩展名无效...
  4. Android Gradle构建脚本
  5. python实现英文新闻摘要自动提取_自然语言处理之自动摘要
  6. python生成复合饼图
  7. 软件质量(六大要素及其分析)
  8. CAN网络dbc格式
  9. 【捣鼓】TypeError: “x” is not a constructor
  10. Java程序员学习必看 干货