ConstraintLayout使用指南

news2024/11/24 13:01:23

ConstraintLayout

ConstraintLayout 可让您使用扁平视图层次结构(无嵌套视图组)创建复杂的大型布局。它与 RelativeLayout 相似,其中所有的视图均根据同级视图与父布局之间的关系进行布局,但其灵活性要高于 RelativeLayout,并且更易于与 Android Studio 的布局编辑器配合使用。

ConstraintLayout 的所有功能均可直接通过布局编辑器的可视化工具来使用,因为布局 API 和布局编辑器是专为彼此构建的。 因此,您完全可以使用 ConstraintLayout 通过拖放的形式(而非修改 XML)来构建布局。

基础

ConstraintLayout 中定义某个视图的位置,您必须为该视图添加至少一个水平约束条件和一个垂直约束条件。

如果视图没有任何约束条件,则会在位置 [0,0](左上角)处进行绘制。

相对定位

相对定位和RelativeLayout的功能类似,并且更加简单理解和提供更多属性。

简单的演示

先了解一下各个控件的方向的名称

请添加图片描述

实现控件2在演示控件的左边,控件2在演示控件的下边

在这里插入图片描述

看xml的代码其实只有这两句

app:layout_constraintStart_toStartOf="@+id/one"
app:layout_constraintTop_toBottomOf="@+id/one"

简化一下就是

Start_toStartOf=one

Top_toBottomOf=one

翻译一下就是

(我)的左边在(目标)的左边=目标

(我)的上面在(目标)的下面=目标

目标可以是某个控件也可以是父容器

app:layout_constraintBottom_toTopOf="@+id/textView3"
app:layout_constraintEnd_toEndOf="parent"

填parent就是父容器

其实Start_toStartOf和Left_toLeftOf在中国是没有区别的。

Android推荐的使用Start_toStartOf当在从右往左读的国家的时候,就会变成Right_toRightOf

当控件被android:visibility=“gone”,约束关系是不变的和RelativeLayout中gone控件是不一样的。

RelativeLayout 被visibility=“gone”,控件会回到0,0位置,但是控件的关系没有变。
在这里插入图片描述

ConstraintLayout则不会,它只会把控件的宽和高设置为0,但是位置和约束关系还是不变的,

在这里插入图片描述

全部属性

看会了上面的属性下面的就随便用了

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_constraintStart_toEndOf
layout_constraintStart_toStartOf
layout_constraintEnd_toStartOf
layout_constraintEnd_toEndOf

文本对齐

layout_constraintBaseline_toBaselineOf
layout_constraintBaseline_toTopOf
layout_constraintBaseline_toBottomOf

Baseline_toBaselineOf

翻译: (我)文本线和(目标)文本线对齐

请添加图片描述

边距

Margin

在这里插入图片描述

这个边距是允许填负数的

请添加图片描述

全部属性

android:layout_marginStart
android:layout_marginEnd
android:layout_marginLeft
android:layout_marginTop
android:layout_marginRight
android:layout_marginBottom
layout_marginBaseline

goneMargin

只有约束的控件可见性被设置为gone的时候,margin才会生效

在这里插入图片描述

这个值依然可以填写负数,但是源代码是不允许的

请添加图片描述

居中和偏移

居中

在RelativeLayout中,把控件放在布局中间的方法是把layout_centerInParent设为true,而在ConstraintLayout中的写法是:

在这里插入图片描述

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"

偏移

一旦上下或者左右位置可以确定,就可以进行偏移了

在这里插入图片描述

app:layout_constraintHorizontal_bias="0.69"
app:layout_constraintVertical_bias="0.5"

角度定位

当使用角度定位,相对定位就会失效,并无法一起使用。
请添加图片描述

当目标控件被gone,当前控件就会到目标控件的位置

在这里插入图片描述

尺寸约束

0dp (MATCH_CONSTRAINT)

官方不推荐在ConstraintLayout中使用match_parent,可以设置 0dp (MATCH_CONSTRAINT), 配合约束代替match_parent。

0dp就是能有大的地方就占多大的地方,看下图的第一个控件的约束关系是结束要在第二个控件开始,所以就会先保证控件2绘制出来,然后剩余的空间给控件1。

请添加图片描述

如果是match_parent就直接父容器最大了。match_parent在部分时候时长不生效。

请添加图片描述

宽高比

app:layout_constraintDimensionRatio="H,2:3"指的是 高:宽=2:3
app:layout_constraintDimensionRatio="W,2:3"指的是 宽:高=2:3

<Button
    android:id="@+id/two"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:text="2"
    app:layout_constraintDimensionRatio="H,1:10"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

请添加图片描述

