2015-03-13 12 views
7

Vedo spesso il seguente codiceSalva canvas, quindi ripristina, perché?

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

Non capisco perché salviamo e quindi ripristinare. Qual è il punto di annullare ciò che abbiamo appena fatto! Sono sicuro che mi manca qualcosa qui Grazie

+0

se non si è certi di cosa dicono i documenti, provare a sperimentare un po 'con questi metodi e vedere che cosa fanno effettivamente: – pskink

+0

correlati: http: // stackoverflow.it/questions/3051981/why-do-we-use-canvas-save-or-canvas-restore – petey

risposta

15

Qual è lo scopo di annullare ciò che abbiamo appena fatto!

Non sei, però. Se stai appena uscendo dalle parole, sembra che sia quello che potrebbe succedere, ma in realtà non lo è.

Pensate a come questo:

Hai una serie di traduzioni in realtà complesse e rotazioni che si desidera applicare nella stessa onDraw(Canvas) chiamata. Ora, poiché ogni traduzione/rotazione applicata allo Canvas avviene in ordine, è necessario annullare le ultime modifiche apportate allo Canvas, o in qualche modo calcolare le nuove regolazioni basate sulla precedente prima di disegnare qualunque cosa si desideri disegnare. Sarebbe molto complicato, molto rapidamente.

Utilizzare canvas.save() e canvas.restore() è un modo ridicolmente semplice per semplificare tale processo.

Effettuando le regolazioni applicabili allo Canvas all'interno di un blocco di salvataggio/ripristino, si stanno effettivamente isolando le suddette regolazioni in modo che qualsiasi cosa si voglia disegnare successivamente non sia influenzata da ciò che si sta disegnando ora.

Ora, un po 'meglio spiegazione dei nomi:

canvas.save() sta dicendo che voglio salvare lo stato delle attuali regolazioni Canvas s' in modo che possa tornare in un secondo momento.

canvas.restore() sta dicendo che voglio tornare aggiustamenti 's miei Canvas indietro all'ultima volta che ho chiamato cavas.save()

La bellezza di questo è nella sua semplicità. Se hai già disegnato quello che volevi disegnare durante il salvataggio/ripristino e non hai più bisogno di quelle regolazioni per il tuo prossimo disegno, con questo ti lasciamo perdere quelle regolazioni inutili e torni allo stato in cui vuoi iniziare il tuo prossimo disegno a partire dal.

Speriamo che questo aiuti a spiegarlo!

+2

Grazie mille per la spiegazione. Quindi, se salviamo lo stato, eseguiamo la trasformazione di disegno e matrice e quindi eseguiamo il ripristino, quindi abbiamo rimosso efficacemente ciò che abbiamo fatto. Quindi quando finiremo l'ondraw, le cose sarebbero le stesse di quando abbiamo iniziato l'ondraw. Quindi questo metodo era inutile allora, no? Mi sarei immaginato che avresti ripristinato quando avresti iniziato a non tornare alla fine. Mi manca ancora qualcosa qui, non sono io :)? – Snake

+1

"Quindi questo metodo era inutile allora, no?" - Dipende da cosa intendi per inutile. Sì, la prossima chiamata suDraw avrà lo stato non corretto, ma è esattamente quello che desideri. Quando viene chiamato onDraw, significa che lo stato del tuo View è cambiato e deve essere ridisegnato, quindi vuoi che il tuo Canvas sia a questo stato azzerato, altrimenti dovresti capire manualmente come recuperarlo in ordine per te per disegnare di nuovo con precisione. Salvare/ripristinare è difficile da capire quando si esegue solo un'attività; in effetti, non ha nemmeno senso usarlo in quella situazione. (continua ...) – Guardanis

+2

Ora, se si eseguono diverse regolazioni su diversi oggetti all'interno dello stesso metodo onDraw; improvvisamente salvare/ripristinare diventa un Dio-invia. Diciamo che hai l'oggetto A, B, entrambi a (0,0). Si desidera spostare A su (30,0) e B su (0,50). Il primo è facile. traduci la tela in 30. Fatto. Ora il secondo è dove diventa interessante, perché non stai passando da 0 a 50 in y, stai andando da 30 a 0 in x, quindi da 0 a 50 in y, quindi dovresti tradurre (-30,50) invece del nostro facile (0,50). Ora, se hai eseguito le traduzioni di A in un salvataggio/ripristino, potresti solo tradurre (continua ...) – Guardanis

0

Quando si dispone di uno sfondo composto da più oggetti, un ottimo modo è quello di salvare questo sfondo "statico" e solo ridisegnare gli oggetti modificati. Ciò consente di risparmiare tempo (processore).

0

Lavorare con la tela comporta tutti i metodi di traslare, ridimensionare, ruotare, inclinare le procedure sulla tela. Il metodo save() conserva uno stato prima di qualsiasi delle modifiche sopra menzionate, restore() riavvolge uno stato nel tempo in cui non viene iniettata alcuna conversione. In altre parole, è possibile salvare un pre-stato prima di qualsiasi trasformazione della tela, eseguire le rotazioni e qualsiasi altra cosa si desideri durante il processo, ma quando si è finito si riavvolge allo stato prima di qualsiasi incremento.

Problemi correlati