Save和Restore
save就是保存当前的坐标系状态如坐标轴位置(原点是在左上角还是右上角或者其他地方)等。restore是恢复坐标系状态。先看看下面例子
public class SaveAndRestoreView extends View {
private Paint bgPaint;
private Paint linePaint;
private int width=500,height=500;
public SaveAndRestoreView(Context context) {
this(context,null);
}
public SaveAndRestoreView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
bgPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
bgPaint.setColor(Color.GRAY);
linePaint=new Paint(Paint.ANTI_ALIAS_FLAG);
linePaint.setColor(Color.RED);
linePaint.setStrokeWidth(4);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(0,0,width,height,bgPaint);
canvas.drawLine(width/2,0,0,height/2,linePaint);
canvas.save();
canvas.rotate(90,width/2,height/2);
canvas.drawLine(width/2,0,0,height/2,linePaint);
canvas.restore();
canvas.drawLine(0,height/2,width,height/2,linePaint);
}
效果:
canvas.drawRect(0,0,width,height,bgPaint);
canvas.drawLine(width/2,0,0,height/2,linePaint);
如果只执行上面这两行代码的话效果为
坐标原点在左上角。之后调用save()后,把当前绘制的效果保存为独立一层,我们命名为第一层,后面对画板的操作不影响之前的绘制效果。
canvas.rotate(90,width/2,height/2); 执行此操作后,canvas的坐标轴发生了变化如图:
canvas旋转了90度,坐标轴旋转到右上角了。此时在执行
canvas.drawLine(width/2,0,0,height/2,linePaint);效果如下
同一段代码,因为坐标轴的位置的变化,导致绘制的线条的位置不一样。
在执行下一句canvas.restore();后,把save和restore之间执行的绘制效果保存在独立的一层,我们命名为第二层,第二层会覆盖在第一层上面。
调用restore后canvas的状态将会恢复到调用save之前的状态,在这里canvas的坐标轴原点恢复到左上角。
canvas.drawLine(0,height/2,width,height/2,linePaint);
在执行上句代码,就是以图二的坐标系位置来绘制,绘制出了图一的效果。