参考:
http://www.cnblogs.com/zhmore/archive/2011/11/04/2236514.html
http://m.blog.csdn.net/article/details?id=24667299
http://renyuan-1991.iteye.com/blog/2272200

1、只有在Linearlayout中,该属性才有效。
2、android:layout_weight的真实含义是:一旦View设置了该属性(假设有效的情况下),那么该 View的宽度等于原有宽度(android:layout_width)加上剩余空间的占比!

计算公式:

控件A最终宽度 = 控件A初始宽度+((屏幕宽度 - 控件宽度和)/(所有weight之和))* 控件A的weight的值

剩余宽度 = 屏幕宽度 - 控件宽度和

举例:

上图的六条,分表对应下面的六段代码,具体解析在每段代码后。

一、

    <LinearLayout  android:layout_width="match_parent" android:orientation="horizontal" android:layout_marginTop="20dp" android:layout_height="50dp">        <TextView  android:layout_weight="1" android:layout_width="0dp" android:background="@color/blue" android:layout_height="match_parent" />        <TextView  android:layout_weight="2" android:layout_width="0dp" android:background="@color/red" android:layout_height="match_parent" />        <TextView  android:layout_weight="3" android:background="@color/yellow" android:layout_width="0dp" android:layout_height="match_parent" />    </LinearLayout>

二、

    <LinearLayout  android:layout_width="match_parent" android:orientation="horizontal" android:layout_marginTop="20dp" android:layout_height="50dp">        <TextView  android:layout_weight="1" android:layout_width="match_parent" android:background="@color/blue" android:layout_height="match_parent" />        <TextView  android:layout_weight="2" android:layout_width="match_parent" android:background="@color/red" android:layout_height="match_parent" />        <TextView  android:layout_weight="3" android:background="@color/yellow" android:layout_width="match_parent" android:layout_height="match_parent" />    </LinearLayout>

设屏幕宽度为L,在三个view的宽度都为match_parent的情况下,原有宽度为L,三个的View的宽度都为L,剩余宽度为L-(L+L+L) = -2L

三个TextView的宽度依次为:
L+(-2L)*1/6 = (2/3)L
L+(-2L)*2/6 = (1/3)L
L+(-2L)*3/6 = (0)L

事实上默认的View的weight这个值为0,一旦设置了这个值,那么所在view在绘制的时候执行onMeasure两次的原因就在这。

三、

    <LinearLayout  android:layout_width="match_parent" android:orientation="horizontal" android:layout_marginTop="20dp" android:layout_height="50dp">        <TextView  android:layout_weight="1" android:layout_width="100dp" android:background="@color/blue" android:layout_height="match_parent" />        <TextView  android:layout_weight="1" android:layout_width="0dp" android:background="@color/red" android:layout_height="match_parent" />        <TextView  android:layout_weight="1" android:background="@color/yellow" android:layout_width="0dp" android:layout_height="match_parent" />    </LinearLayout>

设屏幕宽度为L,剩余宽度为L-(100dp)

三个TextView的宽度依次为:
100+(L-(100dp))*1/6
0+(L-(100dp))*2/6
0+(L-(100dp))*3/6

相当于是把L-100dp平均分为6分,然后按比重划分给每个view
最后把100dp加到指定的view上

四、

    <LinearLayout  android:layout_width="match_parent" android:orientation="horizontal" android:layout_marginTop="20dp" android:layout_height="50dp">        <TextView  android:background="@color/black" android:layout_width="100dp" android:layout_height="match_parent" />        <TextView  android:layout_weight="1" android:layout_width="0dp" android:background="@color/blue" android:layout_height="match_parent" />        <TextView  android:layout_weight="1" android:layout_width="0dp" android:background="@color/red" android:layout_height="match_parent" />        <TextView  android:layout_weight="1" android:background="@color/yellow" android:layout_width="0dp" android:layout_height="match_parent" />    </LinearLayout>

为了验证代码三是正确的,所以代码四中,加了一段宽度为100dp的黑色块,结果三和四的显示比例一样

五、

    <LinearLayout  android:layout_width="match_parent" android:orientation="horizontal" android:layout_marginTop="20dp" android:layout_height="50dp">        <TextView  android:layout_weight="1" android:layout_width="wrap_content" android:background="@color/blue" android:text="123456789123456789" android:textColor="@color/white" android:layout_height="match_parent" />        <TextView  android:layout_weight="1" android:layout_width="0dp" android:background="@color/red" android:layout_height="match_parent" />        <TextView  android:layout_weight="1" android:background="@color/yellow" android:layout_width="0dp" android:layout_height="match_parent" />    </LinearLayout>

第一个view的 android:layout_width=”wrap_content”,所以初始宽度为text的长度

设屏幕宽度为L,剩余宽度为L-(text的长度)

三个TextView的宽度依次为:
text的长度+(L-(text的长度))*1/6
0+(L-(text的长度))*2/6
0+(L-(text的长度))*3/6

六、

    <LinearLayout  android:layout_width="match_parent" android:orientation="horizontal" android:layout_marginTop="20dp" android:layout_height="50dp">        <TextView  android:layout_weight="1" android:layout_width="0dp" android:background="@color/blue" android:text="123456789123456789" android:textColor="@color/white" android:layout_height="match_parent" />        <TextView  android:layout_weight="1" android:layout_width="0dp" android:background="@color/red" android:layout_height="match_parent" />        <TextView  android:layout_weight="1" android:background="@color/yellow" android:layout_width="0dp" android:layout_height="match_parent" />    </LinearLayout>

设屏幕宽度为L,三个view指定的android:layout_width都是0,所以剩余宽度为L

三个TextView的宽度依次为:
0+(L)*1/6
0+(L)*2/6
0+(L)*3/6

更多相关文章

  1. android获得屏幕高度和宽度
  2. Android获取屏幕宽度的4种方法
  3. 如何让listview宽度自适应
  4. android布局基础及范例(二):人人android九宫格布局
  5. 实现了在android实现左右滑动切换界面的效果
  6. ImageView的android:maxHeight,android:minHeight的正确设置
  7. android:layout_weight的真实含义
  8. GridView
  9. Android(安卓)获取View高度宽度

随机推荐

  1. SQL Server 2016 TempDb里的显著提升
  2. SqlDateTime溢出该怎么解决
  3. SQL Server创建数据库和数据表的相关约束
  4. Sql存储过程游标循环的用法及sql如何使用
  5. 针对distinct疑问引发的一系列思考
  6. SQL Server 表变量和临时表的区别(详细补
  7. sql server中判断表或临时表是否存在的方
  8. sql的临时表使用小结
  9. sql server 创建临时表的使用说明
  10. SQL Server数字开头的数据库表名的解决方