美文网首页Android进阶
一张图搞定安卓事件传递机制

一张图搞定安卓事件传递机制

作者: Tony简 | 来源:发表于2017-08-16 12:11 被阅读85次

先来看一个例子

在一个界面上有一个按钮1,现在在按钮1上覆盖一个按钮2,然后点击按钮2,请问底下的按钮1能拿到点击事件吗?

要搞懂这个问题,首先我们必须对安卓的事件分发机制有一个基本的了解,接下来我用3W1H的方式说明:

事件传递机制
  • 分发:表示事件未找到消费地点,将交给自身的下一函数处理;拦截:表示事件不再传递给子类;消费:表示事件找到消费地点,事件传递完结
  • 从图上我们可以知道,安卓的事件分发机制其实就容器和控件通过分发和拦截,沿着视图树向下传递触摸事件,当到达底层控件或者被拦截时,表示事件不在线下分发,继而沿着视图树向上寻找真正消费的地方的过程。

在回来看看之前的例子,它的视图树应该是这样的:


视图树

分析

  • 从图中我们可以看到Button2和Button1是并列关系,而且Button2优先于Button1
  • 问题问的是button1是否会拿到触摸事件,Button本身已经是最小的单位了,这里分析就是View中事件传递的问题
  • 事件传递中View拥有dispatchTouchEvent和onTouchEvent两个方法,即分发和消费。
  • 这里的Button是原生的控件并未人为干扰,View控件的事件触发顺序是先执行onTouch方法,在最后执行onClick方法,如果onTouch返回true,则不会调用onClick方法。 onTouch和onTouchEvent以及onClick的顺序,有什么区别,又该如何使用?

当用户点击Button2时候,事件会这么传递:

Button2事件传递

因此我们可以知道,如果点击了Buttn2,点击事件会在Button2的onClick事件中消费掉,Button1是拿不到点击事件的,也拿不到任何触摸事件,除非在Button2中重写了分发方法,不走super方法,直接返回true,那么Button1中将拿到触摸事件。

Button1拿到事件

-END-

相关文章

  • 一张图搞定安卓事件传递机制

    先来看一个例子 在一个界面上有一个按钮1,现在在按钮1上覆盖一个按钮2,然后点击按钮2,请问底下的按钮1能拿到点击...

  • 安卓事件传递机制

    事件传递机制 View dispatchTouchEvent():分发事件 onTouchEvent():处理事件...

  • 一张图看清Android事件传递机制

    一、引言 总觉得知识必须要总结,不然就算再熟悉的东西,一段时间不接触就容易遗忘;上次给一个朋友解释回调的时候就有深...

  • Android触摸事件分发机制

    一 概述 触摸事件的分发机制是安卓开发中的基础知识,但这块知识又有点绕,总是让人觉得似懂非懂。其实安卓事件传递就是...

  • Android事件传递机制

    touch事件传递机制流程图 示例: 一:什么也不做处理的事件传递过程 一个Activity中放两个ViewGro...

  • 深入浅出iOS事件机制

    深入浅出iOS事件机制事件传递:响应链事件传递响应链

  • 安卓触控事件传递机制

    参考链接:http://www.cnblogs.com/superlcr/p/3946034.html viewG...

  • 12.2019安卓事件传递机制探索

    现在布局中有这样一层结构,当我触摸屏幕的时候,我要看事件传递的顺序,分别重写了Activity的dispatchT...

  • 01进阶之路-UI视图

    1. 事件传递机制和响应者链条 学习链接 事件传递机制iOS中的事件可以分为3大类型 1 触摸事件 2 加速计...

  • 事件传递机制

    主要内容 理论部分 常见应用 理论部分 iOS中事件(UIEvent)主要是以下几种,本文主要是分析触控事件(UI...

网友评论

    本文标题:一张图搞定安卓事件传递机制

    本文链接:https://www.haomeiwen.com/subject/lnobrxtx.html