颤振 - 自定义画图的更有效的平移和缩放



我正在渲染一组图块网格,其中每个图块都是从图像中提取的。为了渲染这一点,我在我自己的CustomPainter实现中渲染所有内容(因为网格可能会变得非常大(。为了支持平移和缩放功能,我选择在画布绘画中执行偏移和缩放。

这是我自定义绘画实现的一部分。

@override
void paint(Canvas canvas, Size size) {
// With the new canvas size, we may have new constraints on min/max offset/scale.
zoom.adjust(
containerSize: size,
contentSize: Size(
(cellWidth * columnCount).toDouble(),
(cellHeight * rowCount).toDouble(),
),
);
canvas.save();
canvas.translate(zoom.offset.dx, zoom.offset.dy);
canvas.scale(zoom.scale);
// Now, draw the background image and grids.

虽然这是有效的,但在呈现足够多的单元格后,性能可能会开始崩溃(例如,100x100 的网格会导致更新缩放值的每个GestureDetector回调出现一些滞后(。而且,由于偏移和缩放是在CustomPaint中完成的,我基本上无法返回falsebool shouldRepaint(MyPainter old),因为它需要重新绘制以渲染其新的偏移和缩放。

所以,我的问题是:解决这个问题的更有效的方法是什么?

我尝试了另一种方法:

var separateRenderTree = RepaintBoundary(
child: OverflowBox(
child: CustomPaint(
painter: MyPainter(),
),
),
);
return Transform(
transform: Matrix4.translationValues(_zoom.offset.dx, _zoom.offset.dy, 0)..scale(_zoom.scale),
child: separateRenderTree,
);

这也可以,但在缩放时也会变得滞后(翻译非常流畅(。

那么,再说一遍,解决这个问题的正确方法是什么?

谢谢。

这就是我最终到达的地方。

我调整自定义绘制器的大小,使其根据需要尽可能大,然后将其放置在"变换"构件中(左上角对齐,偏移量为零(。

在这个小部件的顶部,我覆盖了一个管理触摸输入的不可见小部件。使用手势检测器,它将响应事件并通知变换小部件进行更新。

随着平移/缩放正式移出画家,我随后实现了"应该重绘"功能,更加严格。

这让我能够以足够快的速度渲染非常非常大的网格。

最新更新