Android面试题(27)-android的事件分发机制

今天开始写一点关于view的知识,先从最基本的讲吧,android的事件分发机制,其实在我看来,android的事件分发机制在现实生活中经常能看到,所以我觉得还是很好理解的;

先看看生活中常见的一种情形吧;

比如说,现在你所在的公司中有一项任务被派发下来了,项目经理把项目交给你的老大,你的老大老大手下有很多人,看了看觉得你做很合适,把这个任务交给你了;你一看觉得还行,你就接下来了;

这么一个小小场景大概就说明了android的事件分发;简而言之,就是大的传小的,小的能处理就处理,处理不了再返回给大的;

好,现在具体看看事件分发;

首先我们先看看为什么会有事件分发机制:

我们知道,android上的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件应该给谁呢?事件分发机制就是为了处理这个问题的;

接下来看看关于事件分发的三个主要对象:

Android面试题(27)-android的事件分发机制_第1张图片

一个事件产生之后,都是先传给Activity,在传给ViewGroup,最后传给View,对比上面的例子,Activity对应的就是项目经理,viewGroup就是你的老大,而你就相当于view了;

三个重要方法:

Android面试题(27)-android的事件分发机制_第2张图片

这里要注意一点,Activity和View是没有onInterceptTouchEvent()也就是事件拦截这个方法的,仔细想想就可以想明白,Activity是处于分发机制的最顶端,如果一开始就吧事件拦截了,那么会导致整个屏幕都无法响应用户的操作,这就相当于一个项目里所有的事情都由你的项目经理一个人干了,这显然是不理智的;而view处于事件分发的最末端,它不需要拦截,事件分发到View的时候,view能处理就处理,不处理就返回给他的父控件;

事件分发流程:

Android面试题(27)-android的事件分发机制_第3张图片

在讲上面这个图之前呢,我先解释一下这个phonewindow和decorview

手机屏幕我们可以称为一个窗口,也就是一个window,在android中这个window类是一个抽象类,它规定了一些管理窗口的方法,但是具体实现是由它的唯一实现类phonewindow去实现的,这样phonewindow就是整个屏幕的实际“掌控者”,而phonewindow又是通过它的内部类decorview去对view进行管理;

接下来进行流程分析,我们就以点击事件为例:

当用户点击了屏幕,首先Activity先监测到,事件先传递到Activity中,Activity通过它的dispatchTouchEvent将事件分发到phoneWindow,phonewindow则会调用superdispatchTouchEvent方法的内部是调用了其内部类DecorView的superdispatchTouchEvent,而DecorView又会调用dispatchTouchEvent去进行事件分发,如果不拦截事件,那么就会继续下传到rootview,rootview中的操作是一样的,同样在dispatchTouchEvent内部调用onInterceptTouchEvent去判断是否拦截,不拦截就会把事件分发给下一个viewgroupA,拦截就直接在onTouchEvent返回true,viewgroupA中做的判断也是一样,最后事件传递到view1,view1是最底层控件,不会有onInterceptTouchEvent,它的选择就只有处理后不处理,处理就在onTouchEvent进行处理并返回true,不处理的话事件也不会被销毁,view1这时会把事件回传,经过上述流程后回传给activity,如果Activity还不处理,那么这个事件才会被销毁;

读懂上面的叙述,相信对android的事件分发有很清晰的认识了;

你可能感兴趣的:(android,android面试题)