web-dev-qa-db-fra.com

Enregistrer le canevas puis restaurer, pourquoi?

Je vois souvent le code suivant

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

Je ne comprends pas pourquoi nous enregistrons puis restaurons. Quel est l'intérêt de défaire ce que nous venons de faire! Je suis sûr que je manque quelque chose ici Merci

34
Snake

Je comprends que cette question est un peu datée, mais pour ceux qui recherchent toujours une réponse, je peux ELI5;

Imaginez que la toile est un morceau de papier, et vous êtes chargé de dessiner une image d'un robot à droite en haut, en bas, et un autre robot à l'envers, légèrement déplacé vers la droite, et environ 40% plus petit en haut. Quelque chose comme ça; Android canvas example

Comment commenceriez-vous? Quoi de plus facile à faire en premier?

Vous dessineriez probablement le plus gros robot en bas en premier car il est à droite et il est beaucoup plus facile de dessiner dans la direction qui semble plus naturelle. Vous avez donc terminé le premier, comment abordez-vous le deuxième robot à l'envers?

  • Vous pourriez essayer de le dessiner tel quel, mais ce serait un peu difficile puisque vous êtes à l'envers.

ou

  • Vous pouvez faire pivoter votre papier à 180 °, déplacer un peu votre point de départ et commencer à dessiner à une échelle plus petite, et après avoir terminé, vous n'avez qu'à faire pivoter le papier en arrière.

C'est ce que font canvas.save() et canvas.restore(), ils vous permettent de modifier votre toile d'une manière qui le rend plus facile pour que vous puissiez dessiner ce dont vous avez besoin . Vous n'avez pas besoin d'utiliser ces méthodes, mais elles simplifient certainement une grande partie du processus. Ce qui précède ressemblerait à quelque chose

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

Si nous regardons la documentation restore() elle dit

est utilisé pour supprimer toutes les modifications de l'état matrice/clip depuis le dernier appel de sauvegarde

et pour voir quelles sont ces modifications, nous jetons un œil à save() il dit

traduire, redimensionner, faire pivoter, incliner, concatrer ou clipRect, clipPath

Eh bien regardez ça, nous avons en fait utilisé translaterotate et scale mais nous avons aussi appelé drawRobot() donc nous n'appellerions pas restore effacer notre dessin? Non, car cela n'affecte pas le dessin, seulement les modifications. Ainsi, lorsque nous appelons restore, cela ramènera notre canevas à l'état dans lequel il se trouvait avant de commencer le deuxième dessin.

36
Pztar

Quel est l'intérêt de défaire ce que nous venons de faire!

Mais tu ne l'es pas. Si vous vous trompez, il semble que c'est ce qui pourrait arriver, mais ce n'est pas le cas.

Pensez-y comme ceci:

Vous avez une série de traductions et de rotations vraiment complexes que vous souhaitez appliquer dans le même appel onDraw(Canvas). Maintenant, étant donné que chaque translation/rotation que vous appliquez au Canvas se produit dans l'ordre, vous devrez annuler vos derniers ajustements au Canvas, ou calculer en quelque sorte vos nouveaux ajustements sur la base du précédent avant dessiner tout ce que vous voulez dessiner. Cela deviendrait très compliqué, très rapidement.

L'utilisation de canvas.save() et canvas.restore() est un moyen ridiculement simple de simplifier ce processus.

En effectuant des ajustements qui s'appliquent au Canvas dans un bloc de sauvegarde/restauration, vous isolez efficacement lesdits ajustements afin que tout ce que vous voulez dessiner ensuite ne soit pas affecté par ce que vous dessinez maintenant.

Maintenant, une meilleure explication des noms:

canvas.save() dit que je veux sauvegarder l'état des ajustements actuels de Canvas afin de pouvoir y revenir plus tard.

canvas.restore() dit que je veux revenir à mes réglages de Canvas à la dernière fois que j'ai appelé cavas.save()

La beauté de ceci est dans sa simplicité. Si vous avez déjà dessiné tout ce que vous vouliez dessiner pendant le bloc de sauvegarde/restauration et que vous n'avez plus besoin de ces ajustements pour votre prochain dessin, utilisez-le pour vous débarrasser de ces ajustements inutiles et revenir à l'état dans lequel vous souhaitez commencer votre prochain dessin de.

Espérons que cela aide à l'expliquer!

30
Cruceo

Travailler avec le canevas implique toutes sortes de procédures de traduction, d'échelle, de rotation et de biais sur le canevas. La méthode save () préserve un état avant toute augmentation susmentionnée en place, restore () rembobine à un état dans le temps où aucune augmentation n'est injectée. En d'autres termes, vous pouvez enregistrer un état préalable avant toute transformation du canevas, effectuer vos rotations et tout ce que vous voulez pendant le processus, mais lorsque vous avez terminé de revenir à l'état avant toute augmentation.

1
Remario

Lorsque vous avez un arrière-plan composé de plusieurs objets, un excellent moyen consiste à enregistrer cet arrière-plan "statique" et à redessiner uniquement les objets modifiés. Cela économise du temps (processeur).

0
avk