Android详解——ConstraintLayout约束布局

目录

一、ConstraintLayout概述

二、ConstraintLayout属性介绍

1. 相对位置

2. 边距

3. 中心和偏移位置

中心位置

偏移位置

4. 圆形位置

5. 可见性

6. 尺寸约束

最小尺寸

WRAP_CONTENT :强制约束

MATCH_CONSTRAINT

Min和Max

百分比尺寸

比率

7. 链式布局

创建链条

链条头

链条边距

链条风格

权重链

边距

8. 虚拟辅助控件

9. 优化器


一、ConstraintLayout概述

ConstraintLayout继承自ViewGroup,允许用户以更加灵活的方式在布局中设置控件的位置和尺寸。(ConstraintLayout在API>9可用)

二、ConstraintLayout属性介绍

ConstraintLayout功能有如下几种:

  • 相对位置
  • 边距
  • 中心位置
  • 圆形位置
  • 可见性
  • 尺寸约束
  • 链式布局
  • 虚拟辅助控件
  • 优化器

记住,依赖关系中不能有循环依赖关系。

1. 相对位置

类似于RelativeLayout功能。

相对位置功能是约束布局中构建控件位置的最基本的功能之一。相对位置约束条件可以定位一个控件相对于另一个控件的位置。可以限定一个控件在水平和垂直坐标轴上的位置:

  • Horizontal 轴: left, right, start and end sides

  • Vertical 轴: top, bottom sides and text baseline

通常是指一个控件限定在另一个控件边缘的位置。

例如:

        <Button android:id="@+id/buttonA" ... />
        <Button android:id="@+id/buttonB" ...
                app:layout_constraintLeft_toRightOf="@+id/buttonA" />
        

上述代码限定按钮B在按钮A的右边。按钮B的左边和按钮A的右边在相同的位置。

相对位置约束属性有如下几个:

  • layout_constraintLeft_toLeftOf

  • layout_constraintLeft_toRightOf

  • layout_constraintRight_toLeftOf

  • layout_constraintRight_toRightOf

  • layout_constraintTop_toTopOf

  • layout_constraintTop_toBottomOf

  • layout_constraintBottom_toTopOf

  • layout_constraintBottom_toBottomOf

  • layout_constraintBaseline_toBaselineOf

  • layout_constraintStart_toEndOf

  • layout_constraintStart_toStartOf

  • layout_constraintEnd_toStartOf

  • layout_constraintEnd_toEndOf

约束对象可以通过另一个控件的属性id设置,也可以设置父布局parent

例如:

        <Button android:id="@+id/buttonB" ...
                app:layout_constraintLeft_toLeftOf="parent" />
        

2. 边距

如果控件的边距可以设置,那么边距可用于约束布局。约束两个控件之间的边距大小。通用的边距属性有如下几种:

  • android:layout_marginStart

  • android:layout_marginEnd

  • android:layout_marginLeft

  • android:layout_marginTop

  • android:layout_marginRight

  • android:layout_marginBottom

  • layout_marginBaseline

记住,边距只能>=0,采用维度设置。

3. 中心和偏移位置

中心位置

水平中心位置如下:

        <androidx.constraintlayout.widget.ConstraintLayout ...>
            <Button android:id="@+id/button" ...
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"/>
        </>
        

垂直中心位置类似top和bottom设置。

偏移位置

相对于左右水平偏移量,或者相对于上下位置的垂直偏移量。

例如:相对于水平偏移0.3

        <androidx.constraintlayout.widget.ConstraintLayout ...>
            <Button android:id="@+id/button" ...
                app:layout_constraintHorizontal_bias="0.3"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"/>
        </>
        

4. 圆形位置

可以限定一个控件中心相对于另一个控件中心的角度和距离。可以在一个圆上设置控件。可用属性如下:

  • layout_constraintCircle : 设置参考的控件id
  • layout_constraintCircleRadius : 设置控件中心相对于另一个控件中心的距离
  • layout_constraintCircleAngle : 设置相对于另一个控件的角度(角度范围:0~360)

