zoukankan      html  css  js  c++  java
  • Android的layout_weight和weightSum

      先看一下weightSum属性的功能描述:定义weight总和的最大值。如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值。把weightSum的定义搁在这里,先去看看android:layout_weight如何使用。

      android:layout_weight是用来给LinearLayout的子控件分配剩余空间,这里的剩余空间在某些情况下也会为负数。以计算子控件宽度为例(高度计算方式也一致),计算公式为:View宽度 = View原有宽度 +((LinearLayout宽度 - (所有子View宽度总和)) / 所有子View的weight总和) × View的weight值。按照我这里给出公式,计算下面的LinearLayout中的子View宽度:

        我们假设屏幕宽度为480,假设TextView的wrap_content宽度为20

        TextView1宽度为 = 20 +((480 - (20×3)) / 2) × 0 = 20

        TextView2宽度为 = 20 +((480 - (20×3)) / 2) × 1 = 230

        TextView3宽度为 = 20 +((480 - (20×3)) / 2) × 1 = 230

        最后显示效果如下图所示:

        

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="horizontal" >  
      
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:background="#0045f5"  
            android:gravity="center"  
            android:text="1" />  
      
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:background="#00ff47"  
            android:gravity="center"  
            android:text="2"   
            android:layout_weight="1"/>  
      
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:background="#ff5600"  
            android:gravity="center"  
            android:layout_weight="1"  
            android:text="3" />  
      
    </LinearLayout>
    

      所以通过理解上面给出的公式,我们可以看出这个公式的第一步就是计算LinearLayout内的剩余空间,再将剩余空间按weight比例分配给各个子View。在公式中,每个子View的宽度等于定义时的View宽度(例如为wrap_content,则子View宽度等于自身内容宽度;fill_parent,则为填充父容器的宽度)+ 按weight分配的剩余空间宽度。如果我们将子View的宽度都设置成0dp,我们将完全可以按weight来分配子View的宽度。而反之,当我们将子View宽度设置为wrap_content时,控件宽度就会受到weight和子View本身定义时宽度两个因素影响。而当子View宽度设置为fill_parent时,对子View的影响更加明显,例如下面代码:

        我们假设屏幕宽度为480,而TextView因为宽度设置为fill_parent,所以宽度也都是480

        TextView1宽度为 = 480 +((480 - (480×3)) / 6) × 1 = 320

        TextView2宽度为 = 480 +((480 - (480×3)) / 6) × 2 = 160

        TextView3宽度为 = 480 +((480 - (480×3)) / 6) × 3 = 0

        所以结果是TextView1占了2/3,TextView2占了1/3,TextView3没有显示空间。其实无论宽度如何设置,只要按给出公式计算,我们就能明白为什么最终显示效果如此。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="horizontal" >  
      
        <TextView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:background="#0045f5"  
            android:gravity="center"  
            android:layout_weight="1"  
            android:text="1" />  
      
        <TextView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:background="#00ff47"  
            android:gravity="center"  
            android:text="2"   
            android:layout_weight="2"/>  
      
        <TextView  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:background="#ff5600"  
            android:gravity="center"  
            android:layout_weight="3"  
            android:text="3" />  
    </LinearLayout>  
    

        最后说一下weightSum,这个属性是设置在LinearLayout上,就像开头说的是设置weight总和的最大值。怎么理解呢?比如我们想让3个TextView按1:2:2的方式显示,需要如下代码所示设置。此时的weightSum其实是1+2+2=5,也就是说如果未指定LinearLayout的该值,以所有子视图的layout_weight属性的累加值作为总和的最大值。那如果我手动设置weightSum,则子View的weight必须按weightSum来分配。例如我们将weightSum设置为1,而TextView1的weight设置为0.2,TextView2的weight设置为0.4,TextView3的设置为0.4,同样能够实现1:2:2的效果。所以weightSum的作用就如其定义:“定义weight总和的最大值。如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值。”

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="horizontal" >  
      
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="0dp"  
            android:background="#0045f5"  
            android:gravity="center"  
            android:text="1"
            android:layout_weight="1" />  
      
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="0dp"  
            android:background="#00ff47"  
            android:gravity="center"  
            android:text="2"   
            android:layout_weight="2"/>  
      
        <TextView  
            android:layout_width="wrap_content"  
            android:layout_height="0dp"  
            android:background="#ff5600"  
            android:gravity="center"  
            android:layout_weight="2"  
            android:text="3" />  
      
    </LinearLayout>  

        其实这里写的比较简单,主要是为了给自己做个笔记,把关键的稍微写一下。如果对大家帮助不大,还请见谅!

    参考连接:

    http://blog.csdn.net/xiaanming/article/details/13630837

    http://book.51cto.com/art/201404/435840.htm

     参考代码:http://files.cnblogs.com/files/endure/ListViewTable.rar(给出参考连接1中的Demo加工版)

  • 相关阅读:
    第十九天:类和对象
    第十五天:模块
    十四天:匿名函数
    十四天作业
    第十三天:迭代器、递归
    十二天:闭包和装饰器
    一个炒鸡简单的购物车
    十一天
    第十天
    第十天作业
  • 原文地址:https://www.cnblogs.com/endure/p/4893944.html
Copyright © 2011-2022 走看看