如何防止 RenderBox 覆盖其他小部件?
How to prevent RenderBox from drawing over other widgets?
如果我有一个RenderBox
(为方便起见,形式为LeafRenderObjectWidget
) anywhere on the screen, it will always get called with a PaintingContext
that starts at Offset(0.0, 0.0)
. This can be fixed by translating the Canvas
or using a RenderShiftedBox
。
现在,RenderBox
将从其实际位置 开始绘制。这对我来说很好,但是,即使 canvas 操作发生在这些范围之外,我也想限制我的 RenderBox
绘制其他小部件。
我该如何处理?我考虑过剪裁 LeafRenderObjectWidget
,但我不知道我的 RenderBox
区域将从哪里开始。
如果之前不清楚,我拥有确定 RenderBox
开始和结束位置所需的一切。我从 paint
中作为参数提供的 Offset
获得了较高的位置,并且我有尺寸,因为我在 performResize
中设置了它,但我不知道如何使用它进行剪辑因为该信息在 RenderBox
.
中
有几种可能性:
将您的 RenderBox
包装成 ClipRect
。简单但有点作弊
在 RenderBox
的 paint
函数中使用 PaintingContext.pushClipRect
下面夹个画不溢出来RenderBox
@override
void paint(PaintingContext context, Offset offset) {
context.pushClipRect(
needsCompositing, offset, Rect.fromLTWH(0, 0, size.width, size.height),
(context, offset) {
// TODO: do some painting
});
}
如已接受的答案中所述,用 ClipRect 包裹 RenderBox 效果很好!太简单了,我忽略了。这就是代码的样子
Container(
/*Code for container*/
child: ClipRect(
child: CustomPaint(
painter: MyPainter(),
size: Size.infinite,
),
),
),
如果我有一个RenderBox
(为方便起见,形式为LeafRenderObjectWidget
) anywhere on the screen, it will always get called with a PaintingContext
that starts at Offset(0.0, 0.0)
. This can be fixed by translating the Canvas
or using a RenderShiftedBox
。
现在,RenderBox
将从其实际位置 开始绘制。这对我来说很好,但是,即使 canvas 操作发生在这些范围之外,我也想限制我的 RenderBox
绘制其他小部件。
我该如何处理?我考虑过剪裁 LeafRenderObjectWidget
,但我不知道我的 RenderBox
区域将从哪里开始。
如果之前不清楚,我拥有确定 RenderBox
开始和结束位置所需的一切。我从 paint
中作为参数提供的 Offset
获得了较高的位置,并且我有尺寸,因为我在 performResize
中设置了它,但我不知道如何使用它进行剪辑因为该信息在 RenderBox
.
有几种可能性:
将您的
RenderBox
包装成ClipRect
。简单但有点作弊在
RenderBox
的
paint
函数中使用 PaintingContext.pushClipRect
下面夹个画不溢出来RenderBox
@override
void paint(PaintingContext context, Offset offset) {
context.pushClipRect(
needsCompositing, offset, Rect.fromLTWH(0, 0, size.width, size.height),
(context, offset) {
// TODO: do some painting
});
}
如已接受的答案中所述,用 ClipRect 包裹 RenderBox 效果很好!太简单了,我忽略了。这就是代码的样子
Container(
/*Code for container*/
child: ClipRect(
child: CustomPaint(
painter: MyPainter(),
size: Size.infinite,
),
),
),