【问题标题】:Using a canvas much larger than the screen使用比屏幕大得多的画布
【发布时间】:2011-02-11 12:58:32
【问题描述】:
我正在尝试在 Android 上绘制 2D contour plot of some data,我想知道绘制它们的最佳方法是什么。整个数据集可以相对较大(2k * 2k 点),并且在绘图内缩放和移动应该非常快。大多数情况下,当用户放大数据时,只会绘制一小部分数据。
我现在的想法是将整个绘图绘制到一个大画布上,但将其剪辑到屏幕上可见的部分,以便最终只真正绘制该部分。我发现 Android 的 2D 绘图 API 有点混乱,我不确定这是否真的是一种可行的方法以及我将如何去执行它。
所以我的问题是:
- 在比屏幕大得多的画布上绘图并使用剪辑仅显示相关部分是否是个好主意?
- 如何创建更大的画布以及如何选择应绘制的部分?
【问题讨论】:
标签:
java
android
graphics
canvas
drawing
【解决方案1】:
你应该反过来开始。与其创建一个巨大的画布,不如检测你需要绘制绘图的哪一部分,然后只绘制那个部分。
所以基本上你需要一些导航/滚动,并且你需要在内存中保持从起点的偏移量来计算你在哪里。使用偏移量,您可以轻松地放大和缩小,因为您只需要将绘图缩放到屏幕上。
【解决方案2】:
画图是个好主意吗?
画布比屏幕大得多,并且
使用剪辑仅显示
相关部分?
一个更好的问题可能是,您还有其他选择吗?有些人可能会争辩说这是一个坏主意,因为当它与 UI 上发生的事情无关时,您将继续使用内存。但是,根据我对Canvas 的经验,我认为您会发现这应该可以正常工作。现在,如果您想在内存中保留“5 平方英里”的画布,您肯定必须找到更好的方法来管理它。
如何创建更大的画布和
我将如何选择哪些部分应该
画出来了吗?
我希望当用户通过覆盖onTouchEvent 方法触摸屏幕时,您将创建自己的“滚动”方法。基本上,您需要跟踪起点 X 和 Y,并在屏幕上移动 Canvas 时跟踪该值。为了移动Canvas,有许多内置函数,如translate 和scale,您可以使用它们在X 和Y 方向移动Canvas,并在用户放大或缩小时对其进行缩放.
【解决方案3】:
我认为在大位图上绘制 2D 等高线图不是一个好主意,因为您需要矢量类型的图形来放大和缩小以保持清晰。只有图片适合按比例缩小,但在位图中按比例缩小时,图形会丢失细线或变形。
正确的方法是用数学方法完成这一切,并计算应为所需的位置和缩放绘制图形的哪个部分。对线条和文本使用 anti_alias 油漆,图形总是清晰而良好......
当用户缩小时,某些项目不应该被绘制,因为它们无法适应屏幕或会使屏幕混乱。因此,图表将始终针对缩放级别进行优化...