资讯专栏INFORMATION COLUMN

Android-View进阶-事件分发机制原理

venmos / 1723人阅读

摘要:事件被上层拦截时触发。事件返回时直接指向了父的这一部分是不合理的,实际上它仅仅是给了父的一个返回值,父根据返回值来调用自身的。是根据的返回值来确定是调用子的还是自身的,并没有将调用交给。

原文链接

简简单单讲清楚android事件分发。

什么叫事件分发机制 ?

事件分发是:当发生了一个事件时,在屏幕上找到一个合适的控件来处理这个事件的过程。

因为一个界面上控件如此之多,发生一个事件后总要寻找一个合适来处理事件吧。这个过程就叫做事件分发的机制。

常见事件

那么屏幕上都会发生什么事件呢?来看下经常要处理的4种事件(这些事件在android中会被封装成 MotionEvent 对象):

事件 简介
ACTION_DOWN 手指 初次接触到屏幕 时触发。
ACTION_MOVE 手指 在屏幕上滑动 时触发,会会多次触发。
ACTION_UP 手指 离开屏幕 时触发。
ACTION_CANCEL 事件 被上层拦截 时触发。
屏幕中的控件 原文链接

为了在屏幕中如何寻找合适的处理事件的控件,我们先来看下屏幕中都有什么控件。

假设我们写了如下的一个布局:



    

        

    

    

View结构:

原文链接

上面的代码运行到界面上由图中这几部分组成:

可以看到在上面的View结构中莫名多出来的两个东西,PhoneWindow 和 DecorView ,这两个我们并没有在Layout文件中定义过,但是为什么会存在呢?

1. PhoneWindow
PhoneWindow是 Window 的唯一实现类,是所有视图的最顶层容器,视图的外观和行为都归他管,不论是背景显示,标题栏还是事件处理都是他管理的范畴。
2. DecorView
DecorView是 PhoneWindow 的一个内部类,就是跟在 PhoneWindow 身边专业为 PhoneWindow 服务的,除了自己要干活之外,也负责消息的传递,PhoneWindow 的指示通过 DecorView 传递给下面的 View,而下面 View 的信息也通过 DecorView 回传给 PhoneWindow。
事件分发流程

在如上图View的树形结构中,事件发生时,最先由Activity接收,然后再一层层的向下层传递,直到找到合适的处理控件。大致如下:

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

但是如果事件传递到最后的View还是没有找到合适的View消费事件,那么事件就会向相反的方向传递,最终传递给Activity,如果最后 Activity 也没有处理,本次事件才会被抛弃:

Activity <- PhoneWindow <- DecorView <- ViewGroup <- ... <- View
Android中事件具体是怎样进行分发的 原文链接

当事件发生时,ViewGroup会在dispatchTouchEvent方法中先看自己能否处理事件,如果不能再去遍历子View查找合适的处理控件。如果到最后result还是false,表示所有的子View都不能处理,才会调用自身的onTouchEvent来处理。

根据上面提到的原理,ViewGroup事件传递的伪代码如下:

public boolean dispatchTouchEvent(MotionEvent ev) {
    boolean result = false;             // 默认状态为没有消费过

    if (!onInterceptTouchEvent(ev)) {   // 如果没有拦截交给子View
        result = child.dispatchTouchEvent(ev);
    }

    if (!result) {                      // 如果事件没有被消费,询问自身onTouchEvent
        result = onTouchEvent(ev);
    }

    return result;
}

为了方便理解,这里贴出一张网上的别人的一张图:

红色箭头方向表示事件分发方向。

绿色箭头方向表示事件回传方向。

上面的流程中存在部分不合理内容,请大家选择性接受。
事件返回时 dispatchTouchEvent 直接指向了父View的 onTouchEvent 这一部分是不合理的,实际上它仅仅是给了父View的 dispatchTouchEvent 一个 false 返回值,父View根据返回值来调用自身的 onTouchEvent。
ViewGroup 是根据 onInterceptTouchEvent 的返回值来确定是调用子View的 dispatchTouchEvent 还是自身的 onTouchEvent, 并没有将调用交给 onInterceptTouchEvent。

