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

Compose笔记(三十四)--LayoutModifier

         这一节主要了解一下Compose中的LayoutModifier,它是Compose中一个核心接口,用于通过自定义测量和布局逻辑动态调整组件的尺寸、位置及样式。它通过实现 Modifier.layout 扩展函数,允许开发者在修饰符链中插入自定义布局行为,从而灵活控制子组件的渲染方式。简单总结:

API
1. Modifier.layout扩展函数
将自定义布局逻辑注入到修饰符链中,覆盖默认的测量和放置行为。

fun Modifier.layout(measureBlock: MeasureScope.(measurable: Measurable,constraints: Constraints) -> MeasureResult
):Modifier

参数:
measurable:待测量的子组件,提供measure(constraints)方法。
constraints:父组件传递的约束条件(如最大/最小宽度、高度)。
返回值:MeasureResult,包含最终布局的宽度、高度及子组件位置。

2. MeasureScope接口
提供测量过程中的上下文信息,包括约束条件和布局计算工具。 

layout(width: Int, height: Int, placementBlock: (Placeable) -> Unit):定义最终布局尺寸并放置子组件。
Placeable.placeRelative(x: Int, y: Int):支持 RTL(从右到左)布局的子组件放置方法。

3. Constraints 类
描述父组件对子组件的尺寸约束,包含以下属性:
minWidth/maxWidth:最小/最大宽度(像素单位)。
minHeight/maxHeight:最小/最大高度(像素单位)。

场景:
1.动态尺寸调整,根据父组件约束或业务逻辑修改子组件的宽度/高度。
2.自定义位置控制,手动偏移子组件或实现特殊对齐方式。
3.响应式布局适配,根据屏幕尺寸或父组件约束切换布局策略。

栗子:

import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.LayoutModifier
import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.MeasureResult
import androidx.compose.ui.layout.MeasureScope
import kotlin.math.roundToIntdata class AspectRatioModifier(val ratio: Float) : LayoutModifier {override fun MeasureScope.measure(measurable: Measurable,constraints: androidx.compose.ui.unit.Constraints): MeasureResult {val placeable = measurable.measure(constraints)val width = placeable.widthval height = (width / ratio).roundToInt()return layout(width, height) {placeable.place(0, (height - placeable.height) / 2)}}
}fun Modifier.aspectRatio(ratio: Float): Modifier = this.then(AspectRatioModifier(ratio))

调用:

Image(painter = painterResource(R.drawable.ic_points),contentDescription = null,modifier = Modifier.aspectRatio(16f/9f) )
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.LayoutModifier
import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.MeasureResult
import androidx.compose.ui.layout.MeasureScope
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dpdata class MaxSizeModifier(val maxWidth: Dp, val maxHeight: Dp) : LayoutModifier {override fun MeasureScope.measure(measurable: Measurable,constraints: Constraints): MeasureResult {val constrainedWidth = minOf(constraints.maxWidth, maxWidth.roundToPx())val constrainedHeight = minOf(constraints.maxHeight, maxHeight.roundToPx())val newConstraints = Constraints(maxWidth = constrainedWidth,maxHeight = constrainedHeight)val placeable = measurable.measure(newConstraints)return layout(placeable.width, placeable.height) {val x = (constrainedWidth - placeable.width) / 2val y = (constrainedHeight - placeable.height) / 2placeable.place(x, y)}}
}fun Modifier.maxSize(maxWidth: Dp, maxHeight: Dp): Modifier =this.then(MaxSizeModifier(maxWidth, maxHeight))

调用:

 Box(modifier = Modifier.fillMaxSize().background(Color.LightGray)) {Text(text = "Hello World",modifier = Modifier.maxSize(200.dp, 100.dp) .background(Color.Blue))}

注意:
1 避免重复测量:在measureBlock中缓存测量结果,减少不必要的计算。
2 合理使用约束条件:通过 constraints.constrainWidth()或constraints.constrainHeight()确保尺寸合法。
3 优先使用内置修饰符:如padding、size等,避免重复造轮子。

http://www.lryc.cn/news/586445.html

相关文章:

  • Raft-领导者选举
  • 基于YOLO11的垃圾分类AI模型训练实战
  • C语言课程设计--电子万年历
  • 第十八天,7月12日,八股
  • Agent 设计模式
  • 卫星通信终端天线的5种对星模式之二:DVB跟踪
  • Mamba架构的模型 (内容由deepseek辅助汇总)
  • 关于赛灵思的petalinux zynqmp.dtsi文件的理解
  • C++ Primer(第5版)- Chapter 7. Classes -001
  • Web学习笔记3
  • Windows环境下JS计时器精度差异揭秘
  • Qt:QCustomPlot类介绍
  • LangChain极速入门:用Python构建AI应用的新范式
  • zcbus使用数据抽取相当数据量实况
  • Scrapy爬虫中间件核心技术解析:定制化爬虫的神经中枢
  • CCS-MSPM0G3507-2-基础篇-定时器中断
  • 69 局部变量的空间分配
  • 通俗范畴论13 鸡与蛋的故事番外篇
  • C++类模板继承部分知识及测试代码
  • Golang操作MySQL json字段优雅写法
  • Hap包引用的Hsp报签名错误怎么解决
  • 【数据分析】03 - Matplotlib
  • LangChain 内存(Memory)
  • Java 大视界 -- Java 大数据机器学习模型在电商用户复购行为预测与客户关系维护中的应用(343)
  • C语言基础知识--动态内存管理
  • AD芯片(模数转换器)的有效位数(ENOB)
  • scrapy项目开发流程
  • C++中的容斥原理
  • Springboot aop面向切面编程
  • 虚拟商品交易维权指南:数字经济时代的消费者权益保护