flutter - 如何动态调整 CustomPainter 的大小
问题描述
我需要使用自定义画家在 ListTile 内渲染我的自定义对象,以便绘制一些自定义文本。
ListTile(
title: CustomPaint(
painter: RowPainter.name(
_titleFontSelected,
_titleFont,
text,
index,
MediaQuery.of(context),
currentRow,
),
),
);
在我的内部,我RowPainter
使用选定的字体绘制文本。当行太大时,它会自动换行并在给定的油漆大小之外绘制。
void paint(Canvas canvas, Size size)
我喜欢这种行为,但是如何调整我的绘画区域的高度?因为这是一个问题,因为它与下一个 List 行重叠。我知道CustomPaint
有一个可设置的属性Size
,但我只知道我的绘制函数内部的文本尺寸,TextPainter getBoxesForSelection
但为时已晚。
如果文本换行,我如何动态“调整”我的行画家高度?
解决方案
TL;博士
您不能动态调整自定义画家的大小,但是,您的问题可以使用CustomPaint
.
我将首先详细说明动态大小,然后解释如何使用恒定大小来解决这个问题。
动态尺寸
这本质上是CustomPaint
有其局限性的,因为它没有提供一种方法让您根据内容调整画家的大小。
这样做的正确方法是实现您自己的RenderBox
并覆盖performLayout
以根据内容调整渲染对象的大小。文档
对此非常详细,但是,您可能仍然很难进入它,因为它与构建小部件完全不同。RenderBox
恒定大小
您的情况不需要上述所有内容,因为您没有child
自定义油漆。
您可以简单地向您提供size
参数CustomPaint
并在父小部件中计算所需的高度。
您可以使用 aLayoutBuilder
来获取可用宽度:
LayoutBuilder(
builder: (context, constraints) {
final maxWidth = constraints.maxWidth;
...
}
)
现在,您TextPainter
甚至可以在输入自定义绘画之前简单地使用 a 来检索所需的大小:
builder: (context, constraints) {
...
final textPainter = TextPainter(
text: TextSpan(
text: 'Your text',
style: yourTextStyle,
),
textDirection: TextDirection.ltr,
);
textPainter.layout(maxWidth: maxWidth); // This will make the size available.
return CustomPaint(
size: textPainter.size,
...
);
}
现在,您甚至可以textPainter
直接将您的自定义画家传递给您,而不是传递样式参数。
您的逻辑可能有点复杂,但是,关键是您可以在创建 之前计算大小CustomPaint
,这允许您设置大小。
如果您需要更复杂的东西,您可能必须实现自己的RenderBox
.
推荐阅读
- pandas - Pandas:iloc 和 reset_index 在随机函数中定义时不会被执行
- c# - 动态 LINQ IQueryable(在运行时生成表达式)
- sql - JOIN ON 子句中的 Validate_conversion 函数 - ORA-00932:不一致的数据类型:预期 NUMBER 得到 CHAR
- javascript - Google Charts:在循环中设置多个侦听器会覆盖以前的侦听器
- symfony - 自定义规范器的 API 平台文档
- hibernate - 使用 Spring Boot JPA 检查 MySQL DB 连接 - 如何设置 Hikari 的超时
- date - SAP 网关服务器中的 DatePicker 值不匹配
- javascript - 使用JS在websql中插入表单数据创建动态表单
- keras - 如何引用多输出模型的一个输出
- pepper - Pepper 机器人参与和动画