我不知道如何解释我的问题。 我有一个用画布创建的图形视图,如果其中一个图形被带到画布的边缘,我想缩放和扩展画布。 我会留下一些图片来更好地表达自己。
If I add a new figure, it expands the canvas (color light blue) and I can move the canvas
答案 0 :(得分:0)
你会快速跑出内存这样的架构(拥有巨大的画布,只能看到它的一部分)。
而是将几何元素保留在某个列表中,具有位置/大小,然后使用“相机视图”矩阵,该矩阵将用于计算每个元素的实际坐标(这样的矩阵将允许您执行所有类型的视口操作,移动它周围,缩放,旋转,甚至一些倾斜的乐趣)。
具有仅在屏幕上的画布,并且仅为像素大小的1:1,即作为要绘制的目标视口表面。然后每个形状,在变换后适合该区域,以适当的比例画在画布上。
这样,如果您的元素使用矢量化形状,即使在高水平的缩放时也会保持清晰锐利,而在这种情况下,完整画布已经超出了内存限制。
但是这样做可能会遇到不同类型的问题。每次从头开始重新绘制画布,具有大量元素,可能需要相当长的时间。有几种技术可以改进,我不相信你会有数以千计的元素,因此剔除所有元素应该没问题。但是可以实现各种缓存,包括重新使用几个画布来“平铺”最终区域,以提高移动速度。
但是首先,您可以简单地使用已转换的几何体重绘画布,Paint
本身将在转换后剪切出区域外的元素。在你有了这个基本的解决方案之后(你确实编写了代码,将触摸手势转换为视图矩阵修改,而不是滚动布局),你可以试验性能,也许简单的方法已经足够满足你的需求,任何平铺/缓存。
也许检查3D引擎是如何工作的,它们没有巨大的画布,但是它们只在屏幕上绘制可见区域,并且它们首先以点坐标形式变换几何体,而不是渲染像素。该原理也可以应用于2D(它是相同的,只是没有6DOF旋转和线性透视)。