LinearLayout中的layout_weight属性

Android布局权重(layout_weight)的用法解析 布局权重是Android开发中常用的一种布局属性,通过设置权重值,我们可以实现子视图在父容器中按比例分配可用空间的效果。通过权重属性,我们可以根据子视图的权重比例来计算它们的相对大小,并实现各种布局需求。Android开发中,布局权重(layout_weight)是一种常用的布局属性,用于在布局中指定子视图的相对大小比例。这是因为布局权重属性是通过动态计算子视图的大小来实现的,而非固定的像素值。布局权重属性的应用场景非常广泛,特别适用于需要在布局中实现比例分配的场景。布局权重属性的使用方式。 阅读详情

LinearLayout中的layout_weight属性

 

结论:使用该属性时子一级View的layout_width要高为0dp,才能正常达到效果

 

布局LinearLayout代码

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >    
  7. <Button  
  8.       android:layout_width="fill_parent"  
  9.       android:layout_height="fill_parent"  
  10.       android:text="Button1"  
  11.       android:background="#008000"  
  12.       android:layout_weight="0"  
  13. />  
  14. <Button  
  15.       android:layout_width="fill_parent"  
  16.       android:layout_height="fill_parent"  
  17.       android:text="Button2"  
  18.       android:background="#FFFF00"  
  19.       android:layout_weight="0"  
  20. />  
  21. </LinearLayout>  

 

layout_weight属性如果没有设置,则默认为0.

 

 

按钮1:button1,绿色

按钮2:button2,黄色

 

下面以按钮1和按钮2的weight属性(layout_weight)的变化,分别进行记录。

 

 

这里测试的是垂直布局android:orientation="vertical",所以针对组件的android:layout_height属性;如果测试的水平布局,则需针对组件的android:layout_width属性。

 

 

(一) android:layout_height="fill_parent"

 

 

 button1(weight=0) button2(weight=0) button1(weight=0) button2(weight=1)


 


 

button1(weight=1) button2(weight=1)

button1占1/2,button2占1/2

button1(weight=1) button2(weight=2)

button1占2/3,button2占1/3



 


 

button1(weight=1) button2(weight=9)

button1占9/10,button2占1/10

button1(weight=1) button2(weight=30)

button1占30/31,button2占1/31

  

 

 

(二) android:layout_height="wrap_content"

 



 


 

button1(weight=0) button2(weight=0)

button1(weight=0) button2(weight=1)


 


 

button1(weight=1) button2(weight=1)

button1占1/2,button2占1/2

button1(weight=1) button2(weight=2)

button1占1/3,button2占2/3



 


 

button1(weight=1) button2(weight=9)

 

button1(weight=1) button2(weight=30)

 

  
  

 

通过以上实验可知:

(一) android:layout_height="fill_parent"

(二) android:layout_height="wrap_content"

在(一)、(二)2种情况在相同的weight属性下呈现出正好相反的情况。


android中layout_weight的理解

SDK中的解释:

Indicates how much of the extra space in the LinearLayout will be allocated to the view associated with these LayoutParams. Specify 0 if the view should not be stretched. Otherwise the extra pixels will be pro-rated among all views whose weight is greater than 0.

重点有两个

  1. layout_weight表示LinearLayout中额外空间的划分(可能扩大应用layout_weight前的大小也可能缩小)。
  2. 按比例(layout_weight大小的比例)

以下说的都以 android:orientation="horizontal" 为例

看了一下源码,虽说不太懂,但了解了下大概意思,按照自己的理解总结一下,直接写一下简化的代码吧(下面的代码是LinearLayout源文件中一部分的精简,变量名称含义可能不准确,为叙述方便暂作此解释):

复制代码
//Either expand children with weight to take up available space or
// shrink them if they extend beyond our current bounds
int delta = widthSize - mTotalLength;
if (delta != 0 && totalWeight > 0.0f) {
    float weightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight;
    for (int i = 0; i < count; ++i) {
        final View child = getVirtualChildAt(i);

        if (child == null || child.getVisibility() == View.GONE) {
            continue;
        }
        
        final LinearLayout.LayoutParams lp =
                (LinearLayout.LayoutParams) child.getLayoutParams();

        float childExtra = lp.weight;
        if (childExtra > 0) {
            int share = (int) (childExtra * delta / weightSum);
       weightSum -= childExtra;
        delta  -= share;
            int childWidth = child.getMeasuredWidth() + share;
            if (childWidth < 0) {
                childWidth = 0;
            }
        }
    }
}
复制代码

变量含义

  • widthSize:           LinearLayout的宽度
  • mTotalLength:     所有子View的宽度的和(还没用考虑layout_weight)
  • totalWeight:        所有子View的layout_weight的和
  • mWeihtSUm:   LinearLayout的android:weightSum属性

