關於Canvas的save和restore的那些事
本篇部落格主要是關於一個canvas在呼叫save和restore會產生什麼影響。android中的Canvas我們直接使用的場景並不是很多,在我的印象中,只有在自定義View,手動繪製bitmap和手動更新SurfaceView的時候會需要手動的在Canvas上繪製圖形。
在尚未對Canvas進行操作前,Canvas的座標與螢幕的座標相同,且原點重合,詳細的如下圖所示:
我們在使用Canvas的save和restore方法時,基本上都是伴隨著我們需要對Canvas進行平移或者旋轉操作,這裡的這些操作將會對Canvas的座標產生一些影響,這些影響包括改變座標的原點,X座標軸和Y座標軸的方向等。
下面根據程式碼來詳細分析這些Canvas的操作,程式碼實現如下:
canvas.drawCircle(40,40,40,mPaint);
canvas.save();//儲存當前畫布狀態
mPaint.setColor(Color.BLUE);
//畫布右移mWidth/2,此時畫布的原點位置由原來的(0,0)移動至(mWidth/2,0)
canvas.translate(mWidth/2,0);
canvas.drawCircle(0,40,40,mPaint);
canvas.restore();
mPaint.setColor(Color.GREEN);
canvas.drawCircle(40,mHeight/2,40,mPaint);
在程式碼中首先在(40,40)的位置繪製了一個半徑為40的圓,這裡的數字表示的都是畫素,在繪製完成會,我們儲存當前的canvas狀態,在這裡我就理解為複製了一個canvas,並將這個canvas向右移動mWidth/2,這時,canvas的座標的原點已經發生改變了,如圖所示:
這時在執行繪製動作,在(0,40)繪製一個圓,然後呼叫Canvas的restore方法,相當於將新複製的canvas上的內容與原來的canvas的內容進行合併,這個合併根據螢幕的座標進行的(個人是這麼理解的),在呼叫restore方法後,新複製的canvas就被銷燬了,而原來的canvas的座標還是以左上角為原點的座標系,程式碼的執行結果如下:
執行結果跟我們分析的也是一致!!!
再來看一段程式碼:
canvas.drawCircle(0,0,80,mPaint);
canvas.save();
canvas.rotate(90);//順時針旋轉
mPaint.setColor(Color.BLACK);
canvas.drawCircle(mWidth/2,0,80,mPaint);
canvas.restore();
mPaint.setColor(Color.GREEN);
canvas.drawCircle(mWidth/2,mHeight/2,80,mPaint);
在程式碼中首先在(0,0)的位置繪製了一個半徑為80的圓,這裡只能看到1/4的圓,其餘部分繪製到螢幕外面了,在繪製完成會,我們儲存當前的canvas狀態,理解為複製了一個canvas,並將這個canvas順時針旋轉90度,這時,canvas的座標的X、Y軸的方向已經發生改變了,如圖所示:
然後再在(mWidth/2,0),繪製一個半徑為80的圓,有圖可以看出,將會有半個圓繪製在螢幕外,使用者只能看到半個圓,然後呼叫restore方法,將新複製的canvas和原來的canvas上的內容根據螢幕座標系進行合併。
然後再在(mWidth/2,mHeight/2)的位置繪製一個半徑為80的圓,由於此時canvas的座標系就是原來的預設的座標系,所以這個圓會繪製在View的中心處,程式碼的執行結果如圖所示:
程式碼的執行結果也跟我們預想的一樣!!!
關於Canvas的Save和Restore方法就說到這,有興趣的朋友可以以關注我,遇到問題大家一起討論一下!!
這是我的微信公眾號,如果可以的話,希望您可以幫忙關注一下,這將是對我最大的鼓勵了,謝謝!!