Flutter-如何在没有再次运行CustomPainter绘画方法的情况下移动和缩放Canvas图纸?

问题描述

我尝试使用“ Transform.scale”(用于“ zooming”)和“ Transform.translate”(用于移动)方法,但它们似乎触发了CustomPainter中的paint方法
(即使方法“ shouldRepaint”返回false,但该方法甚至都不会被调用
也许还有其他方法可以实现我想要的功能,即能够移动和缩放使用Canvas创建的内容(无需再次执行paint方法)?

在下面的示例代码中,有三个滑块,一个滑块用于缩小(即减小尺寸),一个滑块用于水平移动,另一个滑块用于垂直移动。
“画图”方法仅绘制一个多边形(请参见下面的屏幕截图)。

虽然下面的示例代码很简单(即,少量的硬编码矢量数据并且可以快速渲染),但我想强调一下,我正在寻找的解决方案需要支持许多复杂的图形(数据很多,渲染速度很慢) ),即建议像手动将这一矢量图像转换为光栅图像(例如PNG / JPG / GIF)这样的建议是不可接受的。

下面我尝试描述您如何思考需要支持的情况:
假设您要实现一个应用程序,该应用程序具有巨大的下拉列表,并且要选择许多不同的矢量数据图像。
这些VECTOR图像的数据可以从互联网或大型本地sqlite数据库中检索。
重要说明:这些图像中的数据不是jpg,png,gif等光栅图像,但是要检索的VECTOR数据定义为许多点,线,多边形和文本标签以及图标的屏幕坐标,并且颜色值...等等。
这样的VECTOR数据将用于创建图像,据我所知,除非有更好的选择,否则应将CustomPainter与paint方法一起使用?
还可以想象每个带有矢量数据的选定图像都是巨大的,有成千上万的线,多边形,图标等,并且绘制方法可能会花费几秒钟来创建图像。
但是,一旦绘制,数据将不会更改。
因此,由于“绘制”方法可能要花费几秒钟来呈现大量矢量数据,因此您希望避免在移动或缩放时频繁调用它。
因此,我认为,如果可以使用方法“ shouldRepaint”返回false,那将是可取的,但是当使用Transform方法“ scale”和“ translate”调整大小或移动该方法时,甚至根本不调用方法。 。
但是,也许还有其他解决方案可以支持上述情况,也许是CustomPainter之外的其他一些类,它们在应用Transform scale / translate时不会自动触发paint方法
我希望Flutter框架有一个解决方案,能够以某种方式自动重用使用paint方法可能缓慢创建的位图(例如,某些位和字节处的颜色值),但是可以比以更快的方式缩放/缩放和移动它必须再次执行绘画方法

enter image description here

解决方法

如果您只想缩放,缩放和平移图像,则可以尝试使用新的InteractiveViewer小部件。

InteractiveViewer

启用平移和缩放的小部件 与孩子的互动。

用户可以通过拖动来平移或平移到 缩放。

https://api.flutter.dev/flutter/widgets/InteractiveViewer-class.html

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...