android - 在 Android onDraw() 中直接绘制到 Canvas 和在位图上绘制然后 Canvas 之间的区别

标签 android android-canvas android-custom-view

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

但有一件事情困扰着我——直接在提供的 Canvas 上绘制比先在位图上绘制然后在 Canvas 上绘制位图提供了更“准确”的绘制。通过查看下图的下部,您可以看到不同之处:

Look at the lower part of the signal to see difference - there are the same drawLine calls

我在 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/

相关文章:

android - 将 XML 中的所有 subview 添加到 ViewGroup 后回调?

java - 图像为空时数据未插入数据库

Android保存透明背景的Textview

java - FrameLayout 类的子类不会重绘 Canvas 屏幕?

java - 为什么在Android 的自定义 View 中不调用onDraw?

android - 在自定义 ScrollView onScrollChanged 中更改 View 高度

Java:如何为每个 RecyclerView 项目制作自己的总数计数器?

Android Intent 的节电模式( Lollipop )

android - 在 onLongClickListener 中调用 MediaRecorder.start 时在 android.media.MediaRecorder.start 处出现 java.lang.IllegalStateException

java - 以编程方式添加到自定义 View 持有者的自定义 View 实例具有错误的位置和大小