在Android onDraw()上直接绘制画布和绘制位图然后画布之间的区别

gar*_*arh 6 android android-custom-view android-canvas

我正在编写一个显示信号的自定义视图.为了缩短我的onDraw()时间,我将目前为止在Bitmap中绘制的所有内容都缓存,并在每次onDraw()调用中追加到它.通过这样做,我可以节省大量的时间,因为我只需要一次绘制几个修复,而不是重做整个事情.

虽然事情困扰着我 - 它似乎直接绘制到提供的画布提供了比首先在位图上绘制然后在画布上绘制位图更准确的绘图.通过查看下图的下半部分,您可以看到差异:

查看信号的下半部分以查看差异 - 有相同的drawLine调用

我在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);
}
Run Code Online (Sandbox Code Playgroud)

为什么两条迹线不一样,更重要的是,如何让下面的迹线看起来像上面的迹线?

yoa*_*oah 4

差异的原因在于画布绘制是通过硬件加速(GPU)完成的,而位图绘制是通过软件(CPU)完成的。如果禁用硬件加速,它们就会变得完全相同。如果将 X 坐标乘以 10,您会发现差异在于线条的连接方式。这些只是微小的一个像素差异,我不会理会它们。我不确定哪一个更准确,它们看起来只是略有不同的实现。