Android-Canvas.save() Canvas.restore() 总结

相信很多人和我一样看了官方文档对Canvas save(), restore()方法的解释还是一个头雾水,save()保存的到底是什么信息呢?

答案是:坐标系的原点,坐标轴方向的信息。

我们在使用Canvas时难免会用到transitoin(), rotate()方法来改变坐标系的原点和坐标轴的方向,save()保存的正是这些信息。

下面举个栗子:

该例子用Canvas绘制一个仪表盘。自定义View,在onDraw()方法中绘制该仪表盘。

 1 /**
 2  * Created by Administrator on 2015/2/1 0001.
 3  */
 4 public class ImageMatrixView extends View {
 5 
 6 
 7     public ImageMatrixView(Context context) {
 8         super(context);
 9 
10     }
11 
12     public ImageMatrixView(Context context, AttributeSet attrs) {
13         super(context, attrs);
14 
15     }
16 
17
19     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
20     @Override
21     protected void onDraw(Canvas canvas) {
22         super.onDraw(canvas);
23        //画笔用于绘制圆和刻度
24             Paint paintLine = new Paint();
25             paintLine.setColor(Color.BLUE);
26             paintLine.setStyle(Paint.Style.STROKE);
27             paintLine.setTextSize(20);
28         //画笔用于绘制指针
29             Paint paintPointer = new Paint();
30             paintPointer.setStrokeWidth(10);
31       //获取圆的半径
32         float radius = Math.min(getWidth() / 2, getHeight() / 2);
33 
34         //画圆周
35         canvas.drawCircle(radius, radius, radius, paintLine);
36         //变化坐标系,改变后,坐标原点在(radius, radius),x轴正方形水平向右,y轴正方向水平向下
37         canvas.translate(radius, radius);
38 
39         //保存坐标系信息
40         canvas.save();
41 
42         //画圆上的点
43         for (int i = 0; i < 12; i++)
44         {
45             if (i % 3 == 0)
46             {
47                 canvas.drawLine(0, -radius, 0,  - (radius - 20), paintLine);
48             }
49             else
50             {
51                 canvas.drawLine(0, -radius, 0, -(radius - 10), paintLine);
52             }
53             canvas.drawText(String.valueOf(i), 0, - (radius - 24), paintLine);
54             //将坐标系顺时针旋转30度,
55             canvas.rotate(30, 0, 0);
56         }
57 
58         //回到上次保存的状态:坐标原点在(radius, radius),x轴正方向水平向右,y轴正方向水平向下
59         canvas.restore();
       //在保存的状态上继续改变坐标轴
60 canvas.rotate(30);
       //绘制指针
61 canvas.drawLine(0, 0, 40, 0, paintPointer); 62 canvas.rotate(30); 63 canvas.drawLine(0, 0, 60, 0, paintLine); 67 } 68 }

效果图:

posted @ 2015-12-26 18:16  gatsbydhn  阅读(2182)  评论(0编辑  收藏  举报