为什么80%的码农都做不了架构师?>>>   

本文地址:https://my.oschina.net/lifj/blog/1928132

Android 事件分发过程

网上有很多这样的文章,我又写了一篇,希望能够清晰明了的告诉大家整体的事件分发过程,而不是一脸懵逼的进来,一脸懵逼的出去。

三个事件

  • dispatchTouchEvent (View 和 ViewGroup都有)
  • onInterceptTouchEvent(只有ViewGroup有
  • onTouchEvent(View 和 ViewGroup都有)

事件的调用流程图

从上图可以看到:dispatchTouchEvent的返回值可能是由两部分决定的:自身的touchEvent返回值,或者子view的dispatchTouchEvent的返回值。

整体分发思路 -- 伪代码

/** 事件分发的伪代码*/
public class Layout extends ViewGroup{private View targetChild = null;//记录DOWN事件找到的目标view,作为后续事件的分发对象。public boolean dispatchTouchEvent(MotionEvent event){if(this instanceof ViewGroup){//DOWN的时候targetChild为null。其他后续事件不为null。if(targetChild != null){//MOVE,UP,CANCEL等事件直接dispatch过去。return targetChild.dispatchTouchEvent(event);}//DOWN的时候会走以下逻辑boolean interceptRet = this.onInterceptTouchEvent(event);if(interceptRet == true){//拦截,调用自身的onTouchEvent,并返回return this.onTouchEvent(event);}else if(interceptRet == false){//不拦截,遍历子Viewfor(int i = 0 ;i< getChildCount();i++){targetChild = getChildAt(i); //判断是不是目标Viewif(targetChild.dispatchTouchEvent(event)){//dispatchTouchEvent返回true,说明是。并返回return true;}else{//否则不是targetChild = null;}}//没有找到targetView,调用自身的TouchEvent,并返回if(targetChild == null){return this.onTouchEvent(event);}}}else if(this instanceof View){//View直接走自己的onTouchEventreturn this.onTouchEvent(event);}return false;}}

各自的作用

dispatchTouchEvent: 对于ViewGroup来说:根据onInterceptTouchEvent的返回值,决定调用自身的onTouchEvent还是分发到子view里面。 对于View来说:直接调用onTouchEvent。

onInterceptTouchEvent: 告诉dispatchTouchEvent是不是需要分发下去(也就是被拦截)

onTouchEvent: 自身的处理

Down 与其他事件

Down事件的特殊之处

Down事件作为Event的第一个事件,担任的重任就是找到需要处理Event的控件。如果Down分发一遍之后没有找到需要处理事件,那么这个消息就不会再传到这些View(ViewGroup)中了。 怎么知道没有控件去处理呢?就是通过dispatchTouchEvent的返回值判断的: 返回false,说明没有view需要处理事件。 返回true,说明有View需要处理。对于View,就是自己需要处理。对于ViewGroup,可能是子View需要处理,也可能是自己需要处理。

当返回true之后,ViewGroup中会记录需要处理的View的对象,作为targetChild。否则的话targetChild为null。

其他事件

根据Down事件的返回结果,返回false的话,后续其他的事件都不会分发下来。

返回true的情况,第一个调用的还是dispatchTouchEvent,上一次Down事件记录了targetChild,那么就会直接调用targetChild的dispatchTouchEvent。如此调用下去,直到return true。

事件的来源

android.os.Looper.loop(Looper.java:136) 取出消息
InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6188)
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859)
android.view.View.dispatchPointerEvent(View.java:10244)
android.app.Activity.dispatchTouchEvent(Activity.java:3065)
com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1808)
com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:416)
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2264)

也就是说:事件会被放到Activity的Looper中。 然后从Looper中取出,传给ViewRootImpl,入队。 ViewRootImpl中的deliver去传递事件给View,给Activity,给DocerView. (启动Activity会创建ViewRootImpl和PhoneWindow,建立起与WMS(window manager service)的连接)

转载于:https://my.oschina.net/lifj/blog/1928132

Android 事件分发 简单学相关推荐

  1. Android事件分发简单介绍

    简单的讨论下关于Android的事件分发,其实网上的介绍很多,但是每次看完我都记的很晕,而我也只想知道当不同的返回值事件走的流程,所以这也只为自己做个简单的记录 首先说一下关于事件分发ViewGrou ...

  2. Android事件分发浅谈

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

  3. Android事件分发机制在实战开发中的应用之一

    学习的最终目标就是要学以致用,本文所分享的案例都是自己在公司实战开发过程中的真实案例,现在把它分享出来,希望对初学者有所帮助 版权声明:本文来自门心叼龙的博客,属于原创内容,转载请注明出处:https ...

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

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

  5. Android事件分发机制五:面试官你坐啊

    前言 很高兴遇见你~ 事件分发系列文章已经到最后一篇了,先来回顾一下前面四篇,也当个目录: Android事件分发机制一:事件是如何到达activity的? : 从window机制出发分析了事件分发的 ...

  6. android触摸事件分发,Android 事件分发机制

    Android 事件分发机制一直让人头痛,之前也是面向 GitHub 编程得过且过.今天下定决心了解一下,以便后面自己定制 View 效果.Android 触摸事件有三个基本类型:ACTION_DOW ...

  7. 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

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

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

  9. 浅谈Android事件分发机制

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

最新文章

  1. 当下火热的大数据视频,免费送(含源码)
  2. 6、linux网络编程--UDP协议编程
  3. QT配置opencv开发环境
  4. 关于pagehelper分页
  5. api-gateway实践(03)新服务网关 - 网关请求拦截检查
  6. P8207-[THUPC2022 初赛]最小公倍树【Kruskal】
  7. 将系统默认记事本替换成自己喜欢的文本编辑器
  8. 阿里影业宣布新战略:“新基础设施”赋能电影产业
  9. HTTP 错误 403.6 - Forbidden 解决方案
  10. 网络工程师Day4--实验3-1 配置ACL过滤企业数据
  11. 批量修改所选文件夹中所有文件的名称
  12. Linux源码安装pgadmin4,linux安装pgadmin3
  13. 联想服务器的主板型号怎么看,科技知识:联想主板型号怎么看
  14. 【SNA】社会网络分析二 Gephi 功能详解
  15. 云服务器几核CPU够用
  16. 【面试题】面向对象与面向过程的区别
  17. 2022-2027年(新版)中国伺服电机行业发展前景及趋势预测分析报告
  18. [leetcode]Unique Paths II
  19. redefinition; different type modifiers错误解决
  20. DataNode(面试开发重点3)

热门文章

  1. 国际运营商智慧城市探索与实践
  2. 远看像乱序执行,近看是内存屏障的 BUG 是如何解决的?
  3. 漫画:前端发展史的江湖恩怨情仇
  4. 服!AI 让兵马俑“活”起来,颜值惊艳!
  5. 昊天善圈浅谈比特币这个类型区块链应用技术的特点及作用
  6. Dubbo和Zookeeper
  7. BBSSDK插件技术方案
  8. 书评:测试驱动开发的艺术
  9. IT一大道至简: 文章列表
  10. ButterKnife源码解析