Android canvas的save()和restore()用法
在读Android SDK里面的samples里面游戏的时候,很多时候都看到对canvas的save()和restore()运用。
下面是个小程序,使用了这两个方面,使得旋转红色方块的时候,保证蓝色方块不受影响。
?
?
?
代码如下:
package com.ray.test;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Bundle;import android.view.SurfaceHolder;import android.view.SurfaceView;public class Test extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); } class MyView extends SurfaceView implements SurfaceHolder.Callback{ private SurfaceHolder mHolder; private Canvas canvas;public MyView(Context context) {super(context);mHolder = getHolder();mHolder.addCallback(this);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {canvas = mHolder.lockCanvas();Paint mPaint = new Paint();mPaint.setColor(Color.BLUE);canvas.drawRect(100, 200, 200, 300, mPaint);canvas.save();canvas.rotate(45);mPaint.setColor(Color.RED);canvas.drawRect(150, 10, 200, 60, mPaint);canvas.restore();mHolder.unlockCanvasAndPost(canvas);}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stub} }}
?
canvas = mHolder.lockCanvas(); Paint mPaint = new Paint(); mPaint.setColor(Color.BLUE); canvas.drawRect(100, 200, 200, 300, mPaint); canvas.save(); //注释1 canvas.rotate(45); mPaint.setColor(Color.RED); canvas.drawRect(150, 10, 200, 60, mPaint); canvas.restore(); //注释2 mPaint.setColor(Color.GREEN); canvas.drawRect(200, 10, 250, 100, mPaint); mHolder.unlockCanvasAndPost(canvas);
如果上面的代码,注释1和注释2部分的代码被注释的话,那么绿色的方块一样是被旋转的。
如图:

多谢楼主的分享, 看了代码就清晰很多了
另外有一个问题
canvas.rotate(45); 是逆时旋转了 45 度 而matirx.setRotate(45) 是不是顺时针的 45 5 楼 puhao7117441 2010-06-17 但是貌似有个问题是,旋转canvas和直接旋转对象两个比起来,旋转画布所得到的质量似乎要低一些…… 6 楼 白夜古月 2010-06-18 意思就是 save() 和restore() 是用来划定操作的一个范围 这里可以不只是旋转 7 楼 hurry07 2010-06-24 puhao7117441 写道但是貌似有个问题是,旋转canvas和直接旋转对象两个比起来,旋转画布所得到的质量似乎要低一些……
这个可以通过设置画笔的抗锯齿来抵消, 不过有的图片即使抗锯齿了也不行