Android中canvas.save()和canvas.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);
		}

		@Override
		protected void onDraw(Canvas canvas) {
			canvas.drawBitmap(bitmap1, 0, 0, mPaint);
			canvas.scale(5f, 5f);
			canvas.drawBitmap(bitmap2, 30, 30, mPaint);
			super.onDraw(canvas);
		}

	}
非常easy的演示樣例,就是畫了兩個圖片,而且在第一個畫完后。把畫布放大了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);
		}

		@Override
		protected 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正常畫出來不受到縮放的影響!

嗯,貌似是看懂了,不知道你懂了沒~



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM