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

这篇具有很好参考价值的文章主要介绍了Android事件分发机制五:面试官你坐啊。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 学过事件分发吗,聊聊什么是事件分发

事件分发是将屏幕触控信息分发给控件树的一个套机制。 当我们触摸屏幕时,会产生一些列的MotionEvent事件对象,经过控件树的管理者ViewRootImpl,调用view的dispatchPointerEvnet方法进行分发。

  1. 那主要的分发流程是什么:

在程序的主界面情况下,布局的顶层view是DecorView,他会先把事件交给Activity,Activity调用PhoneWindow的方法进行分发,PhoneWindow会调用DecorView的父类ViewGroup的dispatchTouchEvent方法进行分发。也就是Activity->Window->ViewGroup的流程。ViewGroup则会向下去寻找合适的控件并把事件分发给他。

  1. 事件一定会经过Activity吗?

不是的。我们的程序界面的顶层viewGroup,也就是decorView中注册了Activity这个callBack,所以当程序的主界面接收到事件之后会先交给Activity。 但是,如果是另外的控件树,如dialog、popupWindow等事件流是不会经过Activity的。只有自己界面的事件才会经Activity。

  1. Activity的分发方法中调用了onUserInteraction()方法,你能说说这个方法有什么作用吗?

好的。这个方法在Activity接收到down的时候会被调用,本身是个空方法,需要开发者自己去重写。 通过官方的注释可以知道,这个方法会在我们以任意的方式开始与Activity进行交互的时候被调用。比较常见的场景就是屏保:当我们一段时间没有操作会显示一张图片,当我们开始与Activity交互的时候可在这个方法中取消屏保;另外还有没有操作自动隐藏工具栏,可以在这个方法中让工具栏重新显示。

  1. 前面你讲到最后会分发到viewGroup,那么viewGroup是如何分发事件的?

viewGroup处理事件信息分为三个步骤:拦截、寻找子控件、派发事件。

事件分发中有一个重要的规则:一个触控点的一个事件序列只能给一个view处理,除非异常情况。所以如果viewGroup消费了down事件,那么子view将无法收到任何事件。

viewGroup第一步会判读这个事件是否需要分发给子view,如果是则调用onInterceptTouchEvent方法判断是否要进行拦截。 第二步是如果这个事件是down事件,那么需要为他寻找一个消费此事件的子控件,如果找到则为他创建一个TouchTarget。 第三步是派发事件,如果存在TouchTarget,说明找到了消费事件序列的子view,直接分发给他。如果没有则交给自己处理。

  1. 你前面讲到“一个触控点的一个事件序列只能给一个view处理,除非异常情况”,这里有什么异常情况呢?如果发生异常情况该如何处理?

这里的异常情况主要有两点:1.被viewGroup拦截,2.出现界面跳转等其他情况。

当事件流中断时,viewGroup会发送一个ACTION_CANCEL事件给到view,此时需要做一些状态的恢复工作,如终止动画,恢复view大小等等。

  1. 那既然说到ACTION_CANCEL类型,那你可以说说还有什么事件类型吗?

除了ACTION_CANCEL,其他事件类型还有:

  • ACTION_MOVE:当我们手指在屏幕上滑动时产生此事件
  • ACTION_UP:当我们手指抬起时产生此事件

此外多指操作也比较常见:

  • ACTION_POINTER_DOWN: 当已经有一个手指按下的情况下,另一个手指按下会产生该事件
  • ACTION_POINTER_UP: 多个手指同时按下的情况下,抬起其中一个手指会产生该事件。

一个完整的事件序列是从ACTION_DOWN开始,到ACTION_UP或者ACTION_CANCEL结束。 一个手指的完整序列是从ACTION_DOWN/ACTION_POINTER_DOWN开始,到ACTION_UP/ACTION_POINTER_UP/ACTION_CANCEL结束。

  1. 哦?说到多指,那你知道ViewGroup是如何将多个手指产生的事件准确分发给不同的子view吗

这个问题的关键在于MotionEvent以及ViewGroup内部的TouchTarget。

每个MotionEvent中都包含了当前屏幕所有触控点的信息,他的内部用了一个数组来存储不同的触控id所对应的坐标数值。

当一个子view消费了down事件之后,ViewGroup会为该view创建一个TouchTarget,这个TouchTarget就包含了该view的实例与触控id。这里的触控id可以是多个,也就是一个view可接受多个触控点的事件序列。

当一个MotionEvent到来之时,ViewGroup会将其中的触控点信息拆开,再分别发送给感兴趣的子view。从而达到精准发送触控点信息的目的。

  1. 那view支持处理多指信息吗?

