Android Touch事件分发传递

touch事件一直是Android学习者一个头疼的问题,为了更好的学习事件的传递,咱们来探索一下bash

touch事件有以下几种:源码分析

Activity中包括:布局

dispatchTouchEvent
onTouchEvent学习

ViewGroup有:测试

dispatchTouchEvent
onTouchEvent
onInterceptTouchEventspa

View有:3d

dispatchTouchEvent
onTouchEvent日志

写一个demo,经过实践来总结事件传递的方式,页面布局以下,咱们经过点击view来测试touch的传递过程code

页面布局

首先,咱们自定义三个view,Group1,Group2和view,分别重写Activity和他们的touch事件,经过点击View打印的日志来看view的传递cdn

activity代码

activity Log截图

viewGroup1 代码

viewGroup1 log截图

viewGroup2 代码

viewGroup2 log截图

view 代码

view log截图

打log,看日志,总结规律

  • 默认状况下,这些方法都是super(即父类的默认实现的)。因此先看一下默认状况下,一个ACTION_DOWN和ACTION_UP事件是怎么传递的。给最里面的View一个触摸,产生touch事件。

log

默认状况下日志
事件传递过程,能够用以下图来展现
红色:ACTION_DOWN,紫色:ACTION_UP

  • 而后咱们让dispatchTouchEvent()方法返回false(这里在viewGroup2里返回),log以下:
    事件传递过程,能够用以下图来展现
    红色:ACTION_DOWN,紫色:ACTION_UP

规律:

ACTION_DOWN事件会传递到上一级view的onTouch()事件里面处理。若是是在activity里的dispatchTouch()事件返回false, 由于activity已经没有上一级view了,因此事件会被直接消费掉(不会继续传递)。
ACTION_UP事件并无按照类U型的结构去在View树传递,而是直接在Activity的onTouchEvent方法中消费掉了。

  • 而后咱们让dispatchTouchEvent()方法返回true(这里在viewGroup2里返回),log以下:

事件传递过程,能够用以下图来展现

红色:ACTION_DOWN,紫色:ACTION_UP

规律:

ACTION_DOWN事件会在返回true的事件中直接消费掉,不会在继续传递。
ACTION_UP事件和down事件同样在返回true的事件中直接消费掉,不会传递。

  • 咱们让onInterceptTouchEvent()方法返回false(这里在viewGroup2里返回),log以下

事件传递过程,能够用以下图来展现

红色:ACTION_DOWN,紫色:ACTION_UP
规律:

ACTION_DOWN事件传递和返回super传递同样,因此返回false和默认事件传递同样。
ACTION_UP事件和默认的传递同样。

  • 咱们让onInterceptTouchEvent()方法返回true(这里在viewGroup2里返回),log以下

事件传递过程,能够用以下图来展现

红色:ACTION_DOWN,紫色:ACTION_UP
规律:

ACTION_DOWN:当在onInterceptTouchEvent()返回true时,事件会传递到本身的onTouchEvent()中处理
ACTION_UP:事件和默认的传递同样。

  • 咱们让onTouchEvent()方法返回false(这里在view里返回),log以下

事件传递过程,能够用以下图来展现

红色:ACTION_DOWN,紫色:ACTION_UP
规律:

ACTION_DOWN事件传递和返回super传递同样,因此返回false和默认事件传递同样。
ACTION_UP事件和默认的传递同样。

  • 咱们让onTouchEvent()方法返回true(这里在view里返回),log以下

事件传递过程,能够用以下图来展现
红色:ACTION_DOWN,紫色:ACTION_UP
规律:

ACTION_DOWN:事件在onTouch()被消费掉,不会在继续传递 ACTION_UP事件传递路径和ACTION_DOWN同样,在事件被消费掉以后不会继续传递

思考总结

ACTION_DOWN:
1.返回false和默认的传递路基同样。  
2.在dispatchTouchEvent()和onTouchEvent()中返回true会消费掉当前事件,不会在继续传递。  
3.在onInterceptTouchEvent()中返回true,事件会直接传递到本身的onTouchEvent()事件中,而不会向子view传递。  
ACTION_UP:
1.事件返回false是传递路径从当前activity的diapatchTouchEvent传递到本身的onTouchEvent()中。  
2.在dispatchTouchEvent()和onTouchEvent()中返回true会消费掉当前事件,不会在继续传递。传递路径和ACTION_DOWN路径同样。  
3.在onInterceptTouchEvent()中返回true,传递路径和1的路径同样。
复制代码

固然,总结的规律仍是要靠源码的逻辑支撑,下一期我会上源码分析,来支撑探究的规律

相关文章
相关标签/搜索