前言

1. 探究的内容
  • 在上一篇文章《一步步探索学习Android Touch事件分发传递机制(一)》中,已经以ACTION_DOWN事件为例,对Android系统的Touch事件分发传递机制做了探究,并得出了形象好记忆的结论。

  • 这篇文章所探究的问题是与上一篇文章紧密相关的,如果对Android Touch事件分发传递机制还不太了解的同学,建议先去看看上一篇文章《一步步探索学习Android Touch事件分发传递机制(一)》。

  • 我们知道,一个操作,比如一个点击事件,是由多个不同TYPE的MOTION_EVENT组成的。for example,点击事件是由一个ACTION_DOWN事件和一个ACTION_UP事件组成的。那么诸如ACTION_UP和ACTION_MOVE事件是不是跟ACTION_DOWN事件一样遵循相同的分发规律呢?

  • 事实上,答案是否定的。 ACTION_UP和ACTION_MOVE事件的分发传递流程与这之前的ACTION_DOWN事件如何传递以及在哪里被消费有密不可分的联系。具体我们下面一步步探索了解。

2. 探究的方法
  • 我们还是继续以上一篇文章《一步步探索学习Android Touch事件分发传递机制(一)》中所写的Demo为例子,一步步打Log,去探究整个事件的传递流程,再用绘图描述他的机制。

  • 当然知其然须知其所以然,对于Android源码的分析,将会在下一篇文章《一步步探索学习Android Touch事件分发传递机制(三)》中分析。


Demo中见分晓

1.Demo代码
  • Demo的代码,不管是界面还是java代码,都保持与上一次的一致。

  • 链接:《一步步探索学习Android Touch事件分发传递机制(一)》

2.打Log,找规律,识机制

1. )所有方法(dispatchTouchEvent(); onInterceptTouchEvent(); onTouchEvent() )都return super的情况:

  • 首先,我们保持所有方法都return super,当然这个我上一篇文章探究过,ACTION_DOWN事件会以类U型的传递路线在View树中分发传递。

  • 那么ACTION_UP和ACTION_MOVE事件呢?这里以ACTION_UP事件为例做探究。(事实上,Action_move事件与Action_up事件是遵循类似规律的。)我对着Demo屏幕中的View做一个点击操作(前面交代过,点击事件是由一个ACTION_DOWN事件和一个ACTION_UP事件组成的)。

  • 打log:

    注:上图中,紫色框内的是点击事件的ACTION_DOWN的分发流程;绿色框中的是点击事件的ACTION_UP事件的分发流程。后面的图同理。

  • 规律:可以看到,ACTION_UP事件并没有按照类U型的结构去在View树传递,而是直接在Activity的onTouchEvent方法中消费掉了。

  • 绘图如下:

2. )ViewGroup2的dispatchTouchEvent() return true的情况:

  • 然后我们来探究ACTION_DOWN事件在dispatchTouchEvent()中被消费掉的情况下,ACTION_UP事件是怎么传递分发的。

  • 令ViewGroup2的dispatchTouchEvent() return true,打log:

  • 规律:当ACTION_DOWN事件在某一个View或者ViewGroup的dispatchTouchEvent()方法中被消费掉的情况下,对应的ACTION_UP事件也会在此被消费掉,终止传递。

  • 绘制成图:

3. )ViewGroup2的onInterceptTouchEvent()和onTouchEvent() 都 return true的情况:

  • 也就是让ViewGroup2拦截掉事件,并且由它自己来消费事件。

  • 打log:

  • 规律:可以看到,当ACTION_DOWN事件在某一个View或者ViewGroup的onTouchEvent()方法中被消费掉的情况下,对应的ACTION_UP事件也会在此被消费掉,终止传递。

    但是值得注意的是,这种情况下,ACTION_UP事件是不会再经过拦截器onInterceptTouchEvent()方法了的。

  • 绘图如下:

  • 4.) ViewGroup2的onTouchEvent() return true的情况:

  • 就是让VIewGroup2的onTouchEvent()方法在接收到View的onTouchEvent()方法传递过来的ACTION_DOWN事件时将其消费掉。看这种情况下,ACTION_UP事件是怎么传递的。

  • 打Log:

  • 规律:可以从Log看出来,当ACTION_DOWN事件被某控件的onToucEvent()方法消费掉,则其对应的ACTION_UP事件只传递到该控件。也就是不会传递到比此控件更深层的控件中去。

  • 绘制图:


总结归纳

  • ACTION_MOVE事件与ACTION_UP事件遵循类似的规律,上面只以ACTION_UP为例子分析探究。

  • ACTION_MOVE事件与ACTION_UP事件的传递分发与其对应之前的ACTION_DOWN事件有紧密联系。

  • 具体的,当ACTION_DOWN事件在dispatchTouchEvent()方法中被消费,则对应的ACTION_MOVE事件与ACTION_UP事件也会从上而下传递到该控件的该方法处被消费掉。

  • 当ACTION_DOWN事件在onTouchEvent()方法中被消费,则对应的ACTION_MOVE事件与ACTION_UP事件只传递到该控件处的onTouchEvent()方法中然后被消费而终止传递。不会经历该控件之下的控件的传递过程。

  • 当所有方法都默认return super,则ACTION_MOVE事件与ACTION_UP事件会在Activity的onTouchEvent()中被消费掉。

更多相关文章

  1. Android如何监听蓝牙耳机的按键事件
  2. Android压力测试利器---Monkey
  3. 图解 Android(安卓)事件分发机制 和 handler 机制
  4. Android(安卓)RxJava:过滤操作符 全面讲解
  5. Android-Lifecycle超能解析-生命周期的那些事儿
  6. Android——RIL 机制源码分析
  7. Java内部类精炼详解—由Android点击事件开局讲解
  8. Android(安卓)RxJava:详解 条件 / 布尔操作符
  9. Intent加强

随机推荐

  1. n种方式教你用python读写excel等数据文件
  2. AKS网络模型介绍及创建技巧
  3. Python地信专题 | 基于geopandas的空间数
  4. 好看不火 | 怎么才有数据分析思路?
  5. 案例 | 用pdpipe搭建pandas数据分析流水
  6. centos7 安装python3.8
  7. Python地信专题 | 基于geopandas的空间数
  8. 利用python回顾统计学中的基础概念(全)
  9. python自动化办公太难?学这些就够用了
  10. Python地信专题 | 基于geopandas的空间数