我经常看到以下代码
canvas.save().
canvas translate or rotate
some drawing
canvas.restore
我不明白为什么我们要保存然后恢复。撤消刚刚完成的事情的意义何在!我确定我在这里漏掉了什么
我经常看到以下代码
canvas.save().
canvas translate or rotate
some drawing
canvas.restore
我不明白为什么我们要保存然后恢复。撤消刚刚完成的事情的意义何在!我确定我在这里漏掉了什么
我知道这个问题有点过时了,但是对于仍在寻找答案的人,我可以用通俗易懂的语言解释:
想象画布是一张纸,你的任务是在底部右侧画一个正立的机器人,然后在顶部稍微向右移动并缩小约40%的位置上画一个倒立的机器人。 就像这样:
你会怎么开始呢?哪个更容易做到先做?
你可能会先画底部的大机器人,因为它是正立的,并且朝着更自然的方向绘制更容易。 那么现在该如何处理第二个倒置的机器人呢?
或者
这就是 canvas.save()
和 canvas.restore()
的作用,它们允许您以任何使绘制更容易的方式修改画布。 您不需要使用这些方法,但是它们确实简化了很多过程。 上述过程看起来会像下面这样:
drawRobot()
canvas.save()
canvas.rotate(180)
canvas.translate(100, 0)
canvas.scale(40,40)
drawRobot()
canvas.restore()
如果我们查看 restore()
文档,它说:
用于自上次保存调用以来删除对矩阵/剪辑状态的所有修改
而要了解这些修改是什么,我们看一下 save()
,它说:
平移、缩放、旋转、扭曲、串联或剪辑矩形、剪辑路径
嗯,看起来我们确实使用了 translate
、rotate
和 scale
,但我们也调用了 drawRobot()
,那么调用 restore
不会抹掉我们的图形吗?不会,因为它只影响修改,而不会影响图形。因此,当我们调用 restore
时,它将使画布恢复到开始第二次绘图之前的状态。
onDraw(Canvas)
调用中应用一系列非常复杂的平移和旋转。现在,由于您对Canvas
应用的每个平移/旋转都是按顺序发生的,因此您必须撤消最后一次对Canvas
所做的调整,或以某种方式根据之前的调整计算新的调整,然后再绘制您想要绘制的内容。这将变得非常混乱而且很快就会变得难以管理。canvas.save()
和canvas.restore()
可以轻松简化该过程。Canvas
的调整,可以有效地将这些调整隔离,以便下一个要绘制的内容不会受到当前正在绘制的内容的影响。canvas.save()
表示我要保存当前Canvas
的调整状态,以便稍后可以返回到该状态。
canvas.restore()
表示我要将我的Canvas
的调整恢复到上次调用cavas.save()
的状态。当您有由多个对象组成的背景时,一个很好的方法是保存这个“静态”背景,并仅重新绘制已更改的对象。这可以节省(处理器)时间。