我正在编写一个显示信号的自定义 View 。为了缩短我的 onDraw() 时间,我缓存了我到目前为止在位图中绘制的所有内容,并在每次 onDraw() 调用中附加到它。通过这样做,我可以节省大量时间,因为我一次只需要绘制几个固定元素,而不是重做整个事情。
但有一件事情困扰着我——直接在提供的 Canvas 上绘制比先在位图上绘制然后在 Canvas 上绘制位图提供了更“准确”的绘制。通过查看下图的下部,您可以看到不同之处:
我在 https://github.com/gardarh/android-uglybitmapdrawing/ 上传了一个显示差异的演示项目但相关代码如下:
@Override
public void onDraw(Canvas canvas) {
if(cachedBitmap == null) {
cachedBitmap = Bitmap.createBitmap(getWidth(), 200, Config.ARGB_8888);
cachedCanvas = new Canvas(cachedBitmap);
}
for(int i = 0; i < COORDS.length; i++) {
float[] curCoords = COORDS[i];
canvas.drawLine(curCoords[0], curCoords[1], curCoords[2], curCoords[3], linePaint);
cachedCanvas.drawLine(curCoords[0], curCoords[1], curCoords[2], curCoords[3], linePaint);
}
canvas.drawBitmap(cachedBitmap, 0, 120, null);
}
为什么两条轨迹不一样,更重要的是,我怎样才能让下面的轨迹看起来像上面的轨迹?
最佳答案
之所以有区别,是因为 Canvas 绘制是通过硬件加速(GPU)完成的,而位图绘制是通过软件(CPU)完成的。如果禁用硬件加速,它们将变得完全相同。 如果将 X 坐标乘以 10,您会发现不同之处在于线条的连接方式。这些是微小的一个像素差异,我不会理会它们。我不确定哪个更准确,它们的实现似乎略有不同。
关于android - 在 Android onDraw() 中直接绘制到 Canvas 和在位图上绘制然后 Canvas 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17025232/