嗨,我正在阅读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调用与操作系统排队。