1. 程式人生 > >Canvas之 save,restore

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

在執行上句程式碼,就是以圖二的座標系位置來繪製,繪製出了圖一的效果。