【Android必问面试题】Android事件分发机制

什么是事件分发?

简单来说,就是我们通过屏幕与手机进行交互的时候,每次的点击,移动,长按等会产生一个个的事件。每一个事件又是通过屏幕传递给每一个ViewView接收到这些事件的时候可以对该事件的行进过程进行控制,也就是自己消费掉或者忽略掉。

事件的常见类型

  • ACTION_DOWN
    手指按下的动作
  • ACTION_MOVE
    手指按下之后,不包含按下的动作
  • ACTION_UP
    手指抬起的动作
  • ACTION_CANCEL
    事件取消

也就是说当手指按下屏幕开始,事件会按照一定的顺序进行产生,知道手指离开屏幕,这样的产生的一系列事件,我们会称之为事件序列
当然不是每一种事件都会被执行,这个我们在之后做讲解。

事件的传递的层级关系

在上面我们都在说当手指按下屏幕,这里对于我们Android app开发者来说就对应了我们每一个Activity,但是Activity只负责声明周期的变化,真正控制视图的是每一个Activity包含的windowwindow中又包含了一个DecorView,这里的DecorView是一个顶级的view,所以view中的所有事件都是要经过DecorView才能传递到每一个view当中。
最终事件传递的层级关系如下图所示:

未命名文件.jpg

由上可知事件传递的主要对象为ActivityViewGroupView这三个。所以我们只需要研究事件在这三个对象间是怎么进行传递的。

Activity的事件分发流程

在Activity中,系统主要通过下面两个方法进行事件传递:

  • dispatchTouchEvent(android.view.MotionEvent ev)
  • onTouchEvent(android.view.MotionEvent event)

下面看一下Activity的事件分发流程图:


未命名文件 (1).jpg

ViewGroup的事件分发流程

在ViewGroup中,系统主要通过下面三个方法进行事件传递

  • dispatchTouchEvent(android.view.MotionEvent ev)
  • onInterTouchevent(android.view.MotionEvent ev)
  • onTouchEvent(android.view.MotionEvent event)

下面看一下ViewGroup的事件分发流程图:


ViewGroup事件分发流程.jpg

View的事件分发流程

在Activity中,系统主要通过下面两个方法进行事件传递:

  • dispatchTouchEvent(android.view.MotionEvent ev)
  • onTouchEvent(android.view.MotionEvent event)
View的事件分发流程.jpg

在面试中尽可能的把这三个流程图了解消化,可以简要的画U型图去介绍三者的关系,在说的过程中尽量把每个对象的分发流程说清楚会有很好的加分。

推荐阅读更多精彩内容