码迷,mamicode.com
首页 > 移动开发 > 详细

Android canvas.save()和canvas.restore()的理解

时间:2016-03-08 16:43:46      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

群里一哥们面试的时候被问到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度代码的后面,再次运行程序观察有什么变化。

源代码下载

Android canvas.save()和canvas.restore()的理解

标签:

原文地址:http://blog.csdn.net/leoleohan/article/details/50827236

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!