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

文章转自:oney139;

最终所有权归作者所有。

链接:http://blog.csdn.net/oney139/article/details/8143281。

canvas.save()和canvas.restore():是两个相互匹配出现的,作用是用来存储画布的状态和取出保存的状态的。这里稍微解释一下。

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

对于canvas.save();和canvas.restore();还有不少人不懂,我再补充点:

代码段1:

 

public void draw() {

Canvas canvas = sfh.lockCanvas();

canvas.drawColor(Color.BLACK);

canvas.drawBitmap(bmp1, 0,0,paint);

canvas.save();

canvas.scale(5f, 5f);

canvas.restore();

canvas.drawBitmap(bmp2, 0,0,paint);

sfh.unlockCanvasAndPost(canvas);

}

代码段2:

public void draw() {

Canvas canvas = sfh.lockCanvas();

canvas.drawColor(Color.BLACK);

canvas.drawBitmap(bmp1, 0,0,paint);

canvas.scale(5f, 5f);

canvas.drawBitmap(bmp2, 0,0,paint);

sfh.unlockCanvasAndPost(canvas);

}

上面这两个代码片段中我们都假设有两张图片bmp1和bmp2,并且都画在画布上!

那么代码是段1和代码段2的不同:

代码段1中我们进行画布缩放的之前保存了画布的状态,做了缩放操作之后又去出之前保存的状态。这样做是为了保证bmp2正常画出来不受到缩放的影响!

代码段2里,画了bmp1后就执行了缩放操作,并且没有保存状态!紧接着画了bmp2,那么bmp2也会一样受到缩放的影响!!

所以我们如果单独处理一张图片的时候,而且不想影响其他部分的绘制。那么应该如下来做:

view plaincopy toclipboardprint?

public void draw() {

Canvas canvas = sfh.lockCanvas();

canvas.drawColor(Color.BLACK);

canvas.drawBitmap(bmp1, 0,0,paint);

canvas.save();

canvas.scale(5f, 5f);

canvas.drawBitmap(bmp2, 0,0,paint);

canvas.restore();

sfh.unlockCanvasAndPost(canvas);

}

时间: 2024-10-12 16:07:38

canvas.save()和canvas.restore()作用的相关文章

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

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

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

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

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

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方法之后绘制的不会再因为状态而改变 示例说明: 例如:我们想在画布上绘制一个向右的三角箭头,当

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());

[ html canvas save restore ] canvas绘图 save restore 属性理论讲解

Canvas API详解(Part 1) 分类 Android 基础入门教程 本节引言: 前面我们花了13小节详细地讲解了Android中Paint类大部分常用的API,本节开始我们来讲解 Canvas(画板)的一些常用API,我们在 8.3.1 三个绘图工具类详解 中已经列出了我们可供调用的一些方法,我们分下类: drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层. clipXXX方法族:在当前的画图区域裁剪(clip)出一个新的画图

[ html canvas save restore ] canvas绘图 save restore 属性实例演示

解析: 我们可以在做平移变换之前将当前canvas的状态进行保存,其实Canvas为 我们提供了图层(Layer)的支持,而这些Layer(图层)是按"栈结构"来进行管理的 当我们调用save()方法,会保存当前Canvas的状态然后作为一个Layer(图层),添加到Canvas栈中, 另外,这个Layer(图层)不是一个具体的类,就是一个概念性的东西而已! 而当我们调用restore()方法的时候,会恢复之前Canvas的状态,而此时Canvas的图层栈 会弹出栈顶的那个Layer,