全国咨询/投诉热线:400-618-9090

首页技术文章正文

Android+物联网培训实战教程之权重

更新时间:2017-05-29 来源:黑马程序员Android+物联网培训学院 浏览量:

剖析Android 线性布局中的权重(layout_weight)

什么是权重(layout_weight

通俗地讲,权重(layout_weight就是对线性布局指定方向(水平或垂直)上剩余空间分配的一个规则。

案例分析

为了便于大家更好地理解权重(layout_weight),接下来,通过几个案例来分析如何使用权重(layout_weight)对线性布局中水平方向的剩余空间进行分配。
 
注:以下案例中的测试手机分辨率为480*320,屏幕像素密度为mdpi,即1dp = 1px;

案例一

<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"
    tools:context=".MainActivity" >
   <!--内部控件水平排列-->
   <TextView
        android:layout_width="0dp"
        android:layout_height="120dp"
        android:layout_weight="3"
        android:background="@android:color/black"/>
    <TextView
        android:layout_width="0dp"
        android:layout_height="120dp"
        android:layout_weight="1"
        android:background="@android:color/holo_green_dark"/>
</LinearLayout>
当前布局效果如图1-1所示。
图1-1            布局效果
从图1-1可以看出,黑色部分的宽度是240像素,绿色部分的宽度是80像素,这两部分所占区域宽度的计算方式如下所示:
当前屏幕横屏宽度:320dp
第一个子控件未分配权重前所占宽度:0dp
第二个子控件未分配权重前所占宽度:0dp
当前屏幕剩余空间总数:320dp-0dp-0dp = 320dp,将当前320dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

第一个子控件分配权重后宽度:0dp+((320dp-0dp-0dp)*3)/4 = 240dp
第二个子控件分配权重后宽度:0dp+(320dp-0dp-0dp)/4 = 80dp

案例二

<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"
    tools:context=".MainActivity" >
   <TextView
        android:layout_width="60dp"
        android:layout_height="120dp"
        android:layout_weight="3"
        android:background="@android:color/black"/>
    <TextView
        android:layout_width="60dp"
        android:layout_height="120dp"
        android:layout_weight="1"
        android:background="@android:color/holo_green_dark"/>
</LinearLayout>
当前布局效果如图1-2所示。
图1-2  布局效果
从图1-2可以看出,黑色部分的宽度是210像素,绿色部分的宽度是110像素,这两部分所占区域宽度的计算方式如下所示:
当前屏幕横屏宽度:320dp
第一个子控件未分配权重前所占宽度:60dp
第二个子控件未分配权重前所占宽度:60dp
当前屏幕剩余空间总数:320dp-60dp-60dp = 200dp,将当前200dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

第一个子控件分配权重后宽度:60dp+((320dp-60dp-60dp)*3)/4 = 210dp
第二个子控件分配权重后宽度:60dp+(320dp-60dp-60dp)/4 = 110dp

案例三

<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"
    tools:context=".MainActivity" >
   <TextView
        android:layout_width="260dp"
        android:layout_height="120dp"
        android:layout_weight="3"
        android:background="@android:color/black"/>
    <TextView
        android:layout_width="260dp"
        android:layout_height="120dp"
        android:layout_weight="1"
        android:background="@android:color/holo_green_dark"/>
</LinearLayout>
当前布局效果如图1-3所示。
图1-3            布局效果
从图1-3可以看出,黑色部分的宽度是110像素,绿色部分的宽度是210像素,这两部分所占区域宽度的计算方式如下所示:
当前屏幕横屏宽度:320dp
第一个子控件未分配权重前所占宽度:260dp
第二个子控件未分配权重前所占宽度:260dp
当前屏幕剩余空间总数:320dp-260dp-260dp = -200dp,将当前-200dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

第一个子控件分配权重后宽度:260dp+((320dp-260dp-260dp)*3)/4 = 110dp
第二个子控件分配权重后宽度:260dp+(320dp-260dp-260dp)/4 = 210dp

案例四

<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"
    tools:context=".MainActivity" >
   <TextView
        android:layout_width="fill_parent"
        android:layout_height="120dp"
        android:layout_weight="3"
        android:background="@android:color/black"/>
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="120dp"
        android:layout_weight="1"
        android:background="@android:color/holo_green_dark"/>
</LinearLayout>
当前布局效果如图1-4所示。
图1-4  布局效果
从图1-4可以看出,黑色部分的宽度是80像素,绿色部分的宽度是240像素,这两部分所占区域宽度的计算方式如下所示:
当前屏幕横屏宽度:320dp
第一个子控件未分配权重前所占宽度:fill_parent 即为充满横屏
第二个子控件未分配权重前所占宽度:fill_parent 即为充满横屏
当前屏幕剩余空间总数:320dp-320dp-320dp = -320dp,将当前-320dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

第一个子控件分配权重后宽度:320dp+((320dp-320dp-320dp)*3)/4 = 80dp
第二个子控件分配权重后宽度:320dp+(320dp-320dp-320dp)/4 = 240dp

案例总结

从上述案例可以看出如果对线性布局中的控件设置了权重layout_weight),那么控件占用的空间大小是可以计算出来的,计算公式如下:
线性布局中子控件最终占用宽度 = 原有宽度+剩余空间分配量
例如,在水平方向上的线性布局LinearLayout控件L中,包含两个水平占用空间的控件A,B其中
L控件:L控件宽度layout_width = width_l
A控件:A控件宽度layout_width = width_a   A控件权重layout_weight = weight_a
B控件:B控件宽度layout_width = width_b   B控件权重layout_weight = weight_b
L中子控件最终占用宽度 = 原有宽度(width_a)+剩余空间分配量
A所占宽度 = width_a + (width_l-width_a-width_b)*weight_a/(weight_a+weight_b)
B所占宽度 = width_b + (width_l-width_a-width_b)*weight_b/(weight_a+weight_b)
由此可以推断,当使用权layout_weight)时,会遇到下列两种情况:
情况1:当L中内部子控件(A,B)的宽度之和大于L的总宽度时,即(width_l-width_a-width_b)<0时,weight_a/(weight_a+weight_b)比例的值越大,当前控件所占空间越小。
情况2:当L中内部子控件(A,B)的宽度之和小于L的总宽度时,即(width_l-width_a-width_b)>0时,weight_a/(weight_a+weight_b)比例的值越大,当前控件所占空间越大。



本文版权归黑马程序员Android培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:黑马程序员Android+物联网培训学院
首发:http://android.itheima.com


javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

http://www.itcast.cn/subject/uizly/index.shtml?seozxuids

14天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

20天免费试学

基础班入门课程限时免费

申请试学名额

8天免费试学

基础班入门课程限时免费

申请试学名额

20天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

0天免费试学

基础班入门课程限时免费

申请试学名额

12天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

10天免费试学

基础班入门课程限时免费

申请试学名额
在线咨询 我要报名