Android学习笔记:布局属性 layout_weight 解析

说到屏幕适配,最好的方式就是将组件按屏幕比例显示。Android中有一个weight属性,用它来控制组件占用比例非常方便。


weight在使用时都需要注意什么呢?刚开始接触weight属性时,它有时不会按照我们的预期分配组件占据空间的比例。这是对weight属性了解不够导致的,weight属性非常重要,理解后才能充分利用。


一、定义测试布局

使用LinearLayout布局,去掉边缘留白,并添加三个水平的Text组件。设置颜色背景。方便查看。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <TextView
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:background="#FF0033"
        android:gravity="center"
        android:text="AAAAAAAAAAAAA" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:background="#009933"
        android:gravity="center"
        android:text="B" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:background="#FF6600"
        android:gravity="center"
        android:text="C" />

</LinearLayout>


二、开始测试

1、将三个TextView的layout_width属性设置wrap_content。删除weight所在的代码。


结果:三个组件都按照自己的内容来分配空间。


2、将三个TextView的layout_width属性设置0dp。height属性设置50dp。把刚刚删除的weight属性代码添加回来。


结果:三个组件都可以按照weight属性的1:1:1来占据空间。但是A组件的显示方式并不符合预期,因为它向下走了一段距离。

但是仔细观察,组件内的第一行文本是对齐的。


这是因为,TextView默认会参考父类LinearLayout的baseLine(基线)来对齐。可以采用以下方式避免此问题。

在LinearLayout的属性设置中加入android:baselineAligned="false"属性。即

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:baselineAligned="false" >
然后运行程序,结果如预期显示组件。


3、设置weight属性分别为1、2、3。


结果:如预期一样,组件以1:2:3的比例填充空间。


4、设置A组件的width属性为wrap_content。


结果:A组件明显长度过大,比例不再是1:2:3。

原因:LinearLayout中的layout_weight属性在分配比例时会经过两步。

第一步,将控件按声明的尺寸进行分配。

第二步,将剩下的空间按weight属性的值进行比例分配。

即组件所占空间的计算:所占宽度 = 组件声明宽度 + (父控件宽度 - 组件声明宽度)* 组件所占比例(weight属性定义)


5、进一步验证上一条所示的结论是否正确。设置三个组件的width属性为match_parent,weight分别为1、2、2。


结果:组件并没有按照1:2:2的比例显示组件。

验证:设屏幕宽度为1080,则三个组件的声明宽度都是1080,则剩余尺寸:1080 - 1080*3 = - 1080*2

A组件宽度 = 1080 + (- 1080 * 2)*(1 / 5)= 1080 * (3 / 5);

B、C组件宽度 = 1080 + (- 1080*2)* (2 / 5)= 1080 * (1 / 5);

即A组件占据3/5的空间,B、C组件各占据1/5的空间。


结论:

1、width声明组件宽度,weight功能是设置剩余空间的分配比例

2、组件所占空间的计算:所占宽度 = 组件声明宽度 + (父控件宽度 - 组件声明宽度)* 组件所占比例(weight属性定义)

3、weight属性在垂直的LinearLayout布局中是设置剩余空间的高度比。

4、最重要的一点:weight只适用于LinearLayout布局

5、开发中若设置weight属性,最好将width属性设为0dp,这可以提升程序的运行性能。




总结参考:慕课网,human老师的《Android面试解密 - layout_weight》,并做了一些补充说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值