当前位置: 首页 > ds >正文

Android中ConstraintLayout约束布局使用详解

Android中ConstraintLayout约束布局使用详解

ConstraintLayout是Android中最强大灵活的布局之一,它通过约束关系来定位和排列视图,通过纯XML实现复杂的布局效果,而无需多层嵌套,这大大提高了布局性能。

一、基本约束定位

1. 相对父容器定位

<Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮"app:layout_constraintStart_toStartOf="parent"  <!-- 左侧对齐父容器左侧 -->app:layout_constraintTop_toTopOf="parent"/>   <!-- 顶部对齐父容器顶部 -->

2. 相对其他视图定位

<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮1"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮2"app:layout_constraintStart_toEndOf="@id/button1"  <!-- 左侧在button1右侧 -->app:layout_constraintTop_toTopOf="@id/button1"/> <!-- 顶部与button1对齐 -->

二、居中定位

1. 水平居中

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="水平居中"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"/>

2. 垂直居中

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="垂直居中"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"/>

3. 完全居中

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="完全居中"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"/>

三、偏移定位(Bias)

当视图在两个方向上都有约束时,可以使用bias属性设置偏移比例(0.0-1.0)

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="偏移按钮"app:layout_constraintHorizontal_bias="0.3"  <!-- 水平方向30%位置 -->app:layout_constraintVertical_bias="0.7"    <!-- 垂直方向70%位置 -->app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"/>

四、尺寸控制

1. 匹配约束(类似match_parent但更灵活)

<Buttonandroid:layout_width="0dp"  <!-- 相当于match_constraint -->android:layout_height="wrap_content"android:text="匹配约束宽度"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"/>

2. 比例尺寸

<ImageViewandroid:layout_width="0dp"android:layout_height="0dp"app:layout_constraintDimensionRatio="H,16:9"  <!-- 高:=16:9 -->app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"/>

3. 最大最小尺寸

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="有限制按钮"app:layout_constraintWidth_min="100dp"app:layout_constraintWidth_max="200dp"/>

五、链(Chains)布局

链是一组通过双向连接约束关联在一起的视图

1. 创建水平链

<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮1"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toStartOf="@id/button2"app:layout_constraintHorizontal_chainStyle="spread"/><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮2"app:layout_constraintStart_toEndOf="@id/button1"app:layout_constraintEnd_toStartOf="@id/button3"/><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮3"app:layout_constraintStart_toEndOf="@id/button2"app:layout_constraintEnd_toEndOf="parent"/>

2. 链式样式

  • spread:均匀分布(默认)
  • spread_inside:两端不留空间
  • packed:所有视图打包在一起

六、辅助工具类

1. Guideline(参考线)

<androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintGuide_percent="0.3"/>  <!-- 30%位置 --><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="对齐参考线"app:layout_constraintStart_toStartOf="@id/guideline"/>

2. Barrier(屏障)

<androidx.constraintlayout.widget.Barrierandroid:id="@+id/barrier"android:layout_width="wrap_content"android:layout_height="wrap_content"app:barrierDirection="end"app:constraint_referenced_ids="button1,button2"/><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮3"app:layout_constraintStart_toEndOf="@id/barrier"/>

3. Group(视图组)

<androidx.constraintlayout.widget.Groupandroid:id="@+id/group"android:layout_width="wrap_content"android:layout_height="wrap_content"app:constraint_referenced_ids="button1,button2,button3"/><!-- 可以通过代码控制整个组的可见性 -->
group.setVisibility(View.VISIBLE);

七、实际应用示例

登录表单布局

<EditTextandroid:id="@+id/username"android:layout_width="0dp"android:layout_height="wrap_content"android:hint="用户名"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintWidth_percent="0.8"android:layout_marginTop="32dp"/><EditTextandroid:id="@+id/password"android:layout_width="0dp"android:layout_height="wrap_content"android:hint="密码"android:inputType="textPassword"app:layout_constraintStart_toStartOf="@id/username"app:layout_constraintEnd_toEndOf="@id/username"app:layout_constraintTop_toBottomOf="@id/username"app:layout_constraintWidth_percent="0.8"android:layout_marginTop="16dp"/><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:text="登录"app:layout_constraintStart_toStartOf="@id/password"app:layout_constraintEnd_toEndOf="@id/password"app:layout_constraintTop_toBottomOf="@id/password"android:layout_marginTop="24dp"/>
http://www.xdnf.cn/news/5890.html

相关文章:

  • 虚拟主机与独立服务器:哪个更好?
  • MFCC特征提取及Griffin-Lim算法(librosa实现)
  • 使用 AddressSanitizer 检测栈内存越界错误
  • 如何配置本机host文件
  • Power BI 实操案例,将度量值转化为切片器(动态切换分析指标)
  • 在Text-to-SQL任务中应用过程奖励模型
  • 【Python】Python常用数据类型详解
  • cursor 如何在项目内自动创建规则
  • uniapp-商城-54-后台 新增商品(页面布局)
  • Linux异步通知机制详解
  • TongWeb7.0常用-D参数说明
  • python标准库--sys - 系统相关功能在算法比赛的应用
  • 无人机信号线被电磁干扰导致停机
  • mplayer使用详解
  • JDK 安装与配置
  • 实数完备性定理互证2
  • 【蓝桥杯嵌入式】【模块】一、系统初始化
  • okhttp3.Interceptor简介-笔记
  • 【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、1路光纤数据收发处理平台
  • [Java][Leetcode simple] 189. 轮转数组
  • 前端-高德地图选点带搜索功能
  • hashicorp raft源码分析(一、项目介绍与Leder选举实现)
  • 猫咪如厕检测与分类识别系统系列~进阶【三】网页端算法启动架构及数据库实现
  • YOLOv5推理代码解析
  • 医院陪护服务革新:透明化监护与即时救济机制构建
  • 如何优雅的使用CMake中的FindPkgConfig模块
  • 验证回文串1
  • Linux sysvinit 系统启动
  • 【三】 空域滤波的基础与空域中的低通滤波器(2)【830数字图像处理】
  • 解构赋值