`
Z_萧晓
  • 浏览: 11062 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

移动开发:你以为事件分发很简单,但我却被问哭了...

阅读更多

今天上班第一天给大家娱乐一下,给大家讲讲事件分发,你可能会一笑:“别搞我呀,事件分发谁不知道呀。”

但是,今天的内容,可能真的有你不知道的。

注意:如果你对事件分发原理并不是太了解,那么需要先对事件分发有足够的了解,最后再进行后续的阅读。

下面开始正文,因为这个问题是与同事间交流产生,所以本文以对话形式呈现。

主角:

小 A,小 B。

小 A:B 啊,你给我言简意赅的讲讲事件分发的流程。

小 B:好嘞。

“事件分发是针对一次手势的过程,这个手势包含一次 ACTION_DOWN,多次 ACTION_MOVE,和一次 ACTION_UP”,在 ACTION_DOWN 的时候来决定本次事件的“TargetView”,该 View 会决定这次事件分发的事件流向。

父控件可以在 ACTION_DOWN或者 targetView不为空的情况下,进行拦截,如果拦截了 targetView 的事件,会给它发一个 ACTION_CANCEL。

小 A:回答的可以呀,我来考你几个问题。

小 B:尽管来。

小 A:你说一次事件分发过程中会有多次ACTION_POINT_DOWN吗?

小 B内心:这不是送分题么,看样子小 A 兄弟对于多指这块不太熟悉呀,这都能做为问题。

小 B:当然可以,多指的时候,你按下第一个手指,再按下第二个手指ACTION_POINTER_DOWN就来了。

你可以看看 ViewPager,ScrollView 这些官方类源码,都有多指的处理。

小 A:鬼魅一笑,然后那我再问你,一次事件分发过程中,可能会有多次ACTION_DOWN吗?

小 B:等等,如果我答对了,一瓶可乐。

小 A:好。

小 B:没有,只有你第一个手指按下才是 ACTION_DOWN,从第二个开始都是ACTION_POINTER_DOWN,当然了前提是你自己不修改 dispatchTouchEvent 分发逻辑哈,改了可不算,是不是要去买可乐了。

小 A:好,最后我再问你一个具体的问题,一个 LinearLayout 内部有两个 Button,当我第一个手指按在第一个 Button 上,第二个手指按在第二个 Button 上,这两个 Button哪个会收到 ACTION_DOWN?分别抬起每个手指,哪个 Button 的 Click 会被触发?

小 B:当然是第一个收到 ACTION_DOWN,那么应该也是第一个能触发 click。

小 A:不错不错,你先去做个实验,再决定要不要我去买可乐。

对话结束。

到这里大家觉得小 B 回答的怎么样?

先别往下看,自己想想自己的回答应该是什么,如果错了,麻烦给我买瓶可乐。

小 B 回去测试。

大吼一声:为了可乐!

快速写完 Demo,分为自定义了一个 MyLinearLayout,MyButton,复写dispatchTouchEvent,打上 Event 日志,再加上 onclick 事件日志。

按照之前的描述实验:

一个 LinearLayout 内部有两个 Button,当我第一个手指按在第一个 Button 上,第二个手指按在第二个 Button 上,这两个 Button哪个会收到 ACTION_DOWN?分别抬起每个手指,哪个 Button 的 Click 会被触发?

看到 Log,心凉了。

第一个手指按下第一个 Button 上,第一个 Button 收到 ACTION_DOWN。
第二个手指按在第二个 Button 上,第二个 Button 竟然也收到了 ACTION_DOWN。

分别抬起时,两个 Button 的 Click 依次触发。

注意:大家测试的时候,Button 可以搞大一些,两个 Button 距离远一些,防止误触。

小 B带着两瓶可乐来到小 A 面前,大哥赶紧给我讲讲。

小 A:

好,在非常早期,很多博客的事件分发代码都是基于 2.x 系列的,那会代码是这样的:

 

完整代码见这里

MotionTarget 就是一个 View。而在后续的代码,"targetView"已经不再是一个独立的 View 了,而是一个类似于链表。

// First touch target in the linked list of touch targets.
private TouchTarget mFirstTouchTarget;

private static final class TouchTarget {

    // The touched child view.
    public View child;

    // The next target in the target list.
    public TouchTarget next;
}

你顺着这个差异去看源码就明白了。

小 B:这波不亏,虽然亏了两瓶可乐,但是学到了。

好了,AB 角色结束,对话内容基本上是同事间日常对话,当然我故意润色了一些。

再次友情提示:在面试的时候,不要故意显摆你知道一个事件分发逻辑可能有多个 ACTION_DOWN,一定要分情况说清楚,因为面试官很可能没看过这篇文章,把你挂了别怪我...

最后

其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

 
 

上述【高清技术脑图】以及【配套的架构技术PDF】可以 加我wx:X1524478394 免费获取!

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

最后如果你和小B错的一样,可乐我就不要了,点个赞可以吧~

 
分享到:
评论

相关推荐

    移动应用分发未来:内容驱动APP分发.pdf

    移动应用分发未来:内容驱动APP分发.pdf

    自己写的android事件分发拦截处理的代码可以清楚知道事件分发拦截和处理的过程.rar

    在Android开发中,事件分发是用户界面交互的关键部分,涉及到Activity、ViewGroup以及View之间的协同工作。这个压缩包中的代码示例着重于演示如何在Android中实现事件分发的拦截与处理。以下是对相关知识点的详细...

    事件分发分析Demo

    在Android开发中,事件分发是用户界面交互的基础,它涉及到Activity、Fragment、ViewGroup以及View之间的消息传递。本"事件分发分析Demo"旨在深入探讨Android事件分发机制,帮助开发者更好地理解和应用这一核心概念...

    Android事件分发机制总结Demo

    1. **事件序列**:事件分发分为按下(ACTION_DOWN)、移动(ACTION_MOVE)和释放(ACTION_UP)等阶段。事件首先由根ViewGroup接收到,然后逐级向下分发。 2. **dispatchTouchEvent()**:这是事件分发的主要入口。在...

    事件分发机制学习Demo

    ACTION_DOWN是事件的开始,ACTION_UP是结束,ACTION_MOVE处理滑动操作,ACTION_CANCEL通常发生在手指离开屏幕但事件未被完全处理的情况下。 6. **MotionEvent类**:MotionEvent对象封装了触摸事件的所有信息,如...

    事件分发_C#_事件分发_serious791_

    事件分发是C#中的一个重要概念,它允许对象之间进行异步通信,使得一个对象(事件源)可以在特定事件发生时通知其他对象(事件监听者或事件处理者)。在本篇中,我们将深入探讨C#中的事件分发机制,并通过一个名为...

    Android事件分发机制(三)事件分发和消费

    本文将详细解析Android事件分发机制的第三部分:事件分发和消费,帮助开发者深入理解这一关键过程。 事件分发主要包括两个阶段:事件传播和事件消费。当用户在屏幕上进行触摸操作时,Android会生成一个MotionEvent...

    Android Touch事件分发机制代码一

    - 如果ViewGroup的onInterceptTouchEvent()返回true,但子View的onTouchEvent()返回false,那么事件会被ViewGroup消费,即使子View没有处理事件。 - 当触摸事件发生在一个不可见或不可点击的View上时,事件将直接...

    android事件分发机制Demo

    在Android开发中,事件分发机制是理解和优化用户交互界面不可或缺的部分。事件主要指的是用户的触摸操作,例如点击、滑动等。当用户在屏幕上进行操作时,这些事件会经过一系列的处理和分发,最终到达相应的View进行...

    android事件分发流程

    总结来说,Android事件分发流程是一个复杂但重要的概念,理解并掌握它对于优化用户界面交互和提高应用性能至关重要。开发者应熟练掌握Activity、ViewGroup和View之间的事件传递规则,以及如何通过自定义行为来满足...

    事件分发demo

    在Android开发中,事件分发是用户界面交互的关键部分,它决定了用户触摸屏幕后,事件如何在View层次结构中传递和处理。这个"事件分发demo"是一个专门为开发者设计的测试示例,用于帮助理解并熟悉Android事件分发机制...

    Android事件分发机制演示demo

    1. **dispatchTouchEvent()**:事件首先由Activity接收,然后通过`dispatchTouchEvent()`方法将事件分发给根布局(如LinearLayout, FrameLayout等)。根布局再将其分发给它的子视图。 2. **onInterceptTouchEvent()...

    手写Android事件分发机制

    在Android开发中,事件分发机制是至关重要的一个部分,它决定了用户与界面交互时,事件如何在View、 ViewGroup及Activity之间传递。本教程将深入探讨如何手写Android事件分发机制,通过自定义代码来理解和模拟原生...

    Android 事件分发机制视频讲解

    ### Android 事件分发机制详解 #### 一、引言 在Android开发中,事件处理是用户界面交互设计的核心组成部分。对于开发者来说,理解事件如何被分发到各个控件中至关重要,因为这直接影响到应用的用户体验。本文将从...

    Android事件分发机制(上) ViewGroup的事件分发

    在Android开发中,事件分发机制是理解和优化用户交互体验的关键。本文主要关注ViewGroup的事件分发,这是Android事件处理的重要组成部分。ViewGroup作为View的容器,它不仅包含多个子View,还负责管理这些子View的...

    Android事件分发机制

    - **ACTION_DOWN**:事件首次触达时,会调用`onTouchEvent()`,若该View处理了DOWN事件并返回`true`,则表示它会接收后续的事件序列。 - **ACTION_MOVE**:在DOWN事件被消费后,所有后续的MOVE事件将直接传递给...

    view的事件分发机制demo2

    在Android开发中,事件分发机制是理解和优化用户交互体验的关键环节。本文将深入探讨"view的事件分发机制demo2",并基于链接提供的详细讲解进行总结。 Android事件分发机制主要包括三个步骤: DispatchTouchEvent...

    android事件分发、拦截、处理的示例代码

    在Android开发中,事件分发、拦截和处理是UI交互中的关键部分,它涉及到Activity、ViewGroup和View之间的协作。事件通常指的是用户与屏幕上的控件进行交互时产生的触摸事件,如点击、滑动等。下面我们将深入探讨这一...

    事件分发机制

    在Android开发中,事件分发机制是理解和优化用户交互体验的关键环节。事件,通常指的是用户的触摸操作,如点击、滑动等,这些操作如何被准确地传递到相应的View上进行处理,就是事件分发机制的核心内容。下面我们将...

Global site tag (gtag.js) - Google Analytics