保存画布然后恢复,为什么?

时间:2015-03-13 19:04:52

标签: android android-canvas

我经常看到以下代码

canvas.save().
canvas translate or rotate
some drawing
canvas.restore

我不明白为什么我们保存然后恢复。什么是取消我们刚刚做的事情的重点!我相信我在这里遗漏了一些东西 感谢

5 个答案:

答案 0 :(得分:29)

  

取消我们刚刚做了什么的重点是什么!

但是,你不是。如果你只是放弃了这些话,那听起来可能会发生什么,但实际上并非如此。

这样想:

您希望在同一onDraw(Canvas)来电中应用一系列非常复杂的翻译和轮播。现在,由于您应用于Canvas的每个翻译/轮换按顺序发生,您必须撤消对Canvas的最后调整,或者在绘制任何内容之前以某种方式计算基于前一个的新调整你想画画。那会很快变得非常混乱。

使用canvas.save()canvas.restore()是简化该过程的一种非常简单的方法。

通过执行适用于保存/恢复功能块中的Canvas的调整,您可以有效地隔离所述调整,以便您下次想要绘制的内容不会受到您&#的影响39;现在重新开始。

现在,更好地解释名称:

canvas.save()说我要保存当前Canvas调整的状态,以便稍后再回复。

canvas.restore()说我想将Canvas的调整还原到我上一次调用cavas.save()

的时候

这就是它的简洁。如果您已经在保存/恢复区域中绘制了想要绘制的任何内容,并且您不再需要对下一个绘图进行这些调整,那么请使用此方法,丢弃那些不必要的调整并返回到说明你要开始下一张图。

希望这有助于解释它!

答案 1 :(得分:9)

我知道这个问题有些陈旧,但是对于仍在寻找答案的任何人,我都可以ELI5;

想象一下,画布是一张纸,您的任务是在右下方(底部朝上)绘制一个机器人的图片,而另一侧向下(朝右移)并缩小约40%,顶端。像这样的东西; Android canvas example

您将如何开始?首先更容易做什么?

您可能会首先在底部绘制较大的机器人,因为它朝上,并且朝着更自然的方向绘制要容易得多。这样您就完成了第一个,现在如何处理第二个倒置机器人?

  • 您可以尝试按原样绘制它,但这会有些困难,因为您的颠倒了。

  • 您可以将纸张旋转180°,稍微移动起点,然后以较小的比例开始绘制,完成之后,您只需向后旋转纸张即可。

canvas.save()canvas.restore()就是这样做的,它们允许您以任何使自己更轻松地绘制所需内容的方式修改画布。您不需要使用这些方法,但是它们确实可以简化很多过程。上面看起来像

drawRobot()
canvas.save()
canvas.rotate(180)
canvas.translate(100, 0)
canvas.scale(40,40)
drawRobot()
canvas.restore()

如果我们查看restore()文档,它说

  

用于删除自上次保存调用以来对矩阵/剪辑状态的所有修改

,看看这些修改是什么,我们来看看save()它说的是

  

翻译,缩放,旋转,倾斜,concat或clipRect,clipPath

好了,我们实际上使用过translate rotatescale,但我们也调用过drawRobot(),所以不会调用restore擦除我们的图纸?否,因为它不会影响图形,因此进行修改。因此,当我们调用restore时,它将使画布返回到开始第二个绘图之前的状态。

答案 2 :(得分:1)

使用画布涉及画布上的所有翻译,缩放,旋转,倾斜过程。 save()方法在任何上述增强之前保留一个状态,restore()回退到没有注入增强的状态。换句话说,你可以在任何画布转换之前保存一个预先状态,在你的过程中进行你的旋转以及你想要的任何其他内容,但是当你完成任何扩充之前的状态倒回时。

答案 3 :(得分:1)

我想最简单的表达方式是:

它删除设置的更改,但不删除图形本身。

设置可以包括缩放画布等,并在调用canvas.save()时将缩放恢复到初始状态。

答案 4 :(得分:0)

当你有一个由多个对象组成的背景时,一个好方法是保存这个“静态”背景并仅重绘已更改的对象。这节省了(处理器)时间。