本文主要是模拟面试情况提出一些问题以及解答,也当是整个事件分发知识的回顾。读者也可以尝试一下看看这些问题是否都能解答出来,好了废话不多说看正文。
面试开始
面试官:学过事件分发吗,聊聊什么是事件分发
事件分发是将屏幕触控信息分发给控件树的一个套机制。
当我们触摸屏幕时,会产生一些列的MotionEvent事件对象,经过控件树的管理者ViewRootImpl,调用view的dispatchPointerEvnet方法进行分发。
面试官:那主要的分发流程是什么:
在程序的主界面情况下,布局的顶层view是DecorView,他会先把事件交给Activity,Activity调用PhoneWindow的方法进行分发,PhoneWindow会调用DecorView的父类ViewGroup的
dispatchTouchEvent方法进行分发。
也就是Activity->Window->ViewGroup的流程。 ViewGroup则会向下去寻找合适的控件并把事件分发给他。
面试官:事件一定会经过Activity吗?
不是的。我们的程序界面的顶层viewGroup,也就是decorView中注册了Activity这个callBack,所以当程序的主界面接收到事件之后会先交给Activity。
但是,如果是另外的控件树,如dialog、popupWindow等事件流是不会经过Activity的。只有自己界面的事件才会经Activity。
Activity的分发方法中调用了onUserInteraction()方法,你能说说这个方法有什么作用吗?
好的。这个方法在Activity接收到down的时候会被调用,本身是个空方法,需要开发者自己去重写。
通过官方的注释可以知道,这个方法会在我们以任意的方式开始与Activity进行交互的时候被调用。
比较常见的场景就是屏保:当我们一段时间没有操作会显示一张图片,当我们开始与Activity交互的时候可在这个方法中取消屏保;另外还有没有操作自动隐藏工具栏,可以在这个方法中让工具栏重新显示。
面试官:前面你讲到最后会分发到viewGroup,那么viewGroup是如何分发事件的?
viewGroup处理事件信息分为三个步骤:拦截、寻找子控件、派发事件。
事件分发中有一个