我正在开发另一个使用比屏幕大很多倍的画布的绘图应用程序。我需要一些关于如何做到这一点的建议/指导。
基本上我想要的是在这个大画布上滚动,只在可见区域绘制。我在想两种方法:
- 有 64x64(或其他)“图块”可供绘制,然后在滚动时加载新图块。
- 记录所有用户笔画(点)并滚动计算指定区域中的哪些笔画,并仅使用屏幕大小的画布绘制它们。
如果这很重要,我正在使用 cocos2d 作为原型。
我正在开发另一个使用比屏幕大很多倍的画布的绘图应用程序。我需要一些关于如何做到这一点的建议/指导。
基本上我想要的是在这个大画布上滚动,只在可见区域绘制。我在想两种方法:
如果这很重要,我正在使用 cocos2d 作为原型。
忘记 2000x200 的限制,我有一个开源项目,它绘制 18000 x 18000 NASA 图像。
我建议你把这个任务分成两部分。首先,滚动。正如 CodaFi 所建议的,当您滚动时,您将提供 CATiledLayers。每一个都将是您创建的 CGImageRef - 您真正巨大的画布的子图像。然后,您可以轻松支持放大和缩小。
第二部分是与用户交互以绘制或以其他方式影响画布。当用户停止滚动时,然后创建一个不透明的 UIView 子类,将其作为子视图添加到主视图,覆盖托管 CATiledLayers 的视图。在您需要显示此视图的那一刻,您使用适当的信息填充它,以便它可以正确绘制较大画布的那部分(例如在某个颜色的这一点上画一个圆圈等)。
您将使用此覆盖视图的 drawRect: 方法进行绘图。因此,当用户采取更改视图的操作时,您可以根据需要执行“setDisplayInRect:”来强制 iOS 调用您的 drawRect:。
当用户决定滚动时,您需要使用用户所做的任何更改来更新您的大画布模型,然后移除不透明的覆盖,并让 CATiledLayers 绘制大图像的适当部分。这种过渡可能是避免视觉故障的过程中最棘手的部分。
假设您有大量用于画布的对象定义。当您需要为图块创建 CGImageRef 时,您可以扫描它以寻找对象框架和图块框架之间的重叠,然后才绘制该图块所需的那些项目。
许多移动设备不支持超过 2048x2048 的纹理。所以我会推荐:
这可能是最有效的方式。64x64 瓦片真的太小了,而且效率很低,因为“绘制瓦片”调用会产生很大的重复开销。
Apples ScrollViewSuite中有一个平铺示例与绘图部分没有任何关系,但它可能会给您一些关于如何管理事物平铺部分的想法。
您可以使用 CATiledLayer。见 WWDC2010 会议 104
但是对于 cocos2d,它可能不起作用。