进阶必备-Android事件分发机制

Android进阶必备:滑动冲突解决与事件分发机制(附视频讲解)这篇看完还不懂请寄刀片 1、前言 Android学习一段时间,需求做多了必然会遇到滑动冲突问题,比如在一个ScrollView中要嵌套一个地图View,这时候触摸移动地图或者放大缩小地图就会变得不太准确甚至没有反应,这就是遇到了滑动冲突,ScrollView中上下滑动与地图的触摸手势发生冲突。想要解决滑动冲突就不得不提到Android的事件分发机制,只有吃透了事件分发,才能对滑动冲突的解决得心应手。 作者:胖宅老鼠 链接:https://juejin.im/post/6844903829482242056 B站视频讲解:http 阅读详情

一、简介

或许你会问,“为什么我一定要知道View的事件分发机制?”。因为我们在实际开发的过程中,经常会遇到多层的View互相嵌套以后,对某一个View进行滑动的时候,特别不灵敏,甚至于没法滑动。这种滑动冲突的解决需要我们清楚的掌握View的事件分发机制。那下面我们详细的讲解下View的整个事件机制。
Android将View的事件封装到MotionEvent这个类中,这也是监听touch事件中回调给我们的参数public boolean onTouchEvent(MotionEvent event) 。通常事件我们主要关心下面几种类型:

  • MotionEvent.ACTION_DOWN
    当我们手指按下屏幕的第一个事件便是ACTION_DOWN了,也就是意味着事件的开始。

  • MotionEvent.ACTION_MOVE
    当我们手指按下屏幕后,在屏幕上滑动的过程,此事件就会不断的触发。

  • MotionEvent.ACTION_UP
    此事件在我们手指从屏幕抬起的时候会触发。

  • MotionEvent.ACTION_CANCEL
    这个事件说起来稍微复杂一点,举个栗子:当我们的外层View将事件传递给内层View去处理时,外层View的拦截方法一般会返回false,但是当某个条件触发后,外层View想自己处理接下来的事件,就拦截了事件分发,此时内层View就会收到ACTION_CANCEL的事件。

  • MotionEvent.ACTION_OUTSIDE
    这个事件我们不常用到,考虑这种场景。我们又一个Diallog弹出,当我们按Dialog以外的屏幕将Dialog消失掉。这个时候可以考虑监听这个事件,要想使用这个事件我们必须对当前的Window设置一个Flag:FLAG_WATCH_OUTSIDE_TOUCH。

下面我们介绍和事件分发相关的几个方法:

  • dispatchTouchEvent(MotionEvent event)
    这个方法是用来处理向下分发事件逻辑的,我们通过观察ViewGrope源码中的代码知道,这个方法细节较多,检出我们比较关心的逻辑就是这个方法会先判断子View是否有调用disallowIntercept父View去拦截事件,如果没有,父View自己会调用onInterceptTouchEvent判断自己是否有拦截,如果拦截事件,将调用父View自己的onTouchEvent方法去处理事件,如果没有拦截事件,事件将继续分发到子View中处理。

  • onInterceptTouchEvent(MotionEvent event)
    用来申明是否拦截事件继续向下分发,如果返回true,事件将不会继续向下分发,而是交由自己的onTouchEvent方法处理。

  • onTouchEvent(MotionEvent event)
    显然,这个就是事件处理的方法了。

  • onTouch(MotionEvent event)
    这个方法是在我们对某一个setOnTouchListener时回调,也就是在传递事件的时候,在交给View本身的onTouchEvent处理之前判断是否有监听的TouchListener,如果有优先调用TouchListener的onTouch方法处理。

二、详细分析View的分发事件

我们都知道,Android的View是树形结构的,所以当一个事件来临的时候一般是从根部分发下来的。为了方便我们接下来的理解,我们构建一个这样的例子:

假设我们有这样一个页面,最外层是一个ViewGroup A,里面嵌套着一个ViewGroup B,B里面有一个ViewGroup C。

在这里插入图片描述

情景1:

假设我们对事件不做任何拦截,也不做任何处理。当我们点击View C,这个时候我们看到的Log显示调用顺序为:

