前言
很高兴遇见你~
事件分发系列文章已经到最后一篇了,先来回顾一下前面四篇,也当个目录:
- Android事件分发机制一:事件是如何到达activity的? : 从window机制出发分析了事件分发的整体流程,以及事件分发的真正起点
- Android事件分发机制二:viewGroup与view对事件的处理 : 源码分析了viewGroup和view是如何分发事件的
- Android事件分发机制三:事件分发工作流程 : 分析了触摸事件在控件树中的分发流程模型
- Android事件分发机制四:学了事件分发有什么用? : 从实战的角度剖析事件分发的运用
本文是最后一篇,主要是模拟面试情况提出一些问题以及解答,也当是整个事件分发知识的回顾。读者也可以尝试一下看看这些问题是否都能解答出来。
面试开始
-
学过事件分发吗,聊聊什么是事件分发
事件分发是将屏幕触控信息分发给控件树的一个套机制。
当我们触摸屏幕时,会产生一些列的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的。只有自己界面的事件才会经Activi