android_浅析canvas的save()和restore()方法

别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述android_浅析canvas的save()和restore()方法相关的知识,希望能为你提供帮助。
[java] view plain copy

  1. < span  style="font-size:18px; ">   < /span>    
[java] view plain copy
  1. < span  style="font-size:18px; "> < /span>      
绘图之前,首先需要调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上!Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要常用方法:

    setAntiAlias: 设置画笔的锯齿效果。
    setColor: 设置画笔颜色
    setARGB:  设置画笔的a,r,p,g值。
    setAlpha:  设置Alpha值
    setTextSize: 设置字体尺寸。
    setStyle:  设置画笔风格,空心或者实心。
    setStrokeWidth: 设置空心的边框宽度。
    getColor:  得到画笔的颜色
    getAlpha:  得到画笔的Alpha值。

  自定义控件时常常遇到重写View的Ondraw()方法,Ondraw()方法常常设计到save()和restore()这两个方法
,现结合demo简单分析一下这两个方法的作用:
 
1.save():用来保存Canvas的状态,save()方法之后的代码,可以调用Canvas的平移、放缩、旋转、裁剪等操作!
2.restore():用来恢复Canvas之前保存的状态,防止save()方法代码之后对Canvas执行的操作,继续对后续的绘制会产生影响,通过该方法可以避免连带的影响!
 
通过一个例子说明一下:
例如:我们想在画布上绘制一个向右的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用),最后,我们在右下角绘一个20像素的圆!
 
代码:
[java] view plain copy
  1. < span  style="font-size:18px; "> package  com.test.ui;    
  2.    
  3. import  android.R.color;    
  4. import  android.content.Context;    
  5. import  android.graphics.Canvas;    
  6. import  android.graphics.Color;    
  7. import  android.graphics.Paint;    
  8. import  android.view.View;    
  9.    
  10. public  class  GameView  extends  View    {   
  11.    
  12.         public  final  static  String  TAG  =  "Example_05_03_GameView";    
  13.         //  声明Paint对象   
  14.         private  Paint  mPaint  =  null;    
  15.    
  16.         public  GameView(Context  context)  {   
  17.                 super(context);    
  18.                 mPaint  =  new  Paint();    
  19.         }   
  20.    
  21.         @Override   
  22.         protected  void  onDraw(Canvas  canvas)  {   
  23.                 super.onDraw(canvas);    
  24.                 Paint  background=new  Paint();    
  25.                 Paint  line=new  Paint();    
  26.                    
  27.                 background.setColor(color.darker_gray);    
  28.                 line.setColor(Color.RED);    
  29.                    
  30.                 int  px  =  getMeasuredWidth();    
  31.    
  32.                 int  py  =  getMeasuredWidth();    
  33.                    
  34.                 //  Draw  background   
  35.                 canvas.drawRect(0,  0,  px,  py,  background);    
  36.                 canvas.save();    
  37.                 canvas.rotate(90,  px/2,  py/2);                                    
  38.                    
  39.                    
  40.                   //画一个向上的箭头   
  41.                 canvas.drawLine(px  /  2,  0,  0,  py  /  2,  line);   //左边的斜杠               
  42.                 canvas.drawLine(px  /  2,  0,  px,  py  /  2,  line); //右边的斜杠   
  43.                 canvas.drawLine(px  /  2,  0,  px  /  2,  py,  line); //垂直的竖杠   
  44.                
  45.                 canvas.restore();    
  46.                 //  Draw  circle   
  47.                 canvas.drawCircle(px  -  10,  py  -  10,  10,  line);      
  48.         }   
  49. }   
  50. < /span>    
 
MainActivity.Java:
 
[java] view plain copy
  1. < span  style="font-size:18px; "> package  com.test.ui;    
  2.    
  3. import  android.app.Activity;    
  4. import  android.os.Bundle;    
  5.    
  6. public  class  MainActivity  extends  Activity  {   
  7.    
  8.         private  GameView  mGameView;    
  9.    
  10.         @Override   
  11.         public  void  onCreate(Bundle  savedInstanceState)  {   
  12.                 super.onCreate(savedInstanceState);    
  13.                 setContentView(R.layout.activity_main);    
  14.                 mGameView  =  new  GameView(this);    
  15.                 setContentView(mGameView);    
  16.         }   
  17. }   
  18. < /span>    


运行结果:
 
android_浅析canvas的save()和restore()方法

文章图片

 
如果将  canvas.save()和canvas.restore()注释掉,那么圆点将会随着之前的90旋转跑到了左边,没有达到你预期想要显示在右下角的效果:
 
android_浅析canvas的save()和restore()方法

文章图片

 
以上我们很明显看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能绘制不同的图形,save和restore之间,往往是对Canvas的特殊操作!
 
 
 
 
 
【android_浅析canvas的save()和restore()方法】 
 
 
 
 
 

 
 
 
 














    推荐阅读