int state = canvas.save();保存已有的画布状态
canvas.restore(); 获取到之前保存的画布状态
canvas.getSaveCount();获取保存了几次画布状态
canvas.restore();恢复画布状态(如果save()3次,只调一次restore()方法只能恢复最后一次save()的状态,调2次才会恢复到第二次save()的状态)
canvas.restoreToCount(state);恢复指定的画布状态
canvas.saveLayer(0,0, 700, 700, mPaint);保存一个离屏图层
canvas.restoreToCount(layerId);将离屏图层的绘制内容恢复到canvas
/**
* 1.canvas内部对于状态的保存存放在栈中
* 2.可以多次调用save保存canvas的状态,并且可以通过getSaveCount方法获取保存的状态个数
* 3.可以通过restore方法返回最近一次save前的状态,也可以通过restoreToCount返回指定save状态。指定save状态之后的状态全部被清除
* 4.saveLayer可以创建新的图层,之后的绘制都会在这个图层之上绘制,直到调用restore方法
* 注意:绘制的坐标系不能超过图层的范围, saveLayerAlpha对图层增加了透明度信息
*/
Log.e("", "onDraw: "+canvas.getSaveCount());
canvas.drawRect(200, 200, 700, 700, mPaint);
int state = canvas.save();
Log.e("", "onDraw: "+canvas.getSaveCount());
canvas.translate(50,50);
mPaint.setColor(Color.GRAY);
canvas.drawRect(0,0,500,500, mPaint);
canvas.save();
Log.e("", "onDraw: "+canvas.getSaveCount());
canvas.translate(50,50);
mPaint.setColor(Color.BLUE);
canvas.drawRect(0,0,500,500, mPaint);
canvas.restore();
Log.e("", "onDraw: "+canvas.getSaveCount());
// canvas.restore();
// canvas.restoreToCount(state);
Log.e("", "onDraw: "+canvas.getSaveCount());
canvas.drawLine(0,0, 400,500, mPaint);
保存恢复.png
创建离屏画布
canvas.drawRect(200,200, 700,700, mPaint);
int layerId = canvas.saveLayer(0,0, 700, 700, mPaint);
mPaint.setColor(Color.GRAY);
Matrix matrix = new Matrix();
matrix.setTranslate(100,100);
canvas.setMatrix(matrix);
canvas.drawRect(0,0,700,700, mPaint); //由于平移操作,导致绘制的矩形超出了图层的大小,所以绘制不完全
canvas.restoreToCount(layerId);
mPaint.setColor(Color.RED);
canvas.drawRect(0,0,100,100, mPaint);
保存图层.png
在canvas.saveLayer()和canvas.restoreToCount(layerId);之间代码就可以做自己想做的事