例如:

 <Button android:id="@+id/buttonA" ... />
 <Button android:id="@+id/buttonB" ...
     app:layout_constraintCircle="@+id/buttonA"
     app:layout_constraintCircleRadius="100dp"
     app:layout_constraintCircleAngle="45" />
        

5. 可见性

6. 尺寸约束

最小尺寸

可以定义约束布局的最小和最大尺寸:

  • android:minWidth 设置布局的最小宽度

  • android:minHeight 设置布局的最小高度

  • android:maxWidth 设置布局的最大宽度

  • android:maxHeight 设置布局的最大高度

当布局被设置成WRAP_CONTENT时,这些最小和最大的维度可以被用于布局中。

控件维度大小可以通过android:layout_width and android:layout_height 来设置,有3种不同的设置方式:

  • 用具体的维度值(例如用数值123dp或者维度参考值)

  • WRAP_CONTENT,是请求计算应用控件本身的尺寸

  • 0dp, 等于"MATCH_CONSTRAINT"

前两种布局的工作方式与其他布局相似。最后一个将调整小部件的大小,使其与设置的约束相匹配。如果设置了边距,它们将在计算中被考虑在内。

重点: MATCH_PARENT 不被推荐在ConstraintLayout布局中使用. 类似的设置可以用 MATCH_CONSTRAINT,相对于left/right或者top/bottom的约束是基于父布局“parent”.

WRAP_CONTENT :强制约束

尺寸设置为WRAP_CONTENT, 在1.1版本之前,这是文字尺寸。这意味着不会限制结果尺寸。当某些情况下可用 WRAP_CONTENT限制结果尺寸,此时可以添加相应的属性设置:

  • app:layout_constrainedWidth="true|false"

  • app:layout_constrainedHeight="true|false"

layout_constrainedWidth是 Android 中 ConstraintLayout 布局管理器的一个属性,用于控制当控件的尺寸设置为 wrap_content 时,是否应受约束限制其宽度。以下是关于 layout_constrainedWidth的详细解释:

  • layout_constrainedWidth在 Android 布局中的含义

layout_constrainedWidth属性用于指定当控件的宽度设置为 wrap_content 时,是否应该受到其在 ConstraintLayout 中的水平约束限制。在 Android ConstraintLayout 的 1.1 版本之前,如果控件的宽度设置为 wrap_content,则约束对其宽度没有影响。而 layout_constrainedWidth属性的引入,使得即使在 wrap_content 模式下,控件的宽度也会受到约束限制。

  • layout_constrainedWidth属性的使用场景

当你在 ConstraintLayout 中使用 wrap_content 来设置控件的宽度,并且希望这个宽度受到其他控件或父布局的约束时,可以使用 layout_constrainedWidth属性。特别是在处理文本控件(如 TextView)时,如果文本内容可能非常长,使用 layout_constrainedWidth可以确保文本不会溢出其约束范围。

  • layout_constrainedWidth属性可以接受的值及其效果

true:控件的宽度将受到其水平约束的限制,即使控件的宽度设置为 wrap_content。
false(默认值):控件的宽度将不会受到其水平约束的限制,即使设置了约束。

  • 如何在 XML 布局文件中设置 layout_constrainedWidth属性的示例
<TextView
    android:id="@+id/myTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="这是一个很长的文本,用于测试 layout_constrainedwidth 属性"
    app:layout_constrainedWidth="true"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:ellipsize="end"
    android:maxLines="1"/>


在这个例子中,TextView 的宽度被设置为 wrap_content,但由于 app:layout_constrainedWidth="true",其宽度将受到 ConstraintLayout 的水平约束限制。如果文本内容过长,它将被截断并显示省略号。

  • 使用 layout_constrainedWidth时可能需要注意的事项或常见问题

当使用 layout_constrainedWidth时,应确保控件的其他相关约束(如开始、结束、顶部和底部的约束)已正确设置,否则可能无法达到预期的效果。如果控件的内容可能非常长,并且你希望它能够在截断时显示省略号,那么还需要设置 android:ellipsize="end" 和 android:maxLines="1"(或其他适当的行数)。
在某些情况下,如果控件的高度也受到约束,并且你希望保持宽高比,可能需要同时使用 layout_constrainedHeight 属性。