过程分析:

首先计算出额外空间(可以为负)如果额外空间不为0并且有子View的layout_weight不为0的话按layout_weight分配额外空间:

int delta = widthSize - mTotalLength;
if (delta != 0 && totalWeight > 0.0f) {
  ...
}

如果LinearLayout设置了weightSum则覆盖子View的layout_weight的和:

float weightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight;

然后遍历LinearLayout的子元素,如果不为null且Visibility不为GONE的话,取得它的LayoutParams,如果它的layout_weight大于0,根据weightSum与它的weight计算出分配给它的额外空间

复制代码
if (childExtra > 0) {
    int share = (int) (childExtra * delta / weightSum);
   weightSum -= childExtra;
   delta -= share;

    int childWidth = child.getMeasuredWidth() + share;
    if (childWidth < 0) {
        childWidth = 0;
    }
}
复制代码

网上有解释说layout_weight表示重要程度,表示划分额外空间的优先级,通过代码可以知道这种观点是错误的.layout_weight表示划分的比例,至于当View的layout_width为fill_parent时layout_weight比例相反的问题按我的理解可以作以下解释:

比如说如下XML:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#00ff00"
    android:weightSum="0"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/imageViewLoginState"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="1" >
    </Button>

    <Button
        android:id="@+id/imageViewLoginState1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="2" >
    </Button>

    <Button
        android:id="@+id/imageViewLoginState2"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="2"
        android:text="3" >
    </Button>

</LinearLayout>
复制代码

按一般理解,3个Button的比例应该为1:1:2,但实际情况是这样的:

按我的理解,系统是这样设置按钮的大小的,变量名按前面代码的意义:

假设Container即LinearLayout的宽度为PARENT_WIDTH

三个按钮的宽度都是FILL_PARENT,所以在应用layout_weight之前,三个按钮的宽度都为PARENT_WIDTH

所以额外空间:

delta = PARENT_WIDTH - 3 * PARENT_WIDTH = -2 * PARENT

因为LinearLayout没有设置android:weightSum(默认为0,设置为0就当没设置吧),所以 mWeightSum = 1 + 1 +2 =4

所以:

第一个按钮的宽度为

PARENT_WIDTH + share = PARENT_WIDTH + (layout_weight * delta / mWeightSum)

                                                = PARENT_WIDTH + (1 * (-2 * PARENT_WIDTH) /4)

                                                = 1 /2 *PARENT_WIDTH

然后更新weightSum与delta:
weightSum -= childExtra;(=3)
delta  -= share;(=-3/2 * PARENT_WIDTH)

第二个按钮的宽度为:

PARENT_WIDTH + share = PARENT_WIDTH + (layout_weight * delta / mWeightSum)

                                                = PARENT_WIDTH + (1 * (-3 / 2 * PARENT_WIDTH) /3)

                                                = 1 /2 *PARENT_WIDTH

更新weightSum与delta:

weightSum -= childExtra;(=2)
delta  -= share;(=-PARENT_WIDTH)

第三个按钮的宽度为:

PARENT_WIDTH + share = PARENT_WIDTH + (layout_weight * delta / mWeightSum)

                                                = PARENT_WIDTH + (2 * (- PARENT_WIDTH) /2)

                                                = 0

所以最终的而已就是前两个按钮平分LinearLayout,第三个按钮消失了.

大致过程是这样,但不全对,比如如果上例中LinearLayout的weightSum设置为2的话,前两个按钮的宽度为0,但当计算第三个按钮的宽度时mWeightSum = 0,但layout_weight * delta / mWeightSum无法计算,不知道系统怎么处理的,在我的能力之外了,weightSum为2时的效果图:

weightSum为3时的效果图:

SDK中说明的是,layout_weight表示额外空间怎么划分,要注意额外2字,要有额外的空间才可以将按比例将其分配给设置了layout_weight的子View,所以,如果LinearLayout设置为WRAP_CONTENT的话是没有额外的空间的,layout_weight就没有用处,所只要layout_width不设置为WRAP_CONTENT就行,也可以设置为具体的值,如果值太小的话,额外空间为负,可能压缩子控件,使其大小比XML文件中定义的小,例如:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    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>
复制代码

额外空间:

delta = 100- 3 * 60 = -80

mWeightSum = 1 + 1 +2 =4

所以:

第一个按钮的宽度为:

60+ share = 60 + (layout_weight * delta / mWeightSum)

                = 60 + (1 * (-80) /4) = 40

然后:

weightSum -= childExtra;(=3)
delta  -= share;(=-60)

