Save canvas then restore, why is that?

2019-03-17 22:11发布

问题:

I often see the following code

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

I don't understand why we save and then restore. What's the point of undoing what we just did! I am sure I am missing something here Thanks

回答1:

What's the point of undoing what we just did!

You're not, though. If you're just going off the words, it does sound like that's what might happen, but it actually isn't.

Think of it like this:

You have a series of really complex translations and rotations you want to apply in the same onDraw(Canvas) call. Now, since every translation/rotation you apply to the Canvas happens in order, you would have to undo your last adjustments to the Canvas, or somehow calculate your new adjustments based off the previous one before drawing whatever it is you want to draw. That would get very messy, very quickly.

Using canvas.save() and canvas.restore() is a ridiculously easy way to simplify that process.

By doing adjustments that apply to the Canvas within a save/restore block, you're effectively isolating said adjustments so that whatever you want to draw next won't be affected by what you're drawing now.

Now, a little better explanation of the names:

canvas.save() is saying that I want to save the state of the current Canvas's adjustments so that I can go back to it later.

canvas.restore() is saying that I want to revert my Canvas's adjustments back to the last time I called cavas.save()

The beauty of this is in its simplicity. If you already drew whatever it is you wanted to draw during the save/restore block and you no longer need those adjustment's for your next drawing, using this let's you throw away those unnecessary adjustments and return to the state you want to start your next drawing from.

Hopefully that helps explain it!



回答2:

Working with the canvas involves all manner of translate,scale,rotate,skew procedures on the canvas. The save() method preserves a state before any of the aforementioned augmentation in place, restore() rewinds to a state in time where no augmentation is injected. In other words, you can save a pre state before any transformation of the canvas, do your rotations and whatever else you want to during the process, but when your finished rewind to the state before any augmentation.



回答3:

When you have a background composed of multiple objects, a great way is to save this "static" background and only redraw objects that changed. This saves (processor) time.