將LinearLayout中代碼Copy了一份存在本地,然後再在裏面加了幾個子View,打印出來LinearLayout.onMeasure中的那些變量的值
- 如下圖所示,LinearLayout中有4個子View
示例1 打印出來的值爲:
示例1打印出的值 其中可以看出由於最頂層的LinearLayout設置的是65dip,換算到本人手機上的是65*3=195px,由於自定義的LinearLayout的layout_height設置的是wrap_content,所以得到的MeasureSpec.Mode爲AT_MOST,而在第一個TextView的layout_height設置的是wrap_content,所以在第一個TextView進行measure的時候會根據getChildMeasureSpec來進行子View的MeasureSpec的計算,因爲是AT_MOST的,所以它的寬度最大隻能是195,與父View相同。而第二個和第三個View的height爲0,是因爲在getChildMeasureSpec中,父View的MeasureSpec.Mode爲AT_MOST,而子View的lp.height是MATCH_PARENT,所以計算的時候會得到0.而最後一個子View,是因爲layout_height指定了是1920dip,所以在getChildMeasureSpec的時候,會直接把1920dip轉換成size,然後Mode爲MeasureSpec.EXACTLY,所以在獲取大小的時候,得到的是5760。
- 第二種情況和上面的情況只變了一個地方,是LinearLayout的wrap_content變成了match_parent,
示例2
打印出來的值爲:
示例2打印出的值
可以看到和上面的區別只是MeasureSpec.Mode從AT_MOST變成了EXACTLY
- 有weight的情況
設置Weight屬性
打印出的結果:
Paste_Image.png
其中Delta在源碼中表示超出的部分,shared代表着這個View還需要分擔多少高度