事件分发机制的理解

原创 2018年04月17日 00:09:32



Android事件分发机制不仅是Android开发体系中的重点也是难点,掌握好了事件分发机制也是我们解决自定义控件、view的滑动冲突等问题的基础。


所谓事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一

个具体的View,而这个传递过程就是分发过程。点击事件的分发过程由下面三个很重要的方法来共同完成。


1public boolean dispatchTouchEvent(MotionEvent ev)

用来进行事件的分发。如果事件能够传递给当前的View,那么此事件一定会被调用,返回结果受当前View的onTouchEvent

和下级view的dispatchTouchEvent影响,表示是否消耗当前事件。

2public boolean onInterceptTouchEvent(MotionEvent ev)

在方法1内部调用,用来判断是否拦截某个事件,如果当前view拦截了某个事件,那么在同一个事件序列当中,此方法不会

被再次调用,返回结果表示是否拦截当前事件。

3public boolean onTouchEvent(MotionEvent ev)

在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一事件序列中,

当前view无法再次接收事件



记住下面的图片有助于你理解事件分发



事件从左上角那个白色箭头开始,由Activity的dispatchTouchEvent做分发
箭头的上面字代表方法返回值,(return true、return false、return super.xxxxx(),super 的意思是调用父类实现。

dispatchTouchEvent和 onTouchEvent的框里有个【true---->消费】的字,表示的意思是如果方法返回true,那么代表事件就此消费,不会继续往别的地方传了,事件终止。


1、如果事件不被中断,整个事件流向是一个类U型图,我们来看下这张图,可能更能理解U型图的意思。


2、dispatchTouchEvent 和 onTouchEvent 一旦return true,事件就停止传递了(到达终点)对于return true我们经常说事件被消费了,消费了的意思就是事件走到这里就是终点,不会往下传,没有谁能再收到这个事件了。



3、dispatchTouchEvent 和 onTouchEvent return false的时候事件都回传给父控件的onTouchEvent处理。

对于onTouchEvent return false 就比较简单了,它就是不消费事件,并让事件继续往父控件的方向从下往上流动。



4、dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent
ViewGroup 和View的这些方法的默认实现就是会让整个事件安装U型完整走完,所以 return super.xxxxxx() 就会让事件依照U型的方向的完整走完整个事件流动路径),中间不做任何改动,不回溯、不终止,每个环节都走到。


onInterceptTouchEvent()

Intercept 的意思就拦截,每个ViewGroup每次在做分发的时候,问一问拦截器要不要拦截(也就是问问自己这个事件要不要自己来处理)如果要自己处理那就在onInterceptTouchEvent方法中 return true就会交给自己的onTouchEvent的处理,如果不拦截就是继续往子控件往下传。默认是不会去拦截的,因为子View也需要这个事件,所以onInterceptTouchEvent拦截器return super.onInterceptTouchEvent()和return false是一样的,是不会拦截的,事件会继续往子View的dispatchTouchEvent传递


首先看下ViewGroup 的dispatchTouchEvent,之前说的return true是终结传递。return false 是回溯到父View的onTouchEvent,然后ViewGroup怎样通过dispatchTouchEvent方法能把事件分发到自己的onTouchEvent处理呢,return true和false 都不行,那么只能通过Interceptor把事件拦截下来给自己的onTouchEvent,所以ViewGroup dispatchTouchEvent方法的super默认实现就是去调用onInterceptTouchEvent,记住这一点



总结:
对于 dispatchTouchEvent,onTouchEvent,return true是终结事件传递。return false 是回溯到父View的onTouchEvent方法。ViewGroup 想把自己分发给自己的onTouchEvent,需要拦截器onInterceptTouchEvent方法return true 把事件拦截下来。ViewGroup 的拦截器onInterceptTouchEvent 默认是不拦截的,所以return super.onInterceptTouchEvent()=return false;View 没有拦截器,为了让View可以把事件分发给自己的onTouchEvent,View的dispatchTouchEvent默认实现(super)就是把事件分发给自己的onTouchEvent

源码分析:

http://blog.csdn.net/u013277209/article/details/71600419





Android之ViewPager,Fragment知识全讲

本课程讲解Android中的ViewPager,Fragment及Android触摸事件的处理,ViewPager和Fragment相互嵌套冲突处理
  • 2016年09月14日 08:23

事件分发总结和验证

一、分发机制总结 1、传递顺序:Activity->PhoneWindow->DecorView->ViewGroup->View 2、三个...
  • www851903307
  • www851903307
  • 2018-04-21 19:03:56
  • 21

View事件分发机制

1、dispatchTouchEvent: public boolean dispatchTouchEvent(MotionEvent event) { ...... ...
  • www851903307
  • www851903307
  • 2018-04-21 13:55:46
  • 56

Android分发机制

一、      Android分发机制概述:      Android如此受欢迎,就在于其优秀的交互性,这其中,Android优秀的事件分发机制功不可没。那么,作为一个优秀的程序员,要想做一个具有良好...
  • heqinglin8
  • heqinglin8
  • 2018-04-21 14:52:59
  • 21

《Android深入透析》之Android事件分发机制

一、      Android分发机制概述:      Android如此受欢迎,就在于其优秀的交互性,这其中,Android优秀的事件分发机制功不可没。那么,作为一个优秀的程序员,要想做一个具有良好...
  • heqinglin8
  • heqinglin8
  • 2018-04-21 14:38:42
  • 36

Android View事件分发机制理解

android事件分发,事件传递
  • wjinhhua
  • wjinhhua
  • 2016-10-06 16:08:47
  • 450

站在大神肩膀上,深入理解 Android事件分发机制

站在大神肩膀上,深入理解android事件分发机制
  • cjc_karen
  • cjc_karen
  • 2016-05-13 01:19:02
  • 5995

事件分发机制

  • 2018年03月23日 12:25
  • 307KB
  • 下载

一步步理解Android事件分发机制

回想一下,通常在Android开发中,我们最常接触到的是什么东西?显然除了Activity以外,就是各种形形色色的控件(即View)了。 与此同时,一个App诞生的起因,终究是根据不同需求完成与用户...
  • ghost_Programmer
  • ghost_Programmer
  • 2016-07-21 18:57:36
  • 3294

完全理解android事件分发机制

前言之前笔者其实已经写过事件分发机制的文章:快速理解android事件传递拦截机制概念 但是,现在看来其实更像是一篇知识概括,多处可能未讲清楚,于是打算重写事件分发,用一篇文章大致讲清楚。 首先,...
  • Double2hao
  • Double2hao
  • 2017-01-12 10:04:06
  • 900
收藏助手
不良信息举报
您举报文章:事件分发机制的理解
举报原因:
原因补充:

(最多只允许输入30个字)