• Canvas的save和restore 之二


    在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法。

    onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。

    在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?

    ❑ save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。

    ❑ restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。

    save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。

    在读Android SDK里面的samples里面游戏的时候,很多时候都看到对canvas的save()和restore()运用。

      下面是个小程序,使用了这两个方面,使得旋转红色方块的时候,保证蓝色方块不受影响。

      代码如下:

      Java代码

      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

      }

      }

      }

    所以,save和restore之间,往往夹杂的是对Canvas的特殊操作。

    再一次理解:canvas可能会做旋转,平移,切割等动作,然后为了让这些动作只在特定的一个程序段产生作用,不会影响下面你需要继续画的物体,可 以通过 save和restore来做,相当于你本来走在一条大路上,忽然你觉得想尿尿,但是又怕回来找不到刚才走到的位置,所以你标记保存起来,然后你离去到一 个幽静而又僻远的小茅房做动作,做完之后,你restore一下发现自己又回到了原来在大路上的位置,这样你可以继续走了。(很恶,但是很形象)

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

     

    Java代码 
    1.  canvas = mHolder.lockCanvas();    
    2.  Paint mPaint = new  Paint();    
    3.  mPaint.setColor(Color.BLUE);    
    4.  canvas.drawRect(100  200  200  300 , mPaint);    
    5.      
    6.  canvas.save();  //注释1   
    7.  canvas.rotate(45 );    
    8.  mPaint.setColor(Color.RED);    
    9.  canvas.drawRect(150  10  200  60 , mPaint);    
    10. canvas.restore(); //注释2    
    11.    
    12.    
    13.  mPaint.setColor(Color.GREEN);    
    14.  canvas.drawRect(200  10  250  100 , mPaint);    
    15.  mHolder.unlockCanvasAndPost(canvas);    
    1.  canvas = mHolder.lockCanvas();    
    2.  Paint mPaint = new Paint();    
    3.  mPaint.setColor(Color.BLUE);    
    4.  canvas.drawRect(100200200300, mPaint);    
    5.      
    6.  canvas.save();  //注释1  
    7.  canvas.rotate(45);    
    8.  mPaint.setColor(Color.RED);    
    9.  canvas.drawRect(1501020060, mPaint);    
    10. canvas.restore(); //注释2   
    11.    
    12.    
    13.  mPaint.setColor(Color.GREEN);    
    14.  canvas.drawRect(20010250100, mPaint);    
    15.  mHolder.unlockCanvasAndPost(canvas);    



    如果上面的代码,注释1和注释2部分的代码被注释的话,那么绿色的方块一样是被旋转的。 
    如图: 

    http://rayleung.javaeye.com/blog/440623

    http://cnmsdn.com/html/201006/1276969135ID6245.html

    http://blog.csdn.net/surmountyourself/archive/2010/07/27/5768368.aspx

  • 相关阅读:
    SQL Server身份验证登录失败
    课程总结及加分项
    导入并配置Guns框架
    python数据化中文是方块显示
    服务外包平台测试
    idea配置javap
    interface和abstract的区别
    简记Vue弹窗组件eldaolog被父界面创建后,子界面created函数只调用一次的解决方案
    Vue computed属性和methods区别
    记录一下前端查询条件对应后端多个条件的一种简单粗暴解决方法
  • 原文地址:https://www.cnblogs.com/carbs/p/2599985.html
Copyright © 2020-2023  润新知