什么是事件分发?
简单来说,就是我们通过屏幕与手机进行交互的时候,每次的点击,移动,长按等会产生一个个的事件。每一个事件又是通过屏幕传递给每一个View
,View
接收到这些事件的时候可以对该事件的行进过程进行控制,也就是自己消费掉或者忽略掉。
事件的常见类型
- ACTION_DOWN
手指按下的动作 - ACTION_MOVE
手指按下之后,不包含按下的动作 - ACTION_UP
手指抬起的动作 - ACTION_CANCEL
事件取消
也就是说当手指按下屏幕开始,事件会按照一定的顺序进行产生,知道手指离开屏幕,这样的产生的一系列事件,我们会称之为事件序列
。
当然不是每一种事件都会被执行,这个我们在之后做讲解。
事件的传递的层级关系
在上面我们都在说当手指按下屏幕,这里对于我们Android app开发者来说就对应了我们每一个Activity
,但是Activity
只负责声明周期的变化,真正控制视图的是每一个Activity
包含的window
,window
中又包含了一个DecorView
,这里的DecorView
是一个顶级的view
,所以view
中的所有事件都是要经过DecorView
才能传递到每一个view
当中。
最终事件传递的层级关系如下图所示:
由上可知事件传递的主要对象为
Activity
,ViewGroup
,View
这三个。所以我们只需要研究事件在这三个对象间是怎么进行传递的。
Activity的事件分发流程
在Activity中,系统主要通过下面两个方法进行事件传递:
- dispatchTouchEvent(android.view.MotionEvent ev)
- onTouchEvent(android.view.MotionEvent event)
下面看一下Activity的事件分发流程图:
ViewGroup的事件分发流程
在ViewGroup中,系统主要通过下面三个方法进行事件传递
- dispatchTouchEvent(android.view.MotionEvent ev)
- onInterTouchevent(android.view.MotionEvent ev)
- onTouchEvent(android.view.MotionEvent event)
下面看一下ViewGroup的事件分发流程图:
View的事件分发流程
在Activity中,系统主要通过下面两个方法进行事件传递:
- dispatchTouchEvent(android.view.MotionEvent ev)
- onTouchEvent(android.view.MotionEvent event)
在面试中尽可能的把这三个流程图了解消化,可以简要的画U型图去介绍三者的关系,在说的过程中尽量把每个对象的分发流程说清楚会有很好的加分。