layout_constrainedHeight使用情况类似layout_constrainedWidth。

MATCH_CONSTRAINT

当尺寸被设置成MATCH_CONSTRAINT时,结果尺寸默认会获得所有的尺寸大小。有几个其他修饰属性可以设置:

  • layout_constraintWidth_min 和layout_constraintHeight_min : 设置最小尺寸

  • layout_constraintWidth_max 和layout_constraintHeight_max : 设置最大尺寸

  • layout_constraintWidth_percent 和layout_constraintHeight_percent : 设置相对于父布局尺寸的的百分比

Min和Max

这些值可以用dp设置,也可以用"wrap", 与WRAP_CONTENT设置相同。

百分比尺寸

若要使用百分比,需要有如下设置:

  • 尺寸需要设置成MATCH_CONSTRAINT (0dp)
  • 默认应该设置百分比 app:layout_constraintWidth_default="percent" 或者app:layout_constraintHeight_default="percent"
  • 属性设置layout_constraintWidth_percent 或layout_constraintHeight_percent 数值范围为0 到1

比率

可以定义一个尺寸相对于另一个尺寸的比率,应用比率需要设置至少一个尺寸的值为0dp (或MATCH_CONSTRAINT), 同时需要设置属性layout_constraintDimensionRatio的比率数值。例如:

          <Button android:layout_width="wrap_content"
                  android:layout_height="0dp"
                  app:layout_constraintDimensionRatio="1:1" />
        

上述代码意思是,宽高比率为1:1。

比率值可以表达的意思有两种

  • float数值, 代表宽 / 高比率数值

  • 比例数值,代表"宽 : 高"

如果两个尺寸都设置为MATCH_CONSTRAINT (0dp). 在这种情况下,系统会设置最大的尺寸来满足所有约束和指定的比率。若要在一个尺寸的基础上指定另一个尺寸,需要用“ W," 或 “ H”,分别限定宽和高。例如,若一个尺寸被两个约束(宽为0dp且居中)设定,那么要约束另一个尺寸需要在比率前面添加字母W (约束宽度)或 H (约束高度),例如:

          <Button android:layout_width="0dp"
                  android:layout_height="0dp"
                  app:layout_constraintDimensionRatio="H,16:9"
                  app:layout_constraintBottom_toBottomOf="parent"
                  app:layout_constraintTop_toTopOf="parent"/>
        

上述代码的意思是,按钮的宽高比为16:9,宽度为父布局宽度。

7. 链式布局

链条是一组控件在单个轴(水平或垂直)上的布局。另一个轴的约束是独立的。

创建链条

一组控件被当作链条是因为控件之间通过双向链接在一起。

链条头

链条布局被第一个元素的属性控制。

链条头是水平链条的最左边控件,或垂直链条的最上边控件。

链条边距

链条连接中边距如果被指定了,它们将被考虑在内。在分散链条时,边距将在分配空间时被计算在内。

链条风格

当在链条的第一个元素上设置属性layout_constraintHorizontal_chainStyle 或layout_constraintVertical_chainStyle时,链条将会按照指定的风格(默认风格CHAIN_SPREAD)改变.

  • CHAIN_SPREAD -- 元素将要被分散 (默认风格)

  • 权重链 -- 在 CHAIN_SPREAD 模式中,如果一些控件被指定为MATCH_CONSTRAINT, 它们将分割可获得的空间。

  • CHAIN_SPREAD_INSIDE -- 类似, 链条的结点不会被分散

  • CHAIN_PACKED -- 链条的元素被打包到一起。子控件的水平或垂直属性将会影响被打包元素的位置

权重链

链条默认分给元素相同的空间。如果一个或者更多控件用MATCH_CONSTRAINT, 它们将获得空的空间 (在它们中被相同的分割). 在元素用MATCH_CONSTRAINT后,属性layout_constraintHorizontal_weight 和layout_constraintVertical_weight 可以控制将如何分配空间。例如,如果一个链条包含两个元素用MATCH_CONSTRAINT, 第一个元素用权重数值为2 ,另一个为1,那么第一个元素占用空间是第二个的两倍。

边距

