3

我有一个我无法真正解决的问题。我创建了一个图形应用程序,其中包含具有大量数据点的数据。为了在图形中启用滚动,我创建了图形数据的位图,并根据用户输入将位图移动/移动到屏幕的右侧或左侧。位图始终是图形视图高度和图形视图宽度。当用户移动位图时,我移动位图:

memoryCanvas.drawBitmap(memoryBitmap, bitmapShift, 0.0f, paint);

其中 shift 是一个包含移位值的浮点值。

现在,在我尝试过的大多数设备上,它都非常好用。我已经在 HTC Desire、Galaxy Tab 和 Galaxy S 上进行了尝试。但是,在我自己的 Galaxy S 上进行测试时,我得到了我无法解释的奇怪结果。请注意,我的 Galaxy S 包含一个自定义 rom(使用 android 4.0.4),所以这可能是我得到这种行为的原因,但我仍然无法理解或正确缓解它。

因此,在正常的用例行为中,位图按 bitmapShift 像素数移动,然后我通过正常的线条绘制填充空白区域。但是当使用我的手机时,向任一方向缓慢拖动位图,因此 bitmapShift 值在 0.5 左右,位图不移动,或者只是有时移动。我比较了其他平台上的bitmapShift,它们在相同的范围内,缓慢拖动时为0.5。这种行为当然会搞砸我的画。在快速拖动时也会发生这种情况,但在缓慢拖动时最明显。

我无法真正弄清楚导致这种行为的原因。位图不会根据我的 bitmapShift 值移动。它适用于我尝试过的所有其他平台。如果我跳过使用位图,只根据移位值绘制线条,一切正常。

有谁知道什么可能导致这种行为?坐了几天试图弄清楚后,我有点跑了。关键代码如下。这段代码在我的 onDraw 函数中。

memoryCanvas.setBitmap(emptyBitmap); //First set another bitmap to clear 
memoryCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); //Clear it
memoryCanvas.drawBitmap(memoryBitmap, bitmapShift, 0.0f, paint); //Draw shifted bitmap on it
memoryCanvas.drawLines(lineDrawPoints, 0 , cnt, paint); //Draw remaining lines
memoryCanvas.setBitmap(memoryBitmap); //Set the original 
memoryCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); //Clear original
memoryCanvas.drawBitmap(emptyBitmap, 0.0f, 0.0f, paint); //Draw the final image                 
canvas.drawBitmap(memoryBitmap, 0, 0.0f, paint); //And finally draw on real canvas

非常欢迎任何帮助、提示和建议。

干杯威廉

4

1 回答 1

1

当 Canvas 上只有一个简单的变换集时(一个简单的变换 = 仅平移、无旋转、无缩放),Android 的 2D 渲染库 Skia 会将位图与像素网格对齐。这意味着少于 1 个像素的移动可能根本不可见。一个愚蠢的解决方法是在绘制位图之前在 Canvas 上设置一个非常非常小的比例或旋转变换。这具有不将位图捕捉到像素网格的副作用。

我想我应该在 Paint 上添加一个新的 API,让应用程序对位图进行亚像素定位,无论设置什么变换。

于 2012-11-21T16:01:44.840 回答