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