如果在遍历过程中,发现了有可以处理事件的控件,就停止事件的传递,事件被消耗。

本文参考资料:
http://www.gcssloop.com/customview/dispatch-touchevent-theory
https://juejin.im/entry/58df5b33570c35005798493c
https://juejin.im/entry/580042082e958a0055b6cbbc
https://blog.csdn.net/carson_ho/article/details/54136311
https://www.jianshu.com/p/31e20def82c2
https://segmentfault.com/a/1190000004981942
https://zhuanlan.zhihu.com/p/27608989
http://gityuan.com/2015/09/19/android-touch/
http://wuxiaolong.me/2015/12/19/MotionEvent/

推荐阅读:
推荐阅读:

Android开发艺术探索

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14754.html

相关文章

  • Android-View进阶-事件分发机制原理

    摘要:事件被上层拦截时触发。事件返回时直接指向了父的这一部分是不合理的,实际上它仅仅是给了父的一个返回值,父根据返回值来调用自身的。是根据的返回值来确定是调用子的还是自身的,并没有将调用交给。 原文链接 简简单单讲清楚android事件分发。 什么叫事件分发机制 ? 事件分发是:当发生了一个事件时,在屏幕上找到一个合适的控件来处理这个事件的过程。 因为一个界面上控件如此之多,发生一个事件后总...

    pkwenda 评论0 收藏0
  • Android 自定义View - 收藏集 - 掘金

    摘要:在本篇文安卓自定义进阶分类和流程掘金自定义分类与流程经历过前面三篇啰啰嗦嗦的基础篇之后,终于到了进阶篇,正式进入解析自定义的阶段。 这交互炸了(二):爱范儿是如何让详情页缩小为横向列表的 - 掘金本文同步自wing的地方酒馆 写在前面:写这段话的时候,已经是夜里3点了。别问我为什么这么拼,一切为了与你分享干货!!!! 不要太感动,擦擦眼泪继续往下看。 本开源库链接 Expandable...

    yanbingyun1990 评论0 收藏0
  • Android 自定义 View - 收藏集 - 掘金

    摘要:在本篇文安卓自定义进阶分类和流程掘金自定义分类与流程经历过前面三篇啰啰嗦嗦的基础篇之后,终于到了进阶篇,正式进入解析自定义的阶段。 Android 从 0 开始自定义控件之 View 的 draw 过程 (九) - Android - 掘金转载请标明出处: http://blog.csdn.net/airsaid/... 本文出自:周游的博客 ... Andriod 从 0 开始自定义...

    AndroidTraveler 评论0 收藏0
  • Android研发进阶之路

    摘要:市面上也多是谈论知识图谱,缺少体系和成长节奏感,特此编写一份研发进阶之路,希望能对大家有所帮助。中级而到达中级就需要付出一些努力了,需要了解更多知识,可以仿照开源库去造轮子练习。能够熟练掌握开源库的使用,如图片库网络库工具等。前言 移动研发火热不停,越来越多人开始学习android开发。但很多人感觉入门容易成长很难,对未来比较迷茫,不知道自己技能该怎么提升,到达下一阶段需要补充哪些内容。市...

    idisfkj 评论0 收藏0
  • 前端基础进阶(十二):深入核心,详解事件循环机制

    摘要:前端基础进阶正是围绕这条线索慢慢展开,而事件循环机制,则是这条线索的最关键的知识点。特别是中正式加入了对象之后,对于新标准中事件循环机制的理解就变得更加重要。之后全局上下文进入函数调用栈。 showImg(https://segmentfault.com/img/remote/1460000008811705); JavaScript的学习零散而庞杂,因此很多时候我们学到了一些东西,但...

    whjin 评论0 收藏0

发表评论

0条评论

venmos

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<