A -> dispatchTouchEvent
A -> onInterceptTouchEvent
B -> dispatchTouchEvent
B -> onInterceptTouchEvent
C -> dispatchTouchEvent
C -> onInterceptTouchEvent
C -> onTouchEvent ACTION_DOWN
B -> onTouchEvent ACTION_DOWN
A -> onTouchEvent ACTION_DOWN

由于没有任何View处理事件,最终会回调到Activity的onTouchEvent中去处理。从这个情景中我们可以知道,事件向下传递的过程以及处理事件的向上传递的过程。

情景2:

假设我们在View B的onTouchEvent中返回true,再次点击事件并滑动,我们得到的Log如下:

A -> dispatchTouchEvent
A -> onInterceptTouchEvent
B -> dispatchTouchEvent
B -> onInterceptTouchEvent
C -> dispatchTouchEvent
C -> onInterceptTouchEvent
C -> onTouchEvent ACTION_DOWN
B -> onTouchEvent ACTION_DOWN

A -> dispatchTouchEvent
A -> onInterceptTouchEvent
B -> dispatchTouchEvent
B -> onTouchEvent ACTION_MOVE

A -> dispatchTouchEvent
A -> onInterceptTouchEvent
B -> dispatchTouchEvent
B -> onTouchEvent ACTION_UP  

我们发现,除了ACTION_DOWN事件会下发到C,后续的事件不会再下发这是因为,当我们发现某一层View的onTouchEvent返回true以后,会有一个标志位表示后续的事件都由此View处理,后续事件不再下发到子View,直到ACTION UP事件后将标志位重置。

情景3:

假设我们在View B的onInterceptTouchEvent中返回true,再次点击C会怎么样呢?我们得到如下的Log记录:

A -> dispatchTouchEvent
A -> onInterceptTouchEvent
B -> dispatchTouchEvent
B -> onInterceptTouchEvent
B -> onTouchEvent ACTION_DOWN
A -> onTouchEvent ACTION_DOWN

相比较于情景2,ACTION_DOWN事件不会下发到C,由于没有View表示能处理,所以后续的事件均被取消。

三、总结

通过我们实际运行和分析源码发现,我们ViewGroup事件的分发流程如下所示:
在这里插入图片描述
对着上图大家不妨尝试分析下:

  • 如果B的onInterceptTouchEvent中返回true并且onTouchEvent中返回true,那么Log又将是怎样的呢?

可以关注微信公众号:南京Android部落,回复“666”获取答案哦~

安卓面经_Android面经(18/30)之事件分发机制全解析 事件分发机制属于安卓基础面试必问题目之一。最关键是理解事件分发三个函数的作用和返回值的含义,就基本足够应付面试了 阅读详情

相关推荐

别再死记硬背Payload了!深入理解Flask/Jinja2 SSTI的Python对象继承链与魔术方法

本文深入解析Flask/Jinja2 SSTI漏洞的底层原理,从Python对象模型出发,详细讲解如何通过魔术方法链实现RCE。文章揭示了Python对象继承链与魔术方法的精妙设计,提供了防御与绕过SSTI漏洞的实用技巧,帮助开发者深入理解漏洞本质并采取有效防护措施。

weixin_42525738的博客 356

Android事件分发机制【最新、最全、最易懂、由浅入深】

Android事件分发流程 = Activity -> ViewGroup -> View即:1个点击事件发生后,事件先传到Activity、再传到ViewGroup、最终再传到ViewActivity对点击事件的分发机制ViewGroup对点击事件的分发机制View对点击事件的分发机制Activity事件分发机制、ViewGroup事件分发机制、View事件分发机制当一个点击事件发生时,从Activity的事件分发开始(),流程总结如下:三者介绍。

丨康有为丨的博客 1万+

Opencv相机校准之棋盘格标定

Reference: https://yq.aliyun.com/articles/62472

y459541195的博客 3万+

Android事件分发机制详解:史上最全面、最易懂

点击事件由哪个对象发出,经过哪些对象,最终达到哪个对象并最终得到处理。这里的对象是指Activity、ViewGroup、View事件分发过程由dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()三个方法协助完成经过上述3个问题,相信大家已经对Android的事件分发有了感性的认知,接下来,我将详细介绍Android事件分发机制。

w1142203475的博客 1万+

不用写代码!3个免费在线工具教你完成Lasso回归分析(含生存资料处理)

