今天开始写一点关于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的事件分发有很清晰的认识了;

更多相关文章

  1. android 设置EditText不可编辑内容,响应点击事件
  2. 利用Android多进程机制来分割组件
  3. 【android】手写一套Java的Handler程序,深入理解Android消息机制
  4. android之自定义控件一控件的呈现机制
  5. Android的IPC机制(七)—— Socket的原理简析与使用
  6. android的两种异步机制

随机推荐

  1. 对Android(安卓)Studio 中Android(安卓)
  2. android实现拍照功能
  3. Android——程序移植 相关知识总结贴
  4. Delphi XE5 for android 图片缩放和拖动
  5. Android常用开源库(UI部分)
  6. Android研究-linux内核启动到android系统
  7. android studio开发Android项目嵌入cocos
  8. Android 备忘录
  9. Android简单登录界面
  10. [android]控件ProgressBar/ProgressDialo