天天看點

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值在保證空間最小尺寸的前提下去配置設定父控件多餘的尺寸(相對于所有子控件在該方向上的尺寸之和),實作一些特定比例的效果,具體的在此不再展開,感興趣的可以根據公式計算,自己親自去嘗試一下,應該會有你意想不到的收獲。

http://blog.csdn.net/blogblj/article/details/19677575

http://zhangkun716717-126-com.iteye.com/blog/1870924

繼續閱讀