本文介绍3款免费在线工具,帮助用户无需编程即可完成临床数据的Lasso回归分析,特别适合处理生存资料。通过详细的操作指南和实战技巧,读者可以轻松掌握变量筛选、模型优化及结果解读,提升临床研究的效率和准确性。

weixin_33738555的博客 349

Cadence Allegro 17.4学习记录开始01-原理图Capture CIS 17.4

Orcad的学习记录

qq_31444421的博客 1万+

Android的MotionEvent和事件处理

转载:(3条消息) Android的MotionEvent和事件处理_huaxun66的博客-优快云博客_motionevent.action_move MotionEvent MotionEvent对象是与用户触摸相关的时间序列,该序列从用户首次触摸屏幕开始,经历手指在屏幕表面的任何移动,直到手指离开屏幕时结束。手指的初次触摸(ACTION_DOWN操作),滑动(ACTION_MOVE操作)和抬起(ACTION_UP)都会创建MotionEvent对象,每次触摸时候这三个操作是肯定发生的。移动过程中也

m0_56231540的博客 2516

【AI Agent系列】【MetaGPT】9. 一句话订阅专属信息 - 订阅智能体进阶,实现一个更通用的订阅智能体(2)

订阅智能体进阶(2)。不用爬虫,直接提取网页信息。从RunSubscription分离出AddSubscriptionTask的action,并且让SubscriptionRunner单独运行。

同学小张的博客 1588

Android中的MotionEvent事件对象及属性值

当用户触摸屏幕时将创建一个MotionEvent对象。MotionEvent包含关于发生触摸的位置和时间等细节信息。 MotionEvent对象被传递到程序中合适的方法比如View对象的onTouchEvent()方法中。 在这些方法中我们可以分析MotionEvent对象那个,以决定要执行的操作。 public boolean onTouchEvent(MotionEvent ev

stven_king的专栏 3350

代谢组数据分析(十九):随机森林构建代谢组预后模型

建立胃癌(GC)预后模型时,从队列3中的181名患者中,使用右删失结果数据进行了随机分层抽样,分为训练数据集(n = 121)和测试数据集(n = 60)。训练了一个包含1000棵树的随机生存森林(RSF)模型,根据它们基于排列的特征重要性来选择突出的特征。通过再次训练随机生存模型,并选取28种代谢物,建立了显示出色预测能力(AUROC = 0.832,95% CI:0.697-0.951)的最佳模型,用于预测测试数据集中GC患者的生存结果。

专注生信领域 1713

ESD防护设计宝典(十一):CE(传导发射)超标问题排查与解决

(Conducted Emission, CE),亦称为传导骚扰,是电子电气设备或系统内部的电压、电流通过信号线、电源线或地线向外传输,对其他电子电气设备或系统造成电磁干扰的物理现象。其。

m0_56451176的博客 857

Android事件分发机制

Android的事件分发机制

qq_41095045的博客 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android面试总结

以下是我在面试过程中碰到的面试题 一.谈一下Android中的事件分发机制吧 Android中的控件都是直接或者间接继承View的,Viewgroup也是继承View的,ViewGroup中可以包含View,也可以包含ViewGroup,我们平时接触的譬如说LinearLayout啊、RelativeLayout就是ViewGroup的子类。 Android的事件分发机制我有看过它的源码,总的...

Star_cmx的博客 627

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

《Android自定义控件入门到精通》--文章目录

Android自定义控件入门到精通 自定义控件的流程(扫盲) 一、基础绘图 Point点 Line线 几何图形 Path路径 Region区域 Text文字 Paint画笔 Paint基础知识点 Paint.setPathEffect Paint.setShader Paint.setXfermode Paint.setColorFilter Canvas画布 二、绘图、测量、布局流程 View树的绘制流程 View树的测量流程 View树的布局流程 三、动画 帧动画FrameAnimati

Jhone_csdn的专栏 741

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

你连《Android高级UI与FrameWork源码》都搞不懂学什么Android?还敢面试阿里P7!

Android高级UI与FrameWork源码 重要性? 这块知识是现今使用者最多的,我们称之为Android2013~2016年的技术,但是,即使是这样的技术,Android开发者也往往因为网上Copy代码习惯了而导致对这块经常“使用”的代码 熟悉而又陌生: 熟悉的是几乎天天在和它们打交道,天天在复制这些代码; 陌生的是虽然天天和这些代码打交道,但是并没有深入研究过这些代码原理,代码深处的内涵。所以我们需要从新的角度去分析这些知识点, 深入研究他们,要学习源码,模仿源码,然后再hook源码,这样才能说自己

Android725的博客 417

Android学习进阶路线Android源码分享)

