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

ConstraintLayout写法和Box写法比较

使用 ConstraintLayout 可以彻底干掉为了占位而存在的 Spacer 和嵌套的 Box,让布局层级变得非常扁平。

方案一:ConstraintLayout 写法(链式思维)

你需要先引入依赖:implementation(“androidx.constraintlayout:constraintlayout-compose:1.0.1”)

ConstraintLayout( modifier = modifier .fillMaxWidth() .height(appDimens.dev.dp192) .background(Color(0xFFE6E6E6)) .clickable(...) .padding(horizontal = appDimens.dev.dp64) ) { // 创建引用 val (contentRef, dividerRef) = createRefs() // 1. 中间的内容 Row Row( modifier = Modifier .fillMaxWidth() .constrainAs(contentRef) { top.linkTo(parent.top) bottom.linkTo(parent.bottom) // 上下都连父布局,实现垂直居中 start.linkTo(parent.start) end.linkTo(parent.end) }, verticalAlignment = Alignment.CenterVertically ) { Column(Modifier.weight(1f)) { Text(text = title, ...) if (showSubTitle && !subTitle.isNullOrEmpty()) { Text(text = subTitle, ...) } } Icon(painter = naviIcon, ...) } // 2. 底部的分割线 HorizontalDivider( modifier = Modifier .constrainAs(dividerRef) { bottom.linkTo(parent.bottom) // 约束在父布局最底部 start.linkTo(parent.start) end.linkTo(parent.end) }, thickness = appDimens.dev.dp2, color = Color(0x1A000000) ) }

方案二:如果不想引入新库(更轻量化的写法)

模拟链式布局

如果你不想为了一个 Item 引入 ConstraintLayout 库,其实用原生的 Box 配合 align 也是一种“模拟链式布局”的策略:

Box( modifier = modifier .fillMaxWidth() .height(appDimens.dev.dp192) ... ) { // 居中的内容 Row( modifier = Modifier .fillMaxWidth() .align(Alignment.Center) // 直接居中 .padding(horizontal = appDimens.dev.dp64), verticalAlignment = Alignment.CenterVertically ) { // ... Column + Icon } // 置底的分割线 HorizontalDivider( modifier = Modifier.align(Alignment.BottomCenter), // 直接置底 ... ) }

为什么方案二往往更优?

  • 性能:在 Compose 中,Box 的渲染开销比 ConstraintLayout 小。
  • 简洁:不需要手动 createRefs()和编写复杂的 linkTo 约束。
  • 结果一致:它实现了你想要的“Row 绝对居中,Divider 绝对置底”的效果,且没有 Spacer
    占位。
http://www.jsqmd.com/news/384934/

相关文章:

  • 2026主流食品X光机深度测评:技术参数与选型指南
  • 大模型API实测:关键指标与选型全解析
  • 并查集进阶
  • mysql的概述
  • 【Harmonyos】开源鸿蒙跨平台训练营DAY2:多终端工程创建运行、代码提交至AtomGit平台自建公开仓库全流程(附带出现问题及解决手段)
  • 【OI】传奇鬼王——SPFA
  • 2026恶臭在线监测设备选购大盘点:实力厂家排行及采购建议 - 品牌推荐大师1
  • 日常被豆包怼
  • 21.行为型 - 状态模式 (State Pattern)
  • 基于深度学习的浅层与深层血流速率分离技术:弥散相关光谱学的Python实现
  • Netty 快速入门一则
  • 龙虾机器人(OpenClaw)本地部署完全技术指南
  • 生产环境CSS原生瀑布流来了!最佳实践与性能优化
  • 【OI】传奇脆皮王2——SPFA
  • 力扣 hot100 【洗刷耻辱】
  • 使用 Python + 百度翻译 批量翻译 ArcGIS Shapefile 字段
  • 基于SSM的中诚房屋中介管理系统[SSM]-计算机毕业设计源码+LW文档
  • STM32F1介绍 - LI,Yi
  • 开放式厨房适合用集成灶吗?选哪个牌子好?2025选购指南出炉 - 匠言榜单
  • Springboot3+vue3软件商城共享系统 软件公司的售前售后服务系统
  • 【CVPR 2025即插即用】卷积模块篇 | GBConv轻量级门控瓶颈卷积,适合图像分类、目标检测、实例分割、语义分割、图像去噪、边缘检测、医学图像分割、遥感目标检测等CV任务通用,涨点起飞
  • 使用BEiT模型进行CIFAR-100图像分类:迁移学习实战指南
  • 2000-2024年上市公司党组织参与公司治理数据+代码
  • 2003-2024年地级市大数据采集和处理能力
  • 【前端开发之JavaScript】(三)JS基础语法中篇:运算符 / 条件 / 循环 / 数组一网打尽
  • 关于Linux系统进程
  • 使用Jenkins部署后端项目(Maven)
  • Jenkins如何导入/导出插件
  • Android Studio汉化备忘
  • agentscope怎么在对话的时候调用记忆的