我有一个我无法解决的问题。我创建了一个图形应用程序,它将包含大量数据点的数据。为了在图形中启用滚动,我创建了图形数据的位图,并根据用户输入将位图移位/移动到屏幕的右侧或左侧。位图始终是图表视图高度和图表视图宽度。当用户移动位图时,我将位图移动到:
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 :(得分:1)
当Canvas上只有一个简单的变换集(一个简单的变换=仅平移,没有旋转,没有缩放)时,Skia,Android的2D渲染库将位图与像素网格对齐。这意味着可能根本看不到小于1像素的移动。一个愚蠢的解决方法是在绘制位图之前在Canvas上设置非常小的比例或旋转变换。这具有不将位图捕捉到像素网格的副作用。
我想我应该在Paint上添加一个新API,让app无论设置什么样的变换都可以对位图进行亚像素定位。