当在链条中用边距时,边距是累加的。例如,水平链条上,一个元素距离右边10dp,下一个元素距离左边5dp,那么结果边距是两个元素的和是15dp。

在计算剩余空间定位所有元素时,每个元素和它的所有边距都应该被考虑在内。剩余空间不包含边距。

8. 虚拟辅助控件

除了上述功能以外,也可以用辅助控件来帮助布局。当前有Guideline控件允许创建水平和垂直引导线去定位相对于ConstraintLayout 布局的位置.。控件通过引导线的约束来定位位置。Barrier 和Group也可以。

9. 优化器

通过app:layout_optimizationLevel使用优化器:

  • none : 不用优化器

  • standard : 默认. 只优化direct 和barrier 约束

  • direct : 优化direct 约束

  • barrier : 优化barrier 约束

  • chain : 优化chain 约束(实验性)

  • dimensions : 优化dimensions 测量(实验性),减少匹配约束元素的测量的数目

属性值是一个掩码mask值,可以设置多个优化项目,例如:app:layout_optimizationLevel="direct|barrier|chain"

推荐文章

ConstraintLayout  |  Android Developers

https://zhuanlan.zhihu.com/p/44666184

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940784.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++简明教程(文章要求学过一点C语言)(3)

一、编程工具大揭秘——IDE 当我们准备踏入 C 编程的奇妙世界时&#xff0c;首先要认识一个重要的“魔法盒子”——集成开发环境&#xff08;IDE&#xff09;。IDE 就像是一个全能的编程工作室&#xff0c;它把我们写代码所需要的各种工具都整合到了一起&#xff0c;让编程这件…

STM32-笔记5-按键点灯(中断方法)

1、复制03-流水灯项目&#xff0c;重命名06-按键点灯&#xff08;中断法&#xff09; 在\Drivers\BSP目录下创建一个文件夹exti&#xff0c;在该文件夹下&#xff0c;创建两个文件exti.c和exti.h文件&#xff0c;并且把这两个文件加载到项目中&#xff0c;打开项目工程文件 加载…

实现 WebSocket 接入文心一言

目录 什么是 WebSocket&#xff1f; 为什么需要 WebSocket&#xff1f; HTTP 的局限性 WebSocket 的优势 总结&#xff1a;HTTP 和 WebSocket 的区别 WebSocket 的劣势 WebSocket 常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 WebSocket 心跳机制 …

leetcode-80.删除有序数组的重复项II-day12

总结&#xff1a;不必过于死磕一道题目&#xff0c;二十分钟没做出来就可参考题解

RTOS之邮箱

邮箱 邮箱 (Mailbox) 服务是实时操作系统中一种常用的线程间通信机制。它提供了一种高效、低开销的消息传递方式&#xff0c;允许线程之间交换固定大小的数据。 1. 邮箱的应用场景 考虑一个简单的示例&#xff1a;线程 1 负责检测按键状态并将状态信息发送出去&#xff0c;线程…

凯酷全科技抖音电商服务的卓越践行者

在数字经济蓬勃发展的今天&#xff0c;电子商务已成为企业增长的新引擎。随着短视频平台的崛起&#xff0c;抖音作为全球领先的短视频社交平台&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也为品牌和商家提供了全新的营销渠道。厦门凯酷全科技有限公司&#xff08;以下简…

AI的进阶之路:从机器学习到深度学习的演变(三)

&#xff08;承接上集&#xff1a;AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;二&#xff09;&#xff09; 四、深度学习&#xff08;DL&#xff09;&#xff1a;机器学习的革命性突破 深度学习&#xff08;DL&#xff09;作为机器学习的一个重要分支&am…

数据集-目标检测系列 车牌检测识别 数据集 CCPD2019

车牌检测&识别 数据集 CCPD2019 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” 贵在坚持&#xff01; 数据样…

安全算法基础(一)

安全算法是算法的分支之一&#xff0c;还的依靠大量的数学基础进行计算&#xff0c;本文参照兜哥的AI安全样本对抗&#xff0c;做一个简单的算法安全概括&#xff0c;从零学习。 最新的安全算法对于我们常规的攻击样本检测&#xff0c;效果是不理想的&#xff0c;为了探究其原…

