Android View 的繪制流程 - 開篇 MeasureSpec
Android View 的繪制流程 01 - 前置流程
Android View 的繪制流程 02 - performMeasure
Android View 的繪制流程 03 - performLayout
Android View 的繪制流程 04 - performDraw
Android View 的繪制流程總結
本文基于上一個文集 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 的繪制流程!