View默认是不支持的。他在获取触控点信息的时候并没有传入触控点索引,也就是获取的是MotionEvent内部数组中的第一个触控点的信息。多指需要我们自己去重写方法支持他。

  1. 嗯嗯…那View是如何处理触摸事件的?

首先,他会判断是否存在onTouchListener,存在则会调用他的onTouch方法来处理事件。如果该方法返回true那么就分发结束直接返回。而如果该监听器为null或者onTouch方法返回了false,则会调用onTouchEvent方法来处理事件。

onTouchEvent方法中支持了两种监听器:onClickListener和onLongClickListener。View会根据不同的触摸情况来调用这两个监听器。同时进入到onTouchEvent方法中,无论该view是否是enable,只要是clickable,他的分发方法都是返回true。

总结一下就是:先调用onTouchListener,再调用onClickListener和onLongClickListener。

  1. 你前面多次讲到分发方法和返回值,那你可以讲讲主要有什么方法以及他们之间的关系吗?

嗯嗯。核心的方法有三个:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。

简单来说:dispatchTouchEvent是核心的分发方法,所有分发逻辑都在这个方法中执行;onInterceptTouchEvent在viewGroup负责判断是否拦截;onTouchEvent是消费事件的核心方法。viewGroup中拥有这三个方法,而view没有onInterceptTouchEvent方法。

  • viewGroup
1.  viewGroup的dispatchTouchEvent方法接收到事件消息,首先会去调用onInterceptTouchEvent判断是否拦截事件
    *   如果拦截,则调用自身的onTouchEvent方法
    *   如果不拦截则调用子view的dispatchTouchEvent方法
2.  子view没有消费事件,那么会调用viewGroup本身的onTouchEvent
3.  上面1、2步的处理结果为viewGroup的dispatchTouchEvent方法的处理结果,没有消费则返回false并返回给上一层的onTouchEvent处理,如果消费则分发结束并返回true。
  • view
1.  view的dispatchTouchEvent默认情况下会调用onTouchEvent来处理事件,返回true表示消费事件,返回false表示没有消费事件
2.  第1步的结果就是dispatchTouchEvent方法的处理结果,成功消费则返回true,没有消费则返回false并交给上一层的onTouchEvent处理

简单来说,在控件树中,每个viewGroup在dispatchTouchEvent方法中不断往下分发寻找消费的view,如果底层的view没有消费事件则会一层层网上调用viewGroup的onTouchEvent方法来处理事件。

同时,由于Activity继承了Window.CallBack接口,所以也有dispatchTouchEvent和onTouchEvent方法:

  1. activity接收到触摸事件之后,会直接把触摸事件分发给viewGroup
  1. 如果viewGroup的dispatchTouchEvent方法返回false,那么会调用Activity的onTouchEvent来处理事件
  1. 第1、2步的处理结果就是activity的dispatchTouchEvent方法的处理结果,并返回给上层
  1. 看来你对事件分发了解得挺多的,那你在实际中有运用到事件分发吗?

嗯嗯,有的。举两个例子。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

Android事件分发机制五:面试官你坐啊,程序员,android,microsoft

Android事件分发机制五:面试官你坐啊,程序员,android,microsoft

Android事件分发机制五:面试官你坐啊,程序员,android,microsoft

Android事件分发机制五:面试官你坐啊,程序员,android,microsoft

Android事件分发机制五:面试官你坐啊,程序员,android,microsoft

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

Android事件分发机制五:面试官你坐啊,程序员,android,microsoft

《960全网最全Android开发笔记》

Android事件分发机制五:面试官你坐啊,程序员,android,microsoft

《379页Android开发面试宝典》

Android事件分发机制五:面试官你坐啊,程序员,android,microsoft

《507页Android开发相关源码解析》

Android事件分发机制五:面试官你坐啊,程序员,android,microsoft

因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图文章来源地址https://www.toymoban.com/news/detail-851991.html

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

-1711778886371)]

《507页Android开发相关源码解析》

[外链图片转存中…(img-XxiLrw6v-1711778886371)]

因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

