图解 Android 事件分发机制

1、当 UI 主线程收到触摸 input 事件,经过一系列处理,最终会走到 DecorView 的 dispatchTouchEvent 方法。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    final Window.Callback cb = mWindow.getCallback();
    return cb != null && !mWindow.isDestroyed() && mFeatureId < 0
        ? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev);
}

Activity 实现了 Window.Callback 接口,所以接下来会调用 Activity 的 dispatchTouchEvent,所以可以将 Activity 作为原始的事件分发者。

2、事件分发、拦截与消费

类型

相关方法

Activity

ViewGroup

View

事件分发

dispatchTouchEvent

事件拦截

onInterceptTouchEvent

X

X

事件消费

onTouchEvent

其中,Activity 与 View 没有事件拦截,主要原因是:

Activity 作为原始的事件分发者,如果 Activity 拦截了事件会导致整个屏幕无法响应事件,不是我们想要的效果;View 作为事件传递的最末端,要么消费事件,要么不处理事件进行回传,根本没必要拦截。

3、事件分发流程

Android View 是树形结构,事件分发流程采用的是责任链模式。

事件传递:

Activity -> PhoneWindow -> DecorView -> ViewGroup -> ... -> View

事件回传:

Activity <- PhoneWindow <- DecorView <- ViewGroup <- ... <- View

4、onInterceptTouchEvent 返回 true 表示事件拦截,onTouchEvent 返回 true 表示事件消费,

5、事件在从 Activity.dispatchTouchEvent 往下分发的过程中。

如果中间的 ViewGroup 都不拦截,进入最底层的 View 后,由View.onTouchEvent 处理,如果 View 也没有消费事件,最后会返回到 Activity.onTouchEvent。

如果中间任何一层 ViewGroup 拦截事件,则事件不再往下分发,交由拦截的 ViewGroup 的 onTouchEvent 来处理。

6、如果 View 没有消费 ACTION_DOWN 事件,则之后的 ACTION_MOVE 等事件都不会再接收。

原文发布于微信公众号 - 空帆船w(gh_a27e6529b76c)

原文发表时间:2018-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏郭耀华‘s Blog

Android中级教程之----Log详解(Log.v,Log.d,Log.i,Log.w,Log.e)

在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一睹为快,希望对大家入门Androi...

36410
来自专栏Java呓语

View·dispatchTouchEvent 源码分析(四)

从上节View·dispatchTouchEvent 源码分析(三)中,我们分析了 ACTION_DOWN 事件的派发和拦截过程。

682
来自专栏何俊林

Android View框架总结(七)View事件分发机制

View布局告一段落,从本篇开始View事件相关分析,今天分析的是View的事件分发机制 View 事件的分发机制 dispatchTouchEvent onI...

2069
来自专栏封碎

让自己的Android应用支持appwidget 博客分类: Android AndroidOSAccessUP

经常看到一些教程教你如何写appwidget,但是,你知道你的appwidget是如何被添加到桌面上的吗? 一般的,如果是做桌面的童鞋,基本上都会让自己的...

1283
来自专栏林冠宏的技术文章

android 布局 使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题

使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题。 我的问题原型:      这个问题,我相信遇到的人会比较少,我是在 一个 viewPa...

21110
来自专栏everhad

[虾扯蛋] android界面框架-Window

从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等。下面就以这几个类为出发点来概览...

2218
来自专栏汪毅雄的专栏

Android View和 Window 的关系

本文主要介绍了Android中Window和View的关系,并在用户进程中说明了View的加载过程,最后再简单认识了一下WMS控制、显示Window的主要步骤。

1.9K4
来自专栏程序员叨叨叨

Android 5.0以上系统Toast不显示的解决方案

开发中我们经常会在适配5.0以后的机型遇到各种各样的问题,其中有一个不大不小的问题就是:Toast不显示问题

2603
来自专栏小鄧子的技术博客专栏

【译】Activity分割动画如何使用我的动画##

在切换不同Activity时,系统级过渡动画是作用于整个Activity的,而我想要实现的动画效果是将Activity A分割成两部分,然后将他们向外推开,最后...

1142
来自专栏Android先生

Android仿微信文章悬浮窗效果

前些日子跟朋友聊天,朋友Z果粉,前些天更新了微信,说微信出了个好方便的功能啊,我问是啥功能啊,看看我大Android有没有,他说现在阅读公众号文章如果有人给你发...

2583

扫码关注云+社区

领取腾讯云代金券