第二个按钮的宽度为:

60 + share = 60 + (layout_weight * delta / mWeightSum)

                = 60 + (2 * (-60) /3)

                = 40

然后:

weightSum -= childExtra;(=2)
delta  -= share;(=-40)

 

第三个按钮的宽度为:

60 + share = 60 + (layout_weight * delta / mWeightSum)

                 = 60 + (2 * (-40) /2)

                 = 20

效果图:

以下代码也说明了layout_weight表示额外空间的分配:

复制代码
<?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="60dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="1" >
    </Button>

    <Button
        android:id="@+id/button2"
        android:layout_width="40dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="2" >
    </Button>

   
</LinearLayout>
复制代码

额外空间为100,所以Button1的宽度为60+100/2=110,Button2的宽度为40+100/2=90。


从采集到播放:RV1106+H264全链路开发避坑指南(含FFmpeg转码技巧) 本文详细解析了基于Rockchip RV1106芯片构建H.264视频从采集到播放全链路的开发实践。内容涵盖RKMPI框架设计、VI/VENC模块配置、内存泄漏排查及FFmpeg高效转码技巧,旨在帮助嵌入式开发者规避常见陷阱,实现稳定高效的低延迟视频处理流水线。 阅读详情

相关推荐

【网络】Ikuai中如何添加/更换虚拟机(图文)

Ikuai 添加虚拟机教程

qq_20623849的博客 6538

LinearLayout布局的layout_weight属性

layout_weight属性用于设置控件占布局剩余空间的比例,这样要注意,是剩余控件,而不上控件占空间的比例。 以横线布局为例,说明layout_weight属性的作用。 分三种情况: 1、所有控件layout_width=0的情况 layout_width为0时,布局的剩余空间就是全部控件,此时控件的宽度根据layout_weight值,按比例显示宽带,layout_weight值越大

zjxin000的专栏 786

保姆级教程:用NILMTK和REDD数据集,5分钟跑通你的第一个负荷分解模型

本文提供了一份详细的NILMTK和REDD数据集负荷分解模型教程,适合零基础用户快速上手。从环境准备、数据获取到模型构建和评估,全程仅需5分钟即可完成。特别适合希望快速入门非侵入式负荷分解(NILM)的开发者,涵盖数据预处理、模型训练及结果可视化等关键步骤。

weixin_30493401的博客 442

LinearLayout中的layout_weight属性详解

线性布局中的layout_weight顾名思义即为定义各个组件在整个界面中所占的权重。常用两种实现方法     1:最为简单的实现方法,当orientation为水平时垂直layout_height=''0dp",同理当orientation为垂直时,将layout_width设定为0dp,此时在一个直接父布局中layout_width中的数值越大这个组件占的界面就越大。示例代码如下:  

王呆萌的逼逼叨空间 1098

【实战解析】RTL8306MB交换芯片驱动开发中的RMII接口调试陷阱

本文深入剖析了RTL8306MB交换芯片驱动开发中RMII接口的典型调试陷阱。通过一个工业网关项目的实战案例,揭示了因硬件原理图设计疏忽导致TX_EN与CRS_DV信号线错接,从而引发网络“哑火”的根本原因。文章详细展示了使用示波器从时钟、数据到控制信号的系统性排查方法,并总结了关键的设计警示与自查清单,为嵌入式网络开发中的软硬件协同调试提供了宝贵经验。

qqq44的博客 1029

django drf 框架知识点(一)——serializer序列化器_用法全解

【django drf】序列化器:别名设置,全部参数序列化,自定义字段,只读只写,部分更新

qq_59344127的博客 1338

Android 布局学习之——LinearLayout的layout_weight属性

一直对layout_weight属性感到比较困惑,今天学习一下,来深入了解layout_weight属性和它的用法。 定义 首先,看看Android官方文档是怎么说的,毕竟人家才是权威嘛。 官方文档的意思是: layout_weight属性用于分配LinearLayout中的...

didingyun4257的博客 275

【深圳】IBM V3500存储维修 更换控制器故障

今天给大家分享的是深圳.福田区一个电商客户公司一台IBM Storwize v3500存储控制器故障从远程诊断 收集日志 分析结果的实际案例,如图所示通过存储管理口登陆进去后直接看到少了一个控制器,经过工程师分析日志后判定为该控制器损坏,接下来更换控制器配件,标准套件的控制器不带子卡和电池,所以需要把故障控制器上的子卡和电池拆下来装到新控制器上,这个电池拆还需要点技巧,接着把新的控制器插回V3500主机,等待大约十分钟后,新控制器指示灯全绿,管理界面看到节点已联机;冠峰科技-爱科技爱分享。