wrap_content

当控件的高度或宽度为wrap_content时,可以使用下列属性来控制最大、最小的高度或宽度:
android:minWidth 最小的宽度
android:minHeight 最小的高度
android:maxWidth 最大的宽度
android:maxHeight 最大的高度

使用指定的尺寸(不推荐)

就是填具体数值如:20dp

辅助功能

Guideline

使用辅助线把这个控件放在30%的宽高位置

在这里插入图片描述

Guideline不会显示在UI中

<Button
    android:id="@+id/button7"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintStart_toStartOf="@+id/guideline3"
    app:layout_constraintTop_toTopOf="@+id/guideline4" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.3" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.3" />

Group

可以把指定的控件放到一个组做一些操作,比如一组隐藏控件。

而且Group可以加入多个Group,一起控制

在这里插入图片描述

Barrier

假设有3个控件ABC,C在AB的右边,但是AB的宽是不固定的,这个时候C无论约束在A的右边或者B的右边都不对。当出现这种情况可以用Barrier来解决。Barrier可以在多个控件的一侧建立一个屏障,如下所示:

在这里插入图片描述

Layer

Layer本质是一个View,可以给多个视图设置共同的背景或者动画。

大部分都是做item的背景和动画,省一个布局嵌套。

<androidx.constraintlayout.helper.widget.Layer
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_light"
    app:constraint_referenced_ids="button8,button9"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

<Button
    android:id="@+id/button8"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/button9"
    android:layout_width="500dp"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button8" />

请添加图片描述

注意点:

ConstraintLayout是无嵌套视图,大部分情况一层就完成UI编写。

梳理好级别关系,同级不互相约束,尽量把约束关系限定在上下级控件之间,方便以后的改动和管理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【读书笔记】《软件工程导论》

目录 一、软件工程概述 二、启动阶段 三、计划阶段 四、实施阶段 五、收尾阶段 一、软件工程概述 软件危机&#xff1a;在计算机软件的开发和维护过程中遇到的一系列严重问题。 软件危机的产生与自身的特点有关&#xff0c;还与软件开发、管理的方法不正确有关。 软件危…

ELK 多用户登录

先搭建ELK集群环境 请移步至&#xff1a;FilebeatELK 搭建日志收集平台 ES开启TLS加密通信与身份认证 进入ES集群任意一台安装目录&#xff0c;生成ca证书 这里最好使用ES启动账号操作&#xff0c;证书生成过程中一直回车到完成&#xff0c;不要去输入密码。 # 生成CA证书 bi…

UNIX网络编程卷一 学习笔记 第二十一章 多播

单播地址标识单个IP接口&#xff0c;广播地址标识某个子网的所有IP接口&#xff0c;而多播地址标识一组IP接口。单播和广播是寻址方案的两个极端&#xff08;要么单个要么全部&#xff09;&#xff0c;多播则意在两者之间提供一种折衷方案。多播数据报只应由对它感兴趣的接口接…

【软考网络管理员】2023年软考网管初级常见知识考点(8)-广域网技术

涉及知识点 广域网交换方式&#xff0c;广域网流量控制&#xff0c;广域网链路层协议&#xff0c;广域网传输标准&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&a…

MATLAB——Matlab R2018b软件安装教程

Matlab R2018b软件安装教程 1.选中【Matlab R2018b】压缩包&#xff0c;鼠标右击选择【解压到Matlab R2018b】。 2.双击打开【Matlab R2018b】文件夹。 3.双击打开【R2018b_win64】文件夹。 4.选中【setup】可执行文件&#xff0c;鼠标右击选择【以管理员身份运行】。 5.选择【…

AQS源码分析——以ReentrantLock为例

AQS自身属性&#xff1a; private transient volatile Node head; private transient volatile Node tail; private volatile int state; Node属性&#xff1a; // 共享 static final Node SHARED new Node(); // 独占 static final Node EXCLUSIVE null; // 线程被…

360手机黑科技“位置穿越”功能修复 360手机位置穿越不能用了 360手机刷机

360手机黑科技“位置穿越”功能修复 360手机位置穿越不能用了 360手机刷机 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360刷机包360手机刷机&#xff1a;360rom.github.io 【前言】 360手机&#xff0c;内置的黑科技“位置穿越”&#xff0c;引用高德地图&#xff…

基于NSGA-II算法的多目标多旅行商问题建模求解

基于NSGA-II算法的多目标多旅行商问题建模求解 1引言2多目标多旅行商问题3多目标遗传算法NSGA-II3.1 编码3.2选择&#xff08;锦标赛选择&#xff09;3.3 交叉&#xff08;顺序交叉&#xff09;3.4 变异3.5快速非支配排序3.5.1符号说明3.5.2快速非支配排序[^7][^6]3.5.3快速非支…

