LinearLayout.onMeasure--事例說明

將LinearLayout中代碼Copy了一份存在本地,然後再在裏面加了幾個子View,打印出來LinearLayout.onMeasure中的那些變量的值

  1. 如下圖所示,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。

  1. 第二種情況和上面的情況只變了一個地方,是LinearLayout的wrap_content變成了match_parent,

示例2

打印出來的值爲:

示例2打印出的值

可以看到和上面的區別只是MeasureSpec.Mode從AT_MOST變成了EXACTLY

  1. 有weight的情況

設置Weight屬性

打印出的結果:

Paste_Image.png

其中Delta在源碼中表示超出的部分,shared代表着這個View還需要分擔多少高度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章