View的事件分发机制

分发过程

事件分发过程由三个方法共同完成:

dispatchTouchEvent

方法返回值为true表示事件被当前视图消费掉;返回为super.dispatchTouchEvent表示继续分发该事件,返回为false表示交给父类的onTouchEvent处理。

onInterceptTouchEvent

方法返回值为true表示拦截这个事件并交由自身的onTouchEvent方法进行消费;返回false表示不拦截,需要继续传递给子视图。如果return super.onInterceptTouchEvent(ev), 事件拦截分两种情况:  

  1. 如果该View存在子View且点击到了该子View, 则不拦截, 继续分发给子View处理, 此时相当于return false。
Read More

WindowManager

概述

Window是一个抽象的概念,每一个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl来建立联系,因此Window并不是实际存在的,
它是以View的形式存在。

Android系统中Window有三种类型,分别是应用Window、子Window和系统Window。应用类Window对应着一个Activity。子Window不能单独存在,它需要附属在特定的父Window之中,
比如常见的一些Dialog就是一个子Window。系统Window是需要声明权限在能创建的Window,比如Toast和系统状态栏这些都是系统Window。

Window是分层的,每个Window都有对应的z-ordered,层级大的会覆盖在层级小的Window的上面。在三类Window中,
应用Window的层级范围是199,子Window的层级范围是10001999,系统Window的层级范围是2000~2999,这些层级范围对应着WindowManager.LayoutParams的type参数。
如果想要Window位于所有Window的最顶层,那么采用较大的层级即可。很显然系统Window的层级是最大的,而且系统层级有很多值,一般我们可以选用TYPE_SYSTEM_OVERLAY
或者TYPE_SYSTEM_ERROR,如果采用TYPE_SYSTEM_ERROR,只需要为type参数指定这个层级即可:mLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;
同时声明权限:。因为系统类型的Window是需要检查权限的,
如果不在AndroidManifest中使用相应的权限,那么创建Window的时候就会报错,

流程分析

WindowManager实现了ViewManager接口,ViewManager接口提供以下三个方法:

Read More

View的工作流程

DecorView是视图的顶级View,我们添加的布局文件是它的一个子布局,而ViewRootImpl则负责渲染视图,它调用了一个performTraveals方法使得ViewTree开始
三大工作流程,然后使得View展现在我们面前。

绘制的流程概要

注意:这里的三个步骤是每次从根视图到最上层视图依次执行完,再进行下一步骤。

三个步骤:

Read More

Glide

此篇文章只是用于记录使用Glide时要注意的点和一些使用技巧,如需查看基本使用,
请查阅官方文档。也可以看看Glide原理分析

注意点

占位符

1
2
3
4
5
6
7
Glide.with(this)
.load(url)
.asBitmap() //指定加载的图片是位图,这样底层不会进行图片格式判断,Gif就无法播放,也可以设置asGif()指明是Gif图片
.placeholder(R.drawable.loading)//下载过程中的占位符
.error(R.drawable.error)//下载失败后的显示
.diskCacheStrategy(DiskCacheStrategy.NONE)//磁盘策略,这里不使用缓存
.into(imageView);

Read More