这里主要从宽度的讨论layout_weight 。 layout_weight 是用来对总的额外宽度的分配的权重,把各个子view分配到的额外宽度再加上原来的宽度,就是最后的宽度大小了。
这里关键在于额外宽度的计算的方法,总额外宽度是这样计算的:父宽度 减去 各个子view的宽度之和;每个子view分配到的额外宽度 = 总额外宽度 * 权重比。
子view宽度是xml中指定的,比如 android:layout_width="0dp" ,那这个view的宽度就是0;又如android:layout_width="match_parent" ,那它的宽度就是父的宽度了;再如 android:layout_width="wrap_content" 它的实际宽度视内容而定,最大等于父的宽度;指定确定的值 android:layout_width="150dp",这样这个view的宽度就是 150。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dp"
android:orientation="horizontal" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text=""
android:background="#FF0000" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
android:text=""
android:background="#00FF00" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text=""
android:layout_weight="2"
android:background="#0000FF" />
</LinearLayout>
父LinearLayout宽度为match_parent , 每个TextView的宽度也是match_parent, 那么三个子TextView的总宽度就是3*match_parent;这样额外的总宽度为 match_parent - 3*match_parent = -2*match_parent ;
第一个 TextView分配到的额外宽度为 : -2*match_parent * 1/(1+2+2) = -2 *match_parent / 5 ; //权重是1,总权重为5
第二个 TextView分配到的额外宽度为 : -2*match_parent * 2/(1+2+2) = -4 * match_parent / 5 ; //权重是2,总权重为5
第三个 TextView分配到的额外宽度为 : -2*match_parent * 2/(1+2+2) = -4 * match_parent / 5 ; //权重是2,总权重为5
这样下来 每个子TextView 的原来宽度 加上 分配到的额外宽度就是最后宽度了,(注意负号)
第一个TextView的最后宽度: match_parent + (-2 * match_parent / 5 ) = (3/5) * match_parent ;
第二个TextView的最后宽度: match_parent + (-4 * match_parent / 5 ) = (1/5) * match_parent ;
第三个TextView的最后宽度: match_parent + (-4 * match_parent / 5 ) = (1/5) * match_parent ;
再比如:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="150dp"
android:layout_height="200dp"
android:orientation="horizontal" >
<TextView
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text=""
android:background="#FF0000" />
<TextView
android:layout_width="50dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text=""
android:background="#00FF00" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:text=""
android:layout_weight="2"
android:background="#0000FF" />
</LinearLayout>
父LinearLayout宽度为150,第一个TextView 宽度100,第二个TextView宽度 50,第三个TextView宽度 0,那么三个子TextView总的宽度为100+50+0 = 150; 那么额外总宽度 = 父的宽度(150) - 各个子宽度之和(150) = 0;
这样没有额外的总宽度来分配了,那么最后
第一个TextView的宽度 自己的宽度(150)+额外分配到的宽度(0) = 150;
第二个TextView的宽度 自己的宽度(50)+额外分配到的宽度(0) = 50;
第二个TextView的宽度 自己的宽度(0)+额外分配到的宽度(0) = 0;