Android 佈局之LinearLayout 子控件weight權重的作用詳析

關於Android開發中的LinearLayout子控件權重android:layout_weigh參數的作用,網上關於其用法有兩種截然相反說法:

說法一:值越大,重要性越高,所占用的空間越大;

說法二:值越大,重要性越低,所占用的空間越小。

到底哪個正確?哪個錯誤?抑或還有其他解釋?請點擊查看關於weight 權重參數作用的詳分析:

其實這兩種情況都不太準確;

準確的解釋是,weight 權限 是用於分配父控件某一方向上尺寸-所有子控件在該方向上設定尺寸和 所得值的一個參數,把這個相減得到的結果(可能為正也可能為負)按照某個子控件weight值占所有weight值的比例分配給子控件,子控件在該方向上的最終實際尺寸為(控件設定尺寸+weight權限分配尺寸(可能為負))。

例如豎直方向的LinearLayout控件F中,兩個控件分別為:

A控件 hight = a, weight =w_a;

B控件 hight = b,weight=w_b;

父控件F 實際 hight = c;

則控件A和控件B的最終實際尺寸為:

A控件實際hight_a =a+(c-(a+b))*w_a/(w_a+w_b) ;

B控件實際hight_b =b+(c-(a+b))*w_b/(w_a+w_b) ;

若:w_a= 1; w_b= 2;

則:

hight_a=a+(c-(a+b))/3;

hight_b=a+(c-(a+b))*2/3;

所以 當(c-(a+b))值大於0時,也就是所有子控件高度(或寬度)之和小於父控件高度(或寬度)時,weight權限值越大會使得控件尺寸在原設定尺寸基礎上增加的值越大;

所以 當(c-(a+b))值小於0時,也就是所有子控件高度(或寬度)之和大於父控件高度(或寬度)時,weight權限值越大反而會使得控件尺寸在原尺寸基礎上減去的值更大;

但控件的實際尺寸是按上面公式計算結果得出,控件之間並不是在所有情況下都是weight值越大控件所占空間越大或weight值越小控件所占空間越小。

那麼為什麼一般大傢都這麼認為呢?其實是有兩種特殊情況:

一是:所有控件該方向尺寸都設定為0dp,這時 公式中的a=0;b=0;最終A、B控件的尺寸分別為:

hight_a=c*w_a/(w_a+w_b);

hight_b=c*w_b/(w_a+w_b);

這就是所謂的說法一:值越大,重要性越高,所占用的空間越大。

二是:所有控件該方向尺寸都設定為fillparent,這時 公式中的a=c;b=c;最終A、B控件的尺寸分別為:

hight_a=c*(1-*w_a/(w_a+w_b));

hight_b=c*(1-*w_b/(w_a+w_b));

這就是所謂的說法二:值越大,重要性越高,所占用的空間越小。

至此,關於LinearLayout佈局中的控件 的weight值的的作用,應該有瞭一個比較正確的認識瞭:

尺寸是通過公式計算出來的,隻有在特殊情況下才會是普遍認為的:值越
空間越大或值越大占用空間越小。

還有一個我認為是經常不被大傢所註意的但也特別實用的用途就是:可以利用weight值在保證空間最小尺寸的前提下去分配父控件多餘的尺寸(相對於所有子控件在該方向上的尺寸之和),實現一些特定比例的效果,具體的在此不再展開,感興趣的可以根據公式計算,自己親自去嘗試一下,應該會有你意想不到的收獲。





發佈留言