我是
靠谱客的博主
虚幻大碗,最近开发中收集的这篇文章主要介绍
剖析Android 线性布局中的权重(layout_weight),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
http://bbs.itcast.cn/thread-32205-1-1.html
什么是权重(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 线性布局中的权重(layout_weight)的全部内容,希望文章能够帮你解决剖析Android 线性布局中的权重(layout_weight)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复