Canvas 物品有多一次性?

How disposable are Canvas objects?

假设我有一个位图,我需要在上面绘图。为此,我需要将它包装在 Canvas.

可以这样包装吗:

Bitmap mBitmap;

public void drawDrawable(Drawable d){
    d.draw(new Canvas(mBitmap));
}

public void drawListOfPathsInRed(List<Path> list){
    Paint paint = new Paint();
    for(Path path : list)
        new Canvas(mBitmap).drawPath(path, paint);
}

那会有多糟糕?创建许多 Canvases 或任何其他问题是否有明显的开销?

Canvas 本身没什么大不了的,它是一个漂亮的 "light" 对象,但是当我们谈论绘图时,我们确实需要我们可以获得的每一点性能(更多信息在这里: Optimizing the view)。为此,您可以将 Canvas 创建移动到绘图方法之外,并通过 setBitmap 方法重用它:

Bitmap mBitmap;
Canvas mCanvas = Canvas();
Paint mPaint = new Paint(); // You should also reuse your Paint object

public void drawDrawable(Drawable d) {
    mCanvas.setBitmap(mBitmap);
    d.draw(mCanvas);
}

public void drawListOfPathsInRed(List<Path> list){
    canvas.setBitmap(mBitmap)
    for (Path path : list) {
        canvas.drawPath(path, paint);
    }
}

要更进一步,您还可以在设置 mBitmap 变量后立即从绘图步骤中提取对 mCanvas.setBitmap 的调用。