自己定義控件時經常遇到重寫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正常畫出來不受到縮放的影響!
嗯,貌似是看懂了,不知道你懂了沒~