Canvas之 save,restore

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);

在执行上句代码,就是以图二的坐标系位置来绘制,绘制出了图一的效果。

猜你喜欢

转载自blog.csdn.net/zouzoutingting_/article/details/85135147