C语言王国探险记之变量的前世今生

王国探险记系列 文章目录&#xff08;2&#xff09; 前言 一、变量是什么&#xff1f; 二、变量如何定义&#xff1f; 注意&#xff1a;当你赋值小数的时候&#xff0c;编译器会自然认为你是一个double类型的&#xff0c;所以你在使用float类型的时候要在小数后面加个f&…

Go语言基础:基本数据类型

一、整型 1. 整型分类 整型分为以下两个大类&#xff1a; &#xff08;1&#xff09;按长度分为&#xff1a;int8、int16、int32、int64 &#xff08;2&#xff09;对应的无符号整型&#xff1a;uint8、uint16、uint32、uint64 其中&#xff0c;uint8就是我们熟知的byte型&…

关于spring mvc 的ViewResolver的问题

今天在一个项目使用springboot的spring mvc的时候遇到了一个问题&#xff1a;在controller中使用返回字符串redirect:/xxxx/xxx进行重定向失败&#xff0c;出现了无法解析redirect:/xxxx/xxx。 找了半天才发现视图解析器ViewResolver中没有添加InternalResourceViewResolver 项…

微服务(总): eureka与nacos的区别及心跳配置修改

目录 简介: 1. nacos与eureka的区别 1.0 功能方面 1.1 连接方式不同 1.2 服务异常后多久剔除 1.2.1 eureka介绍: 1.2.2 nacos介绍: 1.3 操作的方式 1.3.1 nacos 专门的可视化界面(如图) 1.3.2 eureka 比较简约(如图) 1.4 保护机制介绍 1.4.1 CAP原则简介:(取自百…

Redis入门(5)-set

Redis中set的元素具有无序性与不可重复性 1.sadd key member[member] 添加元素&#xff0c;若元素存在返回0若不存在则添加 sadd DB mysql oracle sadd DB mysql sadd DB db22.smembers key 查看set中所有元素 smembers DB3.sismember key member 判断元素在set中是否存…

好书精读】网络是怎样连接的 —— 信号在网线和集线器中传输

&#xff08; 该图由我使用 AI 绘制 &#xff09; 目录 每个包都是独立传输的 防止网线中的信号衰减很重要 “双绞”是为了抑制噪声 集线器将信号发往所有线路 每个包都是独立传输的 从计算机发送出来的网络包会通过集线器 、 路由器等设备被转发 &#xff0c; 最 终到达…

智安网络|弹性网络与网络安全:保卫数字世界的关键联结

随着数字化时代的来临&#xff0c;弹性网络和网络安全成为了信息交流和数据传输的关键基础。弹性网络为用户提供了高度可靠、灵活可扩展和强大的网络基础设施&#xff0c;而网络安全则旨在保护这个网络生态系统不受威胁。 弹性网络的定义与重要性 弹性网络的重要性&#xff1a…

【Leetcode60天带刷】day36——56. 合并区间,738.单调递增的数字

​ 题目&#xff1a; 56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a;…

python基础学习9【MinMaxScale()、StandScale()、DecimalScale、transformer】

标准化数据【离差标准化数据、标准差标准化数据、小数定标标准化数据】 离差标准化数据&#xff1a; 数据的整体分布情况并不会随离差标准化而发生改变&#xff0c;原先取值较大的数据&#xff0c;在做完离差标准化后的值依旧较大&#xff1b; 对原始数据的一种线性变换&…

模拟电路系列分享-运放的关键参数

目录 概要 整体架构流程 技术名词解释 1.输入失调电压 2.输入失调电压对电路的影响 3.数据手册中关于失调电压的描述 技术细节 小结&#xff1a; 概要 提示&#xff1a;这里可以添加技术概要 实际运放与理想运放具有很多差别。理想运放就像一个十全十美的人&#xff0…

C语言王国探险记之数据类型

王国探险记系列 文章目录&#xff08;1&#xff09; 目录 1&#xff0c;写程序和数据类型有啥关系&#xff1f; 2.C语言里面都有啥数据类型&#xff1f; 1&#xff0c;数据类型的介绍 2&#xff0c;为什么浮点数描述的是小数 3&#xff0c;区分程序中的数字那些是整型&am…

02_深入浅出vite(二)--vue3全家桶+ts构建后管系统

安装基础包 npm create vitelatest # 这里选择的是VueTypescript的组合 cd vue-admin npm install# 先安装基础包 npm install vue-router4 npm i pinia npm i axios npm install sass --save-dev npm install element-plus --save npm install element-plus/icons-vue npm in…