[SZ901]JTAG高速下载设置(53Mhz)

SZ901最高支持JTAG 53MHz的时钟频率&#xff0c;下载bit文件和固化程序的速度提升非常明显。 首先设置参数 1&#xff0c;将JTAG0 分频系数修改为3 2&#xff0c;设置参数&#xff0c;更新参数。&#xff08;完成&#xff09; 打开VIVADO VIVADO 正常识别FPGA&#xff0c;速…

图漾相机-ROS1_SDK_ubuntu版本编译(新版本)

文章目录 官网编译文档链接官网SDK下载链接1、下载 Camport ROS1 SDK1.下载git2、下载链接 2、准备编译工作1、安装 catkin2、配置环境变量3. 将Camport3中的linux库文件拷贝到 user/lib目录下4、修改lunch文件制定相机&#xff08;可以放在最后可以参考在线文档&#xff09;**…

openbmc hwmon与sensor监控

1.说明 参考文档: https://github.com/openbmc/entity-manager/blob/master/docs/entity_manager_dbus_api.mdhttps://github.com/openbmc/entity-manager/blob/master/docs/my_first_sensors.md 1.1 简单介绍 注意: 本节是快速浏览整个sensor框架&#xff0c;了解大致open…

Java --- 多线程

目录 前言&#xff1a; 一.线程的创建&#xff1a; 1.通过继承 Thread 类来创建线程&#xff1a; 2.通过Runnable接口创建线程&#xff1a; 3.通过Java8引入的lambda语法&#xff1a; 线程的优先级&#xff1a; 二.线程的生命周期&#xff1a; 三. 中断线程&#xff1a…

使用 acme.sh 申请域名 SSL/TLS 证书完整指南

使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL&#xff1f;前置要求安装过程 步骤一&#xff1a;安装 acme.sh步骤二&#xff1a;配置 ZeroSSL 证书申请 方法一&#xff1a;手动 DNS 验证&#xff08;推荐新手使用&#xff09;方法二&#xf…

Flutter组件————Scaffold

Scaffold Scaffold 是一个基础的可视化界面结构组件&#xff0c;它实现了基本的Material Design布局结构。使用 Scaffold 可以快速地搭建起包含应用栏&#xff08;AppBar&#xff09;、内容区域&#xff08;body&#xff09;、抽屉菜单&#xff08;Drawer&#xff09;、底部导…

YOLOv8目标检测(七)_AB压力测试

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…

SpringBoot的创建方式

SpringBoot创建的五种方式 1.通过Springboot官网链接下载 注意SpringBoot项目的封装方式默认为Jar 需要查看一下&#xff0c;自己的Maven版本是否正确 创建成功 2.通过 aliyun官网链接下载 修改服务路径为阿里云链接 创建成功 3.通过Springboot官网下载 点击&#xff0c;拉到最…

批处理理解

初识批处理 如何批处理&#xff1a; 命名&#xff1a;.bat 方法&#xff1a;创建一个记事本文件&#xff0c;然后将其扩展改为.bat 批处理作用&#xff1a;自上而下成批处理每一条DOS命令&#xff0c;直到执行到最后一条。运行环境&#xff1a;当然是我们cmd了 回归我学过的…

概率论得学习和整理29: 用EXCEL 描述二项分布

目录 1 关于二项分布的基本内容 2 二项分布的概率 2.1 核心要素 2.2 成功K次的概率&#xff0c;二项分布公式 2.3 期望和方差 2.4 具体试验 2.5 概率质量函数pmf 和cdf 3 二项分布的pmf图的改进 3.1 改进折线图 3.2 如何生成这种竖线图呢 4 不同的二项分布 4.1 p0.…

全志H618 Android12修改doucmentsui功能菜单项

背景: 由于当前的文件管理器在我们的产品定义当中,某些界面有改动的需求,所以需要在Android12 rom中进行定制以符合当前产品定义。 需求: 在进入File文件管理器后,查看...功能菜单时,有不需要的功能菜单,需要隐藏,如:新建窗口、不显示的文件夹、故代码分析以及客制…