2011-02-11 82 views
2

我试图在Android上画一个2D contour plot of some data,我想知道最好的方法是画什么。整个数据集可以相对较大(2k * 2k点),并且缩放和在图内移动应该非常快。大多数情况下,只有一小部分数据会在用户放大数据时绘制。使用比屏幕大得多的画布

我现在的想法是将整个绘图绘制到一个大的画布上,但将其剪切到屏幕上可见的部分,以便只有那部分才会真正绘制到底。我发现Android的2D绘图API有点令人困惑,我不确定这是否真的是一种可行的方法,以及我将如何执行它。

所以我的问题是:

  • 它是一个好主意,绘制到比屏幕更大的画布,用剪裁,只显示相关的部分?
  • 我将如何创建一个更大的画布,以及如何选择应绘制哪些部分?

回答

2

您应该以相反的方式开始。您不应该创建一个巨大的画布,而应该检测您需要绘制哪部分情节,并仅绘制该部分。

所以基本上你需要一些导航/滚动,你需要保持内存中的起点偏移来计算你的位置。使用偏移量可以轻松放大和缩小,因为您只需将绘图缩放到屏幕即可。

1

是不是画到画布 比屏幕更大, 使用裁剪,只显示 相关的部分是一个好主意?

更好的问题可能是,你有任何其他的选择。有人可能会争辩说,这是一个坏主意,因为当它与UI上发生的事情无关时,要保持内存的使用。但是,从我对Canvas的经验中,我认为你会发现这应该算得很好。现在,如果您试图在内存中保留“5平方英里”的画布,您肯定会找到更好的方式来管理它。

我将如何创建一个更大的画布和 我怎么会选择哪些部分应该 如何界定呢?

我希望当用户通过覆盖onTouchEvent方法触摸屏幕时,您将创建自己的“滚动”方法。基本上,您需要跟踪X和Y的起点,并在屏幕上移动Canvas时跟踪该值。为了移动Canvas,有一些内置的像translatescale,您可以用它们来移动X和Y中的Canvas,以及在用户放大或缩小时将其缩放。

1

我不认为在一个大的位图上绘制二维轮廓图是一个不错的主意,因为您需要一个矢量类型的图形来放大和缩小以保持锐利。只有图片可以很好地缩小比例,但图形会在位图缩小时丢失细线或变形。

正确的方法是以数学方式完成所有操作,并计算图的哪一部分应绘制为需要的位置和缩放。使用anti_alias绘制线条和文字时,图形总是会显得锐利而且很好...... 当用户缩小时,有些项目不应该绘制,因为它们无法放入屏幕或会使其混乱。因此,该图将始终针对缩放级别进行优化...