毕业8月有余,同时伴随着从事的Android经验的提升。仔细思量过去的工作内容,掐指算来也是少得可怜---主要维护FM收 音机模块,间或看看Lancher模块的代码。尽管这样,总的来说,在这八个月事件的学习里,我自我感觉收获还是很大的---自学了很多 Android相关方面的知识。虽然里真正的大牛还有很远的一段路程要走,自己也会坚持学习、坚持走下去。            再次,把自己学习

1198

面试 Android 中级开发工程师 常见问题

设计模式有哪些 Build模式(Builder类中的成员函数返回Builder对象自身的另一个作用就是让它支持链式调用,使代码可读性大大增强) ——AlertDialog.Builder ——StringBuilder和StringBuffer ——EventBus中也有一个Builder,只不...

u014622150的博客 298

学Android不知道这些,毕业=失业!

很多专科毕业,Android不好找工作的同学,看过来!!这样一个竞争激烈的市场环境下,想要成为一名优秀的Android开发者,仅仅依靠课本上的知识是远远不够的。那么,作为一名Android开发学习者,有哪些知识是我们必须掌握的呢?

Android23333的博客 145

Android学习进阶路线导航线路(Android源码分享)

From:http://blog.youkuaiyun.com/qinjuning/article/details/7416208

MaximusKiang的专栏 597

自定义view总结

1.源码分析自定义view 源码分析自定义view 2.view工作原理 ViewRoot和DecorView、MeasureSpec、view测量布局绘制过程、自定义view、getMeasuredWidth()与getWidth()函数区别 3.基础自定义view 绘图基础,自定义属性 4.Paint基本使用 硬件加速、文字、paint常用函数 5.动画深入分析 view动画、自定义view动画、属性动画(时间插值器和类型估值器)、ValueAnimator与ObjectAnimato

龚礼鹏的博客 423

Android基础知识点学习总结

安卓基础知识学习笔记分享~Linux内核层→系统运行层→应用框架层→应用层1、Linux内核层:Android系统是基于Linux内核的,这一层为硬件提供了底层的驱动,例如显示驱动,音频驱动,电源管理等等2、系统运行库层:这一层主要通过C/C++实现,为Android系统提供支持,例如SQLite库提供了数据库的支持,Webkit提供了浏览器内核的支持(SQLite数据库:轻量级,嵌入式关系型数据库)3、应用框架层:这一层提供了应用程序可能用到的各种API,我们开发者可以使用这些API来构建自己的应用程序4

weixin_45756537的博客 7391

Android面试题精选:讲一讲-Android-的事件分发机制,架构师必备

本来写到这就结束了,但回顾一遍还是打算给大家稍微总结一下。需要总结的小点:1、Android 事件分发总是遵循 Activity => ViewGroup => View 的传递顺序;2、onTouch()执行总优先于onClick()Android事件分发机制详解:史上最全面、最易懂,所以直接引用一下其中的图片。Activity 的事件分发示意图ViewGroup 事件分发示意图View 的事件分发示意图事件分发工作流程总结。

2401_83974087的博客 2540

Android 高工面试必考题(二):Android的事件分发机制设计与实现

本来写到这就结束了,但回顾一遍还是打算给大家稍微总结一下。需要总结的小点:1、Android 事件分发总是遵循 Activity => ViewGroup => View 的传递顺序;2、onTouch()执行总优先于onClick()Android事件分发机制详解:史上最全面、最易懂,所以直接引用一下其中的图片。Activity 的事件分发示意图ViewGroup 事件分发示意图View 的事件分发示意图事件分发工作流程总结。

2401_83739727的博客 635
上一篇: 通俗易懂的双亲委派机制
下一篇: ConstraintLayout的基本用法及优点
IT烂笔头
博客等级 码龄15年 621粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值