LinearLayout,很常用的一種布局,當(dāng)在使用這種布局方式時,為了達到較好的屏幕適配效果,可以選擇使用android:layout_weight屬性。當(dāng)為布局中的每個組件指定了大小和權(quán)重之后,我們的android系統(tǒng)如何計算各組件實際所占空間呢?
貼個自己常用的計算方法:
實際大小=指定大小+(屏幕大小-(所有組件大小的和))*權(quán)重比例。
用一屏幕的大小減去所有組件大小的和,得到剩余大小,或理解為可分配空間,該值可為負。然后用我們給某個組件設(shè)定的值,加上其在剩余大小中按比例計算后的值,就是該組件最后的實際大小。
可用空間=屏幕大小-所有組件大小的和,
實際大小=指定大小+可用空間*權(quán)重比例,
所以最后為:
實際大小=指定大小+(屏幕大小-(所有組件大小的和))*權(quán)重比例。
示例:
以android:layout_width為例,驗證計算方式(屏幕寬度:L)
在LinearLayout中放置三個按鈕,分別為Button1,Button2,Button3,android:layout_height="wrap_content"均指定為包裹內(nèi)容,每個Button的android:layout_weight分別為1,2,3。
依據(jù)android:layout_width屬性的設(shè)置,分三種情況:
1. android:layout_width="0dp"時:
組件大小=0+(L-(0+0+0))*權(quán)重比例,組件大小和權(quán)重成正比。
各Button占的寬度:
Button1=0+(L-(0+0+0))*(1/6),為1/6L;
Button2=0+(L-(0+0+0))*(2/6),為2/6L;
Button3=0+(L-(0+0+0))*(3/6),為3/6L。
所以Button1:Button2:Button3 = 1:2:3。

2. android:layout_width="match_parent"時:
組件大小=L+(L-(L+L+L))*權(quán)重比例,組件大小和權(quán)重成反比。
如果前面組件已經(jīng)占滿屏幕,則剩余組件無法獲得空間,不可見。
各Button占的寬度:
每個Button的layout_width指定為match_parent,即表示每個Button指定大小為父組件寬度,即L。
Button1=L+(L-(L+L+L))*(1/6),為4/6L;
Button2=L+(L-(L+L+L))*(2/6),為2/6L;
Button3=L+L(L-(L+L+L))*(3/6),為0。
所以Button1:Button2=2:1,Button3不可見。

3. android:layout_width="wrap_content"時:
組件大小=所需大小+(L-各組件所需大小和)*權(quán)重比例,剩余大小即(L-各組件所需大小和)為正,則為正比,否則為反比。
該情況和組件內(nèi)容占用大小有關(guān),所以布局上并不是很明顯的比例關(guān)系,因為比例關(guān)系僅指剩余大小的比例:
? ? 剩余大小為正,即屏幕空間足夠,所占空間和權(quán)重成正比。

? ? 剩余大小為負,即屏幕空間不足,所占空間和權(quán)重成反比,下面的圖可能有點難看,希望想表達的意思到了。

LinearLayout的android:layout_weight屬性用起來很簡單,但是如果想深入理解其原理,就需要參考源代碼了。