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

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/5675.html

相关文章:

  • Cabot:开源免费的 PagerDuty 替代品,让系统监控更简单高效
  • K8S已经成为了Ai应用运行的平台工具
  • 架构思维:通用架构模式_系统监控的设计
  • OpenCV 的 CUDA 模块中用于将多个单通道的 GpuMat 图像合并成一个多通道的图像 函数cv::cuda::merge
  • Go语言多线程爬虫与代理IP反爬
  • 集成指南:如何采用融云 Flutter IMKit 实现双端丝滑社交体验
  • 交易流水表的分库分表设计
  • Home Assistant 米家集成:开启智能家居新体验
  • mac M2下的centos8:java和jenkins版本匹配,插件安装问题
  • # 07_Elastic Stack 从入门到实践(七)---1
  • linux小主机搭建自己的nas(三)docker安装nextcloud
  • AI日报 - 2024年05月13日
  • WinRAR技巧:巧用整理密码,简化加密流程
  • .NET 在鸿蒙系统上的适配现状
  • Python, FastAPI 与 RESTful API:构建高效 Web 服务的指南
  • Spring的异步
  • 《Python星球日记》 第58天:Transformer 与 BERT
  • find--命令基础
  • 企业级常用的 CentOS版本
  • 智能手表 MCU 任务调度图
  • 用postman的时候如何区分服务器还是自己的问题?
  • java基础-注解和反射
  • 9.0 C# 调用solidworks介绍1
  • 分词器工作流程和Ik分词器详解
  • SMT贴片加工技术解析与应用要点
  • 荣耀手机,系统MagicOS 9.0 USB配置没有音频来源后无法被adb检测到,无法真机调试的解决办法
  • vite项目使用i18n-ally未读取到文件
  • MongoDB 操作可能抛出哪些异常? 如何优雅的处理?
  • 精品可编辑PPT | 全面风险管理信息系统项目建设风控一体化标准方案
  • kotlin-协程(什么是一个协程)