標籤:android canvas save restore
自訂控制項時常常遇到重寫View的Ondraw()方法,Ondraw()方法常常設計到save()和restore()這兩個方法.這兩個相互匹配出現的,作用是用來儲存畫布的狀態和取出儲存的狀態的。具體作用如下:
1.save():用來儲存Canvas的狀態,save()方法之後的代碼,可以調用Canvas的平移、放縮、旋轉、裁剪等操作!
2.restore():用來恢複Canvas之前儲存的狀態,防止save()方法代碼之後對Canvas執行的操作,繼續對後續的繪製會產生影響,通過該方法可以避免連帶的影響!
下面簡單舉個例子,說明一下,先來看第一段代碼:
private class DemoView extends View {private Paint mPaint;private Bitmap bitmap1;private Bitmap bitmap2;public DemoView(Context context) {super(context);mPaint = new Paint();bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.a);bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.b);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawBitmap(bitmap1, 0, 0, mPaint);canvas.scale(5f, 5f);canvas.drawBitmap(bitmap2, 30, 30, mPaint);super.onDraw(canvas);}}很簡單的樣本,就是畫了兩個圖片,並且在第一個畫完後,把畫布放大了5倍,效果:
下面,我們把代碼稍作改動,如下:
private class DemoView extends View {private Paint mPaint;private Bitmap bitmap1;private Bitmap bitmap2;public DemoView(Context context) {super(context);mPaint = new Paint();bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.a);bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.b);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawBitmap(bitmap1, 0, 0, mPaint);canvas.save();//儲存canvas.scale(5f, 5f);canvas.restore();//恢複canvas.drawBitmap(bitmap2, 30, 30, mPaint);super.onDraw(canvas);}}效果如下:
這樣是不是效果對比很明顯了。
簡述一下兩個的不同吧:
1.第一段代碼中畫了bmp1後就執行了縮放操作,並且沒有儲存狀態!緊接著畫了bmp2,那麼bmp2也會一樣受到縮放的影響!!
2.第二段代碼中我們進行畫布縮放的之前儲存了畫布狀態,做了縮放操作之後又取出之前儲存的狀態,這樣做是為了保證bmp2正常畫出來不受到縮放的影響!
嗯,貌似是看懂了,不知道你懂了沒~
Android中canvas.save()和canvas.restore()的使用