论坛首页 移动开发技术论坛

Android canvas的save()和restore()用法

浏览 16434 次
精华帖 (4) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-05  

在读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);
		}
		
		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {
			
		}

		@Override
		public 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);
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			// TODO Auto-generated method stub
			
		}
    	
    }
}

 

   发表时间:2010-03-09  
@Override 
        public 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);  
        }  
这段代码搂主能加上注释么?
纯代码理解有困难
0 请登录后投票
   发表时间:2010-03-15   最后修改:2010-03-15
其实楼主的代码 save 和 restore并不会影响蓝色方块的绘制。

看看我下面的代码,如果有save 和 restore,那么平移、缩放、旋转等操作只对 save到 restore之间的代码有影响。也就是说只有红色的方块是旋转的。
如图:



            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部分的代码被注释的话,那么绿色的方块一样是被旋转的。
如图:


  • 大小: 3.4 KB
  • 大小: 3.2 KB
0 请登录后投票
   发表时间:2010-04-16  
lishuyan0818 正解
0 请登录后投票
   发表时间:2010-06-16  
多谢楼主的分享, 看了代码就清晰很多了

另外有一个问题
canvas.rotate(45);  是逆时旋转了 45 度 而matirx.setRotate(45) 是不是顺时针的 45
0 请登录后投票
   发表时间:2010-06-17  
但是貌似有个问题是,旋转canvas和直接旋转对象两个比起来,旋转画布所得到的质量似乎要低一些……
0 请登录后投票
   发表时间:2010-06-18  
意思就是 save() 和restore() 是用来划定操作的一个范围  这里可以不只是旋转
0 请登录后投票
   发表时间:2010-06-24  
puhao7117441 写道
但是貌似有个问题是,旋转canvas和直接旋转对象两个比起来,旋转画布所得到的质量似乎要低一些……

这个可以通过设置画笔的抗锯齿来抵消, 不过有的图片即使抗锯齿了也不行
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics