群里一哥们面试的时候被问到canvas.restore()的作用是什么,与之常常被一起问到的是canvas.save()的作用是什么。最近在上海开发航运项目,忙里偷闲总结一下两个方法的用法,以后也将在博客中记录面试中可能会被问到的一些其他问题。
Canvas相当于一块画布,该类中常用的方法如下:
- drawRect(RectF rect, Paint paint)
- drawPath(Path path, Paint paint)
- drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)
- drawLine(float startX, float startY, float stopX, float stopY,
Paintpaint)
- drawPoint(float x, float y, Paint paint)
- drawText(String text, float x, floaty, Paint paint)
- drawCircle(float cx, float cy, float radius,Paint paint)
- drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
canvas.save()和canvas.restore()有什么用呢?
- canvas.save( ):用来保存Canvas的状态
- canvas.restore( ):用来恢复Canvas旋转、缩放等之后的状态,当和canvas.save( )一起使用时,恢复到canvas.save( )保存时的状态。
下面写一个简单的demo验证一下这个结论。
1、获取View的宽高尺寸
int x = getMeasuredWidth();
int y = getMeasuredWidth();
2、画最外面的圆
//画最外面的圆
canvas.drawCircle(x / 2, y / 2, x / 2, paint);
3、画类似表盘效果的刻度
//画刻度
paint.setColor(Color.BLUE);
canvas.drawLine(x / 2, y / 8, x / 2, 0, paint);
canvas.save();//注意,这里调用了保存canvas的方法
for (int i = 0; i < 3; i++) {
canvas.rotate(30, x / 2, y / 2);
canvas.drawLine(x / 2, y / 8, x / 2, 0, paint);
}
此时,画布已经顺时针旋转了3个30度,即90度。并且,在旋转画布之前已经调用了canvas.save()方法,所以此时保存的canvas的状态是未旋转时的正常状态。
4、继续画一条直线,观察效果
//给画笔加粗,换成黄色
paint.setStrokeWidth(10);
paint.setColor(Color.YELLOW);
//画一条黄色粗线,便于区分
canvas.drawLine(x / 2, y / 2, x / 2, y / 4, paint);
观察运行效果图,最新绘制的黄线已经被旋转了90度。为什么呢?因为画布已经在之前旋转了90度了。
下面在绘制黄线的代码之前,调用canvas.restore()恢复画布的状态
canvas.restore();//恢复画布状态
paint.setStrokeWidth(10);
paint.setColor(Color.YELLOW);
canvas.drawLine(x / 2, y / 2, x / 2, y / 4, paint);
此时运行效果如图:
黄线又恢复了正常显示。
当然,不使用canvas.restore(),而是继续旋转-90度画布,也是可以恢复画布到初始状态的。
canvas.rotate(-90, x / 2, y / 2);
感兴趣的读者可以把canvas.save()的调用放在旋转画布90度代码的后面,再次运行程序观察有什么变化。
时间: 2024-10-12 18:40:53