2012-11-21 74 views
3

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

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 

任何帮助,提示,建议都非常欢迎。

干杯 威廉

+0

我不知道答案,但这里只是一个想法:你说的范围是0.5。 0.5与其屏幕有什么关系? 0.5是否足够大,实际移动超过1个像素?再次,只是一个随机的,毫无根据的想法。 –

+0

是的,我想过这个。我真的不确定android是如何解决这个问题的,但是其他设备上的其他设备都可以正常工作,即使在其他Galaxy S上也可以使用stock ROM。我试图设置一个限制,所以位图移位必须> = 1,但这也会导致奇怪的问题。我用手机上的位图进行的所有操作似乎都不涉及到屏幕。 bitmapShift在我的手机上移动的最小值是0.454167。在股票星系s 0.918750。并不像我之前说过的那么近。今天继续... – user1842354

回答

1

当仅存在一个简单的变换画布设置(一个简单的变换=只翻译,没有旋转时,无标度),Skia的,Android的2D呈现库,对齐位图像素网格。这意味着小于1个像素的移动可能根本不可见。一个愚蠢的解决方法是在绘制位图之前在Canvas上设置非常非常小的比例或旋转变换。这具有不将位图贴合到像素网格的副作用。

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

+0

你能演示一个关于我如何做的例子吗?不知道你的意思。 – user1842354

+0

我试过了:memoryCanvas.scale(1.00001f,1.00001f); \t \t \t \t memoryCanvas.drawBitmap(memoryBitmap,bitmapShift,0.0f,paint);没有改变,我试着启用和禁用hw加速并且没有改变。但我现在很确定它的全部都与位图的子像素位移有关。 – user1842354

+0

我通过从不做位图的子像素位移来解决它。 drawBitmap函数使用浮点值但显然忽略它并使其为int,这有点令人困惑。谢谢你指点我正确的方向。 – user1842354