嗨,我正在阅读fingerpaint示例,因为我正在构建一个签名活动,允许用户在手机上绘制签名,然后将其保存到sd。
到目前为止,我已经看到mpath变量保存用户当前正在绘制的路径,并且通过调用

canvas.drawPath(mPath, mPaint);

不过,在该示例中,还有另一个画布“mcanvas”在touch listener上绘制路径:
private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
    // kill this so we don't double draw
    mPath.reset();
}

这就是我不明白的。这个mcanvas对象到底是什么,为什么他们在示例中使用它,似乎只有ondraw方法中的常规画布和mpath变量才足以完成此操作?

最佳答案

onDraw方法在ui线程上执行。虽然我们无法访问ui线程(您不希望经常使用ui线程),但我们使用Bitmap在屏幕外绘制。
为什么这么做?这是因为它允许我们专注于绘图/处理,而不必担心阻塞ui线程。
注意:调用方法Canvas(或invalidate)不会立即阻塞和调用postInvalidate-它只是将draw调用与操作系统排队。

09-18 13:53