我尝试使用“Transform.scale”(用于“缩放”)和“Transform.translate”(用于移动),但它们似乎会触发CustomPainter中的paint方法。
(即使方法“shouldRepaint”返回false,但该方法甚至没有被调用)
也许有其他方法可以实现我想要的功能,即能够移动和缩放我用Canvas创建的内容(而不再执行paint方法)?
想象一下,您希望实现一个带有大量不同矢量数据图像的巨大下拉列表的应用程序。
这些矢量图像的数据可以从互联网或大型本地SQLite数据库中检索。
重要提示:这些图像中的数据不是如jpg、png、gif等光栅图像,而是被定义为点、线、多边形、文本标签和图标、颜色值等许多屏幕坐标的矢量数据,以及其他内容。
这样的矢量数据将用于创建图像,并且据我所知,除非有更好的选择,否则应该使用CustomPainter和paint方法?
还要想象每个选定的具有矢量数据的图像都非常巨大,有成千上万条线、多边形、图标等等,而且绘制方法可能需要几秒钟才能创建图像。
但是,一旦绘制完成,数据就不会改变。
因此,由于“绘制”方法可能需要几秒钟来渲染大量的矢量数据,您希望在移动或缩放时避免频繁调用它。
因此,我认为如果可能的话,使用“shouldRepaint”方法返回false是可取的,但是当使用Transform方法“scale”和“translate”进行调整大小或移动时,该方法甚至都没有被调用。
但也许有其他解决方案来支持上述描述的场景,也许有一些其他类可以在应用Transform scale/translate时不自动触发paint方法?
我希望Flutter框架能够以某种方式自动重用潜在缓慢使用paint方法创建的位图(例如特定位和字节处的颜色值),但可以比再次执行paint方法更快地进行缩放/缩放和移动。
(即使方法“shouldRepaint”返回false,但该方法甚至没有被调用)
也许有其他方法可以实现我想要的功能,即能够移动和缩放我用Canvas创建的内容(而不再执行paint方法)?
在下面的示例代码中,有三个滑块,一个用于缩小(即减小大小),一个用于水平移动,一个用于垂直移动。
“paint”方法只是绘制了一个多边形(请参见下面附加的截图)。
虽然下面的示例代码很简单(即硬编码的矢量数据量少且渲染速度快),但我想强调的是,我正在寻找的解决方案需要支持许多复杂的绘图(有大量数据,渲染速度慢),即不建议提出这样的解决方案,例如手动将此一矢量图像转换为光栅图像(例如PNG / JPG / GIF)。
以下是我尝试描述如何考虑需要支持的情况:想象一下,您希望实现一个带有大量不同矢量数据图像的巨大下拉列表的应用程序。
这些矢量图像的数据可以从互联网或大型本地SQLite数据库中检索。
重要提示:这些图像中的数据不是如jpg、png、gif等光栅图像,而是被定义为点、线、多边形、文本标签和图标、颜色值等许多屏幕坐标的矢量数据,以及其他内容。
这样的矢量数据将用于创建图像,并且据我所知,除非有更好的选择,否则应该使用CustomPainter和paint方法?
还要想象每个选定的具有矢量数据的图像都非常巨大,有成千上万条线、多边形、图标等等,而且绘制方法可能需要几秒钟才能创建图像。
但是,一旦绘制完成,数据就不会改变。
因此,由于“绘制”方法可能需要几秒钟来渲染大量的矢量数据,您希望在移动或缩放时避免频繁调用它。
因此,我认为如果可能的话,使用“shouldRepaint”方法返回false是可取的,但是当使用Transform方法“scale”和“translate”进行调整大小或移动时,该方法甚至都没有被调用。
但也许有其他解决方案来支持上述描述的场景,也许有一些其他类可以在应用Transform scale/translate时不自动触发paint方法?
我希望Flutter框架能够以某种方式自动重用潜在缓慢使用paint方法创建的位图(例如特定位和字节处的颜色值),但可以比再次执行paint方法更快地进行缩放/缩放和移动。
![enter image description here](https://istack.dev59.com/Q8u3p.webp)
RepaintBoundary
了吗?例如,使用这个你可以创建多个“层”,如果你想要它们中的任何一个发生变化。 - pskink