OuYangYuXi的博客 4579

LinearLayout layout_weight解析

LinearLayout是Android布局中经常使用的一种布局,layout_weight属性经在Linearlayout布局中常使用,至于layout_weight的宽度是怎样计算出来的,只有了解了其中的原理,才能真正了解layout_weight的宽度到底是怎么样确定的。            以下是Linearlayout的layout_weight计算原理(只针对orientatio

gradecug的专栏 506

基于Playwright和反爬虫规避技术的雪球股票讨论数据采集方案

随着量化投资和社交投资的兴起,雪球作为中国领先的投资社交平台,其用户讨论数据成为研究市场情绪的重要来源。本文将详细介绍如何使用最新的Playwright技术和反爬虫规避策略,构建一个高效、稳定的雪球股票讨论爬虫系统。本文详细介绍了基于Playwright的雪球股票讨论爬虫实现方案,涵盖了从基础配置到高级反爬虫策略的各个方面。AI驱动的反爬虫对抗更智能的请求调度算法区块链技术在数据溯源中的应用联邦学习在数据采集中的运用。

2201_76125261的博客 1010

6、深入解析Microsoft 365核心服务对比与迁移策略

本文深入解析了Microsoft 365的核心服务,包括身份和设备管理、现代设备配置体验、Exchange和SharePoint的迁移策略以及Microsoft Teams的协作功能。同时探讨了迁移过程中需要考虑的安全控制措施,为组织规划和实施云迁移项目提供了全面的指导和建议。

k8s6orchestrator的博客 107

LinearLayout的layout_weight属性的计算

layout_weight表示view分配到的额外的布局空间,可正可负。布局的时候,系统先按照view的layout_width和layout_height来布局,然后再根据layout_weight对view的位置进行调整。举例来说&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;layout xmlns:android="http://s...

ddiididi的博客 8680

STM32入门教程:WiFi通信

第四步:初始化串口 在生成的代码中,您可以找到一个名为 "USARTx_Init" 的函数,其中 "x" 是您选择的串口号。然后,我们使用 "AT+CIPSEND" 命令发送UDP数据,接收到服务器的回复,并在终端上显示收到的数据。在配置向导中,您可以选择启用USART串口功能,并根据您的硬件连接,将串口设置为与WiFi模块连接的串口。在上述代码中,我们使用了 "HAL_UART_Receive" 函数来接收串口数据,并使用 printf 来在终端上显示收到的数据。如果有任何问题,请随时向我提问。

2401_85258012的博客 1075

LinearLayout中layout_weight属性

LinearLayout中的layout_weight属性 布局LinearLayout代码 Xml代码   xml version="1.0" encoding="utf-8"?>   LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"       android:o

唯梦可寻 2104

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LinearLayout中的layout_weight属性 的使用

转载于http://stephen830.iteye.com/blog/1142956 LinearLayout中的layout_weight属性     布局LinearLayout代码 xml代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro

远古小山的专栏 571

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android开发中LinearLayout中的Layout_weight属性的理解

我现在是一个大三的学生,以下仅供刚开始学习的人参考,是我对权重理解的一个过程。如有大神查看,留下建议也是极好极好的! layout_weight这个属性,我们在LinearLayout中经常会用到。用来给控件设置权重,也就是每个控件所占用的空间大小。以前我一直这么认为的。比如 如下 <LinearLayout xmlns:android="http://schemas.android.com

任同学的博客 529

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android 布局weight,LinearLayout layout_weight 属性的4个简单演示

在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示。android并没用提供table这样的控件,虽然有TableLayout,但是它并非是我们想象中的像html里面的table那么好用,我们常用ListView实现table的效果,但是列对齐确比较麻烦,现在用Linear...

weixin_39578197的博客 442

LinearLayout的layout_weight属性

定义     首先,看看Android官方文档是怎么说的,毕竟人家才是权威嘛。                官方文档的意思是:                  layout_weight属性用于分配LinearLayout中的的额外空间(extra space)。                  如果View不想拉伸的话,layout_weight值设置为

yx19861211的博客 694

对android LinearLayout中layout_weight属性使用

对LinearLayout下的子组件,使用layout_weight的总结 前提:是LinearLayout的子组件 1、两个子组件都设置设置android:layout_width="fill_parent";    组件A设置为android:layout_weight="1";    组件B设置为android:layout_weight="2";          效

longyi_java的专栏 805

Android 布局 LinearLayout 的 layout_weight 属性

LinearLayout 这个布局应该说是Android里面layout_weight 这个

FOTT 658
上一篇: APK ROM 签名原理
下一篇: 一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发
candyguy242
博客等级 码龄17年 63粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值