你所不知道的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"就行了。下面是示例代码:
于是我们要问,不设置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了
然后稍微扩展下如何让一个布局居于底部的中间怎么办?
只要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了
相关文章推荐
- 随感
- 数据结构实践——括号的匹配(栈)
- Linux:目录&文件基本操作
- 对git的认识
- YoMail,Gmail死忠粉的福音——直接收发Gmail邮件
- test5.12
- sizeof()和strlen()不得不说的故事
- 2.1-squid正向代理
- nodejs+express+mongodb简单的例子
- 百度测试开发9/16/2015
- 我的2015
- Fragment----静态创建碎片
- 2016京东在线笔试(编程题之一)
- netbeans中表格使用
- 编程练习(1)
- Grub
- hdu 5464(01背包)
- sin(x)的实现
- HDOJ 1846 Brave Game(巴什博奕)
- Android之AnimationSet