首页 > 代码库 > Android技术14:Android中layout_weight属性解析

Android技术14:Android中layout_weight属性解析

      为了更好的对空间进行布局,在LinearLayout中使用layout_weight,然后对于这一属性,在有些书上或者Android的初学者直接认为layout_weight值越大,控件权重就越大,所占用的空间就越大或者layout_wight值越小,控件空间就越大。这两种都是片面的,没有真正认识到layout_weight含义以及如何布局。下面首先演示使用代码为什么会有这两种感觉。

1.演示权重成反比

LinearLayout设置水平布局,然后里面空间宽度为fill_parent,layout_weight属性比为3:1,效果如下

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="fill_parent" 4     android:layout_height="fill_parent" 5     android:orientation="horizontal"> 6     <TextView  7         android:background="#ff0000" 8         android:layout_width="fill_parent" 9         android:layout_height="fill_parent"10         android:layout_weight="1"11         android:text="红色背景"12         android:textColor="#ffffff"/>13     <TextView 14         android:background="#00ff00"15         android:layout_width="fill_parent"16         android:layout_height="fill_parent"17         android:layout_weight="3"18         android:text="绿色背景"19         android:textColor="#ffffff"/>20      21 </LinearLayout>

2.演示权重成正比

LinearLayout设置水平布局,然后里面空间宽度为0dip,layout_weight属性比为3:1,效果如下

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="fill_parent" 4     android:layout_height="fill_parent" 5     android:orientation="horizontal"> 6     <TextView  7         android:background="#ff0000" 8         android:layout_width="0dip" 9         android:layout_height="fill_parent"10         android:layout_weight="1"11         android:text="红色背景"12         android:textColor="#ffffff"/>13     <TextView 14         android:background="#00ff00"15         android:layout_width="0dip"16         android:layout_height="fill_parent"17         android:layout_weight="3"18         android:text="绿色背景"19         android:textColor="#ffffff"/>20      21 </LinearLayout>

3.Layout_wight布局计算

     无论空间大小与权值成正比还是反比这一些说法都是不正确,Android中系统有一种计算空间大小的方式。首先根据layout_width的大小分别布局空间,然后将剩余空间按照layout_weight设置的权值比分配空间,如果没有设置,默认为0。

      控件所占空间大小=layout_width空间大小+(剩余空间)*该空间weight权值     剩余空间可正可负。

      这里的剩余空间,即当布满空间后剩下的空间,当所有控件layout_width属性为fill_parent(屏幕满屏),这时超出的部分为剩余空间,只是其中值为负值。下面用具体例子数目。LinearLayout内3个TextView,layout_width=“fill_parent”  layout_weight比为1:2:3。

      一个fill_parent=满屏X,LinearLayout布局child子控件时会measure两次,第一次,分别布局每个TextView空间的大小,即textview1=X,textView2=X,textView3=X;第二次分配剩余空间,剩余空间大小=X-3X=-2X,即超出了2个满屏,textview1权值1/6,textview2权值2/6,textview3权值3/6,所以

     textview1=X+(-2X)*1/6=2/3X

     textview2=X+(-2X)*2/6=1/3X

     textview3=X+(-2X)*3/6=0

根据上面计算得到textview1占2/3屏幕,textview2占1/3屏幕,textview3不显示。

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="fill_parent" 4     android:layout_height="fill_parent" 5     android:orientation="horizontal"> 6     <TextView  7         android:background="#ff0000" 8         android:layout_width="fill_parent" 9         android:layout_height="fill_parent"10         android:layout_weight="1"11         android:text="红色背景"12         android:textColor="#ffffff"/>13     <TextView 14         android:background="#00ff00"15         android:layout_width="fill_parent"16         android:layout_height="fill_parent"17         android:layout_weight="2"18         android:text="绿色背景"19         android:textColor="#ffffff"/>20     <TextView 21         android:background="#0000ff"22         android:layout_width="fill_parent"23         android:layout_height="fill_parent"24         android:layout_weight="3"25         android:text="蓝色背景"26         android:textColor="#ffffff"/>27 </LinearLayout>