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

群里一哥们面试的时候被问到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

Android canvas.save()和canvas.restore()的理解的相关文章

Android中canvas.save()和canvas.restore()的使用

自己定义控件时经常遇到重写View的Ondraw()方法,Ondraw()方法经常设计到save()和restore()这两个方法.这两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的. 详细作用例如以下: 1.save():用来保存Canvas的状态,save()方法之后的代码,能够调用Canvas的平移.放缩.旋转.裁剪等操作! 2.restore():用来恢复Canvas之前保存的状态,防止save()方法代码之后对Canvas运行的操作.继续对兴许的绘制会产生影响.通过该方法

canvas.save()和canvas.restore()作用

文章转自:oney139: 最终所有权归作者所有. 链接:http://blog.csdn.net/oney139/article/details/8143281. canvas.save()和canvas.restore():是两个相互匹配出现的,作用是用来存储画布的状态和取出保存的状态的.这里稍微解释一下. 当我们对画布进行旋转,缩放,平移等操作的时候其实是对特定的元素进行操作,比如图片,一个矩形等.但是当你用canvas的方法来进行这些操作的时候,其实是对整个画布进行了操作,那么之后在画布

Android Canvas的save(),saveLayer()和restore()浅谈

save()  saveLayer()  restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 复写onDraw(Canvas canvas),其中Canvas就像是一块画布,你自定义控件的样式就是在它上面完成的. Canvas ,Paint等基本概念就不赘述了. 2.下面就直接用demo来解释标题列出的方法先介绍save()和 必须了解的相关知识:http://www.cnblogs.com

【转】Android Canvas的save(),saveLayer()和restore()浅谈

Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22      阅读:1445      评论:0      收藏:0      [点我收藏+] save()  saveLayer()  restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 复写onDraw(Canvas canvas),其中Canvas就像是

Android 中Canvas的save(),saveLayer()和restore()解析

1.save()方法 : 用来保存Canvas的状态,save()方法之后的代码,可以调用Canvas的平移.放缩.旋转.裁剪等操作! 2.restore()方法: 用来恢复Canvas之前保存的状态(可以想成是保存坐标轴的状态),防止save()方法代码之后对Canvas执行的操作,继续对后续的绘制会产生影响,通过该方法可以避免连带的影响 总结:就是在save之前绘制的状态会保存下来,在restore方法之后绘制的不会再因为状态而改变 示例说明: 例如:我们想在画布上绘制一个向右的三角箭头,当

canvas.save() canvas.restore() 作用

这里canvas.save();和canvas.restore();是两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的.这里稍微解释一下, 当我们对画布进行旋转,缩放,平移等操作的时候其实我们是想对特定的元素进行操作,比如图片,一个矩形等,但是当你用canvas的方法来进行这些操作的时候,其实是对整个画布进行了操作,那么之后在画布上的元素都会受到影响,所以我们在操作之前调用canvas.save()来保存画布当前的状态,当操作之后取出之前保存过的状态,这样就不会对其他的元素进行影响

Android Canvas save和restoreToCount

@Override public void draw(Canvas canvas) { if (mDrawable!=null) { int sc=canvas.save(); if (mAnimation!=null) { mAnimation.getTransformation( AnimationUtils.currentAnimationTimeMillis(), mTransformation); canvas.concat(mTransformation.getMatrix());

Android自定义View和Canvas绘图解析

自定义view的流程分为measure. layout.draw三个主要步骤,今天我们通过源码来分下下measure的过程 我们从顶级view开始,顶级view即DecorView, view的事件都是先经过这个DecorView, 接下来我们来看看这个DecorView的MeasureSpec的创建过程: ViewRoot 对应 ViewRootImpl类,  是连接WindowManager 和 DecorView的纽带,   进入ViewRootImpl中,查看measureHierarc

Android Canvas save() restore()

Android Canvas save() restore()