前言
對於中高級的工程師來說,有一定的閱讀源碼的經驗已經必備技能之一了,尤其是 LinearLayout 和 RelativeLayout,我們先準備一下要掌握的知識點:
- LinearLayout 的 Weight 是如何實現的?
- LinearLayout 的 Weight 對於測量過程增加了哪些實現成本?
- LinearLayout 的 Weight 真的會導致需要測量兩次嗎?
- RelativeLayout 的 Measure 過程爲什麼會有兩次?
- RelativeLayout 的 Padding 和 Margin 對於居中屬性爲什麼沒有影響?
- RelativeLayout 在版本 4.2,4.3 和 4.4 做了哪些調整和適配?
還有很多其他的問題困擾着我們,很多技術分享文章都只是講大概的流程,被問到細節的時候,我們還是會一臉懵逼,不知所措。
這一篇 Chat 我們來詳細的分析一下 LinearLayout 和 RelativeLayout 的實現原理,是一句一句的分析,真的十分詳細的分析。
LinearLayout
LinearLayout 的特性是線性佈局,weight 屬性是他的專屬利器,可以實現比例佈局。LinearLayout 可以設置橫向或者是豎向,這裏以豎向佈局作爲分析的目標。
onMeasure
首先我們看一下 LinearLayout 的 onMeasure 方法:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mOrientation == VERTICAL) {
measureVertical(widthMeasureSpec