您的位置:首页 > 其它

你所不知道的layout_weight

2015-09-19 22:07 309 查看
如何在linearlayout设置一个控件居于最低端,如果是用layout_gravity,由于bottom这种布局只在父布局orientation为horizontal才有效如果水平就不能再垂直底端了,答案是加一层linearlayout,并设置layout_height="0dp"(这个值可以任意取,包括wrap和match,有人说必须其实不是,但eclipse会提示你改成0更好),然后layout_weight="1"(这个值是大于的任意值,小数也ok),最后的是gravity="bottom",然后果然控件居于底部了。

然后稍微扩展下如何让一个布局居于底部的中间怎么办?

只要gravity="bottom"变成gravity="bottom|center_horizontal"就行了。下面是示例代码:

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:gravity="bottom|center_horizontal"
android:orientation="horizontal" >

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >

<ImageView
android:id="@+id/iv_refresh"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/refresh" />

<TextView
android:layout_width="40dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="刷新" />
</LinearLayout>
</LinearLayout>


于是我们要问,不设置layout_weight="任意大于0的数“不行吗,试了试果然不行,由于我们是为了bottom才设置的weight,所以我们推出,bottom以及跟bottom类似的属性必须设置weight属性大于0才能用,因为默认为0。这似乎已经解决了使用的问题。

关于weight(此处指的就是layout_weight)需要了解的还有很多。。。。

weight是如何运行的:我的的布局文件早晚要转化成代码的,如果我们设置了该属性,那么代码中的onMeasure就要执行2次,因为有一次默认值是0。

weight设置的数是如何计算空间的?

为了保证能够把一个空间长度分配完,它采取的是剩余空间按比例分配,比如控件长x,y,z,weight数值分别是a,b,c,总长为L,那么a分配到的空间长度就是[L-(x+y+z)]*a/(a+b+c)+x 先总长减去占用的长度得到剩下的长度,然后乘以本控件的占比,最后加上该控件本身的长度,我试了试,3个控件的长度算出来加一起还是L会不会受wrap和match(match和fill是一个意思)影响呢?答案是不会,如果是fill的话那么该控件的长度就是L了,第一步得到的剩下的长度就是负数就可以了,照样算。如果是wrap就要看该控件所占据的空间到底多少了,pixel大的就占的大。

为什么2个控件设置weight为1:2,用match占据的是2:1,而用wrap占据的是1:2呢?

首先该2个控件的wrap是肉眼看起来很小的的,否则达不到上面的效果,我们先计算下设wrap的长度为x,总长为L,第一个控件长度为:

match方法:[L-(L+L)]*1/3+L=2L/3;第二个控件的长度是[L-(L+L)]*2/3+L=1L/3 注意:如果都是match的话每个本身长度是不是该控件wrap的长度,而是L,所以是2:1

wrap方法:[L-(x+x)]*1/3+x=1L/3+1x/3;第二个控件的长度是2L/3-1x/3 ,x相对于L是很小的,所以比例就是1:2

如何才能正好呢,当水平放置的时候我们只需设置width=”0dp“这样就不用算wrap了,或者可以认为wrap就是0,x=0,就正好是1:2了


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: