Android开发中我们平时接触最多的是各种View, View是一个比较大的体系,包含了绘制流程、事件分发、各种动画、自定义View 等等。前几天我写了一篇事件分发源码解析的文章, 今天我们来探索一下绘制流程中有点难懂的测量流程。
基础知识准备
测量涉及到的相关类和方法:
- MeasureSpec: 中文翻译测量规格,包含了两部分:SpecMode(测量模式)、SpecSize(对应测量模式下的规格大小)。它是由32位int值表示的,高两位代表SpecMode,低30位代表SpecSize
- measure(): 测量的入口方法,里面调用了onMeasure方法
- onMeasure(): 暴露给开发者可以自定义测量规则,不重写的话默认走的都是View的onMeasure方法
现在我们从View的onMeasure方法聊起来吧~~~
View的onMeasure源码解析
为了方便大家理解先给大家上三段常见的代码:
①View的width和height都是wrap_content
<?xml version="1.0" encoding="utf-8"?>②View的width和height都是match_parent
<?xml version="1.0" encoding="utf-8"?>③View的width和height都是100dp
<?xml version="1.0" encoding="utf-8"?>上面三段代码展示效果如下:
场景①和②:
场景③:
简单描述下上面出现的情况:
- 当view的宽高设置成match_parent和wrap_content的时候,显示的大小和父view的大小一致
- 当view的宽高设置成固定值(xxdp)的时候,显示的大小就是我们设置的固定值大小
如果你已经对上面结果感觉毫无疑问而且心里已经知其所以然了,后面的内容可以不用看了。点个赞就可以走了。。。
等等。。开个玩笑。。怎么就当真了呢。。哈哈哈。。废话不多说,走,我们点进去源码瞅瞅。
View.onMeasure
//View.java
public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
…
//1
onMeasure(widthMeasureSpec, heightMea