2015-03-13 11 views
7

często widzę następujący kodZapisz płótno, a następnie przywróć, dlaczego tak jest?

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

Nie rozumiem dlaczego zapisać, a następnie przywrócić. Jaki jest cel zniszczenia tego, co właśnie zrobiliśmy! Jestem pewien, że czegoś tu brakuje Dzięki

+0

Jeśli nie jesteś całkiem pewien, co mówią doktorzy, spróbuj trochę eksperymentować z tymi metodami i zobacz, co faktycznie robią: – pskink

+0

powiązane: http: // stackoverflow.com/questions/3051981/why-do-we-use-canvas-save-or-canvas-restore – petey

Odpowiedz

15

Jaki jest cel zniszczenia tego, co właśnie zrobiliśmy!

Nie jesteś jednak. Jeśli odrzucasz te słowa, brzmi to tak, jakby to się mogło wydarzyć, ale tak naprawdę nie jest.

myśleć o tym tak:

mieć szereg bardzo skomplikowanych tłumaczeń i obrotów, które mają zastosowanie w tym samym onDraw(Canvas) rozmowy. Teraz, ponieważ każde tłumaczenie/obrót, które stosujesz, do Canvas dzieje się w kolejności, będziesz musiał cofnąć ostatnie poprawki do Canvas, lub jakoś obliczyć nowe korekty w oparciu o poprzednie przed rysowaniem tego, co chcesz narysować. To byłoby bardzo nieładne, bardzo szybko.

Używanie canvas.save() i canvas.restore() to absurdalnie prosty sposób na uproszczenie tego procesu.

Wykonując poprawki dotyczące Canvas w bloku zapisu/przywracania, skutecznie izolujesz te korekty, aby cokolwiek chcesz narysować dalej, nie będzie miało wpływu na to, co rysujesz teraz.

Teraz trochę lepsze wyjaśnienie nazwami:

canvas.save() mówi, że chcę, aby zapisać stan bieżącego Canvas „s korekt tak, że mogę wrócić do niego później.

canvas.restore() mówi, że chcę wrócić korekt moi Canvas „s powrotem do ostatniej chwili zadzwoniłem cavas.save()

Piękno jest w swojej prostocie. Jeśli już narysowałeś to, co chciałeś narysować podczas bloku zapisu/przywracania i nie potrzebujesz już tych ustawień do następnego rysunku, użyj tego, wyrzuć te niepotrzebne poprawki i wróć do stanu, w którym chcesz rozpocząć następny rysunek od.

Mamy nadzieję, że pomoże to wyjaśnić!

+2

Dziękuję bardzo za wyjaśnienie. Jeśli więc zachowamy stan, wykonamy transformację rysunku i macierzy, a następnie przywrócimy, to skutecznie usunęliśmy to, co zrobiliśmy. Więc kiedy skończymy wypłatę, wszystko będzie takie samo, jak wtedy, gdy zaczynaliśmy. Więc ta metoda była wtedy bezużyteczna, nie? Wyobrażałbym sobie, że zrobiłbyś przywrócić, gdy zaczniesz się wycofywać, a nie przywracasz na końcu. Wciąż czegoś tu brakuje, czyż nie jestem :)? – Snake

+1

"Więc ta metoda była bezużyteczna, nie?" - Zależy od tego, co masz na myśli przez bezużyteczne. Tak, następne wywołanie onDraw będzie miało stan nie dostosowany, ale właśnie tego chcesz. Po wywołaniu onDraw oznacza to, że stan Twojego Widoku się zmienił i musi zostać przerysowany, abyś mógł mieć swój Płótno w tym wyzerowanym stanie, w przeciwnym razie musiałbyś ręcznie dowiedzieć się, jak go odzyskać w celu abyś mógł dokładnie rysować ponownie. Zapisywanie/przywracanie jest trudne do zrozumienia, gdy wykonujesz tylko jedno zadanie; w rzeczywistości nie ma sensu używać go w tej sytuacji. (kontynuacja ...) – Guardanis

+2

Teraz, jeśli wykonujesz kilka różnych korekt do kilku różnych obiektów w ramach tej samej metody onDraw; nagłe zapisanie/przywrócenie staje się posłaniem Boga. Powiedzmy, że masz obiekt A, B, oba w (0,0). Chcesz przenieść A do (30,0) i B do (0,50). Pierwsze jest łatwe. przetłumacz płótno na 30. Zrobione. Teraz drugie miejsce staje się interesujące, bo nie idziesz tylko od 0 do 50 w y, przechodzisz od 30 do 0 na x, następnie od 0 do 50 na y, więc tłumaczysz (-30,50) zamiast naszego łatwego (0,50). Teraz, jeśli zrobiłeś tłumaczenia A wewnątrz zapisu/przywracania, byłbyś w stanie przetłumaczyć (ciąg dalszy ...) – Guardanis

0

Gdy masz tło złożone z wielu obiektów, najlepszym sposobem jest uratowanie tego "statycznego" tła i ponowne przerysowanie obiektów, które uległy zmianie. To oszczędza czas (procesor).

0

Praca z płótnem obejmuje wszystkie operacje tłumaczenia, skalowania, obracania, pochylania na płótnie. Metoda save() zachowuje stan przed jakimkolwiek z wyżej wymienionych ulepszeń, restore() przewija do stanu w czasie, w którym iniekcja nie jest wstrzykiwana. Innymi słowy, możesz zapisać stan sprzed transformacji płótna, wykonywać obroty i cokolwiek chcesz w trakcie procesu, ale kiedy skończysz przewijanie do stanu przed każdą rozbudową.

Powiązane problemy