到了这里,关于Android事件分发机制五:面试官你坐啊的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Android-高级-UI-进阶之路-(二)-深入理解-Android-8-0-View-触摸事件分发机制,查漏补缺

    Android-高级-UI-进阶之路-(二)-深入理解-Android-8-0-View-触摸事件分发机制,查漏补缺

    我们看到内部又调用了父类 dispatchTouchEvent 方法, 所以最终是交给 ViewGroup 顶级 View 来处理分发了。 顶级 View 对点击事件的分发过程 在上一小节中我们知道了一个事件的传递流程,这里我们就大致在回顾一下。首先点击事件到达顶级 ViewGroup 之后,会调用自身的 dispatchTouchE

    2024年04月14日
    浏览(13)
  • 安卓之事件分发机制

    安卓之事件分发机制

    事件分发的”事件“是指什么? 答:点击事件(Touch事件)。 当用户触摸屏幕(VIew或ViewGroup)时,将产生点击事件,即Touch事件。Touch事件的细节(如:触摸位置、事件等)会被封装成MotionEvent对象。 常见的事件: MotionEvent.ACTION_DOWN:按下。 MotionEvent.ACTION_UP:抬起。 MotionE

    2024年02月15日
    浏览(10)
  • SpringBoot源码分析(三):SpringBoot的事件分发机制

    SpringBoot源码分析(三):SpringBoot的事件分发机制

    通过解读 Springboot 的事件分发源码,了解一下几个问题: Springboot 注册事件监听器有几种方式,分别是什么? 什么情况下注册的事件监听会失效(接收不到Springboot事件)? Springboot 利用的哪一个类做的事件分发操作? Spring 是如何利用泛型做到的事件分发? 怎么自定义 lis

    2024年02月10日
    浏览(13)
  • Android 事件分发

    本篇文章主要简单介绍下Android中的事件分发,和大家一起学习,进步,有问题也希望大家及时指证修改. 1: onClick和OnTouch 首先我们在单独的activity中添加个按钮button.增加点击事件setOnClickListener: 接着添加OnTouch: 我们执行下点击事件.可以看到输出如下: 2024-04-09 20:54:11.219 17770-17770/?

    2024年04月11日
    浏览(13)
  • Android 事件分发介绍

    Android 事件分发介绍

    目录 一、目的 二、环境 三、相关概念 3.1 事件分发 四、详细设计 4.1应用布局 4.1.1 应用布局结构 4.1.2 LayoutInspector 4.2 关键View方法 4.2.1 相关View 4.2.2 相关方法 4.2.3 View与方法关系 4.3 事件分发概念图 4.3.1 事件分发类图 4.3.2 事件分发模型图 4.4 Activity组件 4.4.1 Activity-dispatchTouch

    2024年02月03日
    浏览(10)
  • Android事件分发-基础原理和场景分析

    作者:京东零售 郭旭锋 和其他平台类似,Android 中 View 的布局是一个树形结构,各个 ViewGroup 和 View 是按树形结构嵌套布局的,从而会出现用户触摸的位置坐标可能会落在多个 View 的范围内,这样就不知道哪个 View 来响应这个事件,为了解决这一问题,就出现了事件分发机制

    2023年04月21日
    浏览(15)
  • Android进阶 View事件体系(二):从源码解析View的事件分发

    Android进阶 View事件体系(二):从源码解析View的事件分发

    本篇文章为总结View事件体系的第二篇文章,前一篇文章的在这里:Android进阶 View事件体系(一):概要介绍和实现View的滑动 本篇文章将专注于介绍View的点击事件的分发,介绍的内容主要有: 点击事件的传递原则 解析Activity的构成 源码解析View的事件分发 源码解析View对点击

    2024年02月06日
    浏览(19)
  • [Android 13]Input系列--触摸事件在应用进程的分发和处理

    [Android 13]Input系列--触摸事件在应用进程的分发和处理

    hongxi.zhu 2023-7-21 Android 13 前面我们已经梳理了input事件在native层的传递,这一篇我们接着探索input事件在应用中的传递与处理,我们将按键事件和触摸事件分开梳理,这一篇就只涉及触摸事件。 一、事件的接收 从前面的篇幅我们知道,framework native层 InputDispatcher 向应用通过s

    2024年02月15日
    浏览(13)
  • 【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(二):核心机制策略

    【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(二):核心机制策略

    关于MySQL部分的核心知识进行一网打尽,包括三部分: 基础知识考察、核心机制策略、性能优化策略 ,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第二部分:核心机制策略,子节点表示追问或同级提问 关于MySQL的几种日

    2024年01月22日
    浏览(11)
  • Android 关于View事件分发(onTouch、onTouchEvent、onClick、onLongClick的关系及原理)(一)

    事件 含义 ACTION_DOWN 手指初次碰到屏幕时触发 ACTION_MOVE 手指在屏幕上滑动时触发(ps:会多次触发,看源码时同一块代码应该看多次去理解) ACTION_UP 手指离开屏幕时触发 ACTION_CANCEL 事件被上层拦截时触发   关于ACTION_MOVE事件,手指在屏幕上滑动时会触发多次,对于这个点,看源码

    2024年01月24日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包