Android View 的绘制流程 - 开篇 MeasureS

作者: __Y_Q | 来源:发表于2020-02-11 14:38 被阅读0次

本文基于上一个文集 Android 之 setContentView 流程 而写.
上个文集介绍了 setContentView 的流程及 DecorView 的概念. 对这两个知识点了解的请略过, 不了解的朋友, 还是先去了解一下比较好.
( 本文集源码基于 Android 8.0 )

在正式学习 View 的绘制流程之前, 首先要学习下面的一个知识点, 不然后面会看的一脸蒙圈

MeasureSpec

这个单词翻译过来就是 [测量规格/测量要求], 官方文档对它的说明是 [一个 MeasureSpec 是由父容器传递给子容器的布局要求] .通俗的说, 就是父容器的 MeasureSpec 和 父容器内部的子容器的 LayoutParams, 通过计算得出的一个 子容器布局的测量要求.

MeasureSpec 是一个整形 (32位), 它包含两部分内容, 一个是大小, 一个是模式. 将这两部分内容打包成一个 Int 类型. 高2位代表模式, 低30位代表大小.

  • 模式
    模式分为三种
private static final int MODE_SHIFT = 30;
//不对View大小做限制,如:ListView,ScrollView. 这个在工作中极少碰到, 一般在系统中才会使用到.
public static final int UNSPECIFIED = 0 << MODE_SHIFT;
//精确值模式,如:确切的数值或者 march_parent
public static final int EXACTLY     = 1 << MODE_SHIFT;
//最大值模式,如:wrap_content.
public static final int AT_MOST     = 2 << MODE_SHIFT;

有朋友就要问了, 一个整型的值, 怎么包含两部分内容.
以模式 AT_MOST 举例. 转成二进制 为           0000 0000 0000 0000 0000 0000 0000 0010
那么把 10 向左移动 30位, 变成                       1000 0000 0000 0000 0000 0000 0000 0000
比如值为 4, 转成二进制是 100,
那他们组合后就变成一个 32位的二进制数据. 1000 0000 0000 0000 0000 0000 0000 0100
这样就同时包含了模式与大小.

下一章将正式开始 View 的绘制流程!

相关文章

网友评论

    本文标题:Android View 的绘制流程 - 开篇 MeasureS

    本文链接:https://www.haomeiwen.com/subject/oxtxfhtx.html