• layout_weight是对额外空间按权重的分配

    几个例子演示
    服务器君一共花费 20.676 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    看完 LinearLayout layout_weight 属性的4个简单演示 的例子,你也许会不解:为毛 weight 值越大占的空间越小,甚至会消失?

    如果不懂,再来看看 SDK 里的解释:layout_weight属性用于分配LinearLayout中的的额外空间(extra space)。如果View不想拉伸的话,layout_weight值设置为0。否则的话这些像素会按比例分配到这些weight值大于0的所有View。

    也就是说,layout_weight其实就是分配额外的空间而已。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:background="#00ff00"
        android:orientation="horizontal" >
    
        <Button
            android:id="@+id/button1"
            android:layout_width="60dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="1" >
        </Button>
    
        <Button
            android:id="@+id/button2"
            android:layout_width="60dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="2" >
        </Button>
    
        <Button
            android:id="@+id/button3"
            android:layout_width="60dp"
            android:layout_height="fill_parent"
            android:layout_weight="2"
            android:text="3" >
        </Button>
    
    </LinearLayout>
    

    虽然这三个按钮的 layout_weight 为 1/1/2,但最后它们的长度都是一样的,为什么呢?

    linearLayout中包含有weight的child时,linearLayout会measure两次:

    • 第一次 测量 child 的 原始值;
    • 第二次 测量 child 的 比重值。

    然后将2次测量的值相加,才得到 child 的具体的宽 或 高。

    那么这里在第一次 measure 的时候,linearLayout 总长是 180dp,而三个按钮都是 60dp,所以第一次就每个按钮 60dp 平均分配下去。第二次 measure 是将额外空间根据 layout_weight 分配,这里额外空间为 180dp - 3 × 60dp = 0,就说没有额外空间了……所以看到的结果就是第一次分配的结果。

    为了验证我们的想法,我们再来看一个例子。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:background="#00ff00"
        android:orientation="horizontal" >
    
        <Button
            android:id="@+id/button1"
            android:layout_width="50dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="1" >
        </Button>
    
        <Button
            android:id="@+id/button2"
            android:layout_width="50dp"
            android:layout_height="fill_parent"
            android:layout_weight="3"
            android:text="2" >
        </Button>
    
       
    </LinearLayout>
    

    第一次分配,button1 和 button2 都获得了 50dp 的长度。额外空间为 200dp - 50dp × 2 = 100dp。100dp 按weight 1 + 3 = 4 共4份分配,每份25dp,所以最终 button1 的长度为 50 + 25 = 75dp, button2 为 50 + 75 = 125dp,看一下效果:

    对的,跟我们的想法是一致的。

    那么回到前面 4 个例子中的第三个。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#AAA" />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.5"/>
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:background="#999" />
    
    </LinearLayout>
    

    由于长度都是 match_parent,我们可知,额外空间 delta = 1 match_parent - 3 match_parent = -2 match_parent。由三个区域平分-2 match_parent,所以结果就如演示那样,但是具体细节因为设置的比例问题比较难算,所以这里点一下就过了,大概思路还是一样的。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android加载器Loaders 5 个条目
  2. [运维管理] 路由器与交换机 4 个条目
  3. [移动开发] Android 网络通信框架Volley 1 个条目
  4. [Python程序设计] Django后台管理系统 2 个条目
  5. [移动开发] 从代码角度去认识 Handler 4 个条目
  6. [移动开发] Android里的ContentValues 2 个条目
  7. [C语言程序设计] 结构体基本知识 1 个条目
  8. [搜索引擎优化] 百度搜索引擎优化指南 3 个条目
  9. [PHP程序设计] PHP里的引用 5 个条目
  10. [数据结构] 图的定义 1 个条目
  11. [Python程序设计] 标准库:urllib/urllib2 14 个条目
  12. [数据库技术] SQL基础语法 1 个条目
窗口 -- [协会]