Canvas之 save,restore
阿新 • • 發佈:2018-12-22
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);
在執行上句程式碼,就是以圖二的座標系位置來繪製,繪製出了圖一的效果。