经过画图琢磨,终于理解 canvas的save和restore的用意了,上效果图和:代码
左下角画一个圆、中间画一个向右箭头、右上角画一个圆
使用了restore的效果如下:
不使用restore的效果如下:
/**
* 在画布的 左下角画圆,
* 中间画向右箭头 :旋转画布后再画
* 右上角画圆:画布旋转为原始方向后再画
* @param canvas
*/
private void canvasTest(Canvas canvas) {
int width = 200;
int height = 200;
int radius = 10;
int centerX = radius;
int centerY = height - radius;
Paint paint = new Paint();
//画做左下角的圆
paint.setStyle(Style.FILL);
paint.setColor(Color.BLUE);
paint.setAntiAlias(true);
canvas.drawCircle(centerX, centerY, radius, paint);
canvas.save();
//画三角形
canvas.rotate(90, width/2, height/2); //以画布中心为旋转点
// canvas.translate(0, -30);
// canvas.scale(1.2f, 1.2f, width/2, height/2);
paint.setColor(Color.RED);
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(4);
//左线、右线、中线, 把旋转后的当做新画布,但x, y 的坐标仍是原来方向的,但画出的图是旋转后的
//可以想象为先在原始画布上画,画好后旋转
canvas.drawLine(width/2, 0, 0, height/2, paint);
canvas.drawLine(width/2, 0, width, height/2, paint);
canvas.drawLine(width/2, 0, width/2, height, paint);
canvas.restore(); //如果不加这一行,那么下面的那个右上角的圆是 旋转后的画布的右上角,而非原始画布的右上角位置
//右上角画个圆
int cx2 = width - radius;
int cy2 = radius;
paint.setStyle(Style.FILL);
paint.setColor(Color.RED);
canvas.drawCircle(cx2, cy2, radius, paint);
}