相信很多人和我一样看了官方文档对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 }
效果图: