Staram się zrozumieć proces rysowania, SurfaceView
a tym samym cały Surface
/ Canvas
/ Bitmap
system, który jest używany w Androidzie.
Przeczytałem wszystkie artykuły i strony dokumentacji API, które udało mi się znaleźć na stronie dla programistów Androida, kilka samouczków z grafiką Androida, kod źródłowy LunarLander i to pytanie .
Proszę, powiedz mi, które z tych stwierdzeń są prawdziwe, a które nie, i dlaczego.
Canvas
ma swoje własneBitmap
dołączone do niego.Surface
ma swoje własneCanvas
dołączone do niego.- Wszystkie
View
okna współdzielą to samo,Surface
a zatem współużytkują to samoCanvas
. SurfaceView
jest podklasąView
, która, w przeciwieństwie do innychView
podklas iView
sama w sobie, ma swoje własneSurface
rysunki.
Jest jeszcze jedno dodatkowe pytanie:
- Po co jest potrzebna
Surface
klasa, skoro już istniejeCanvas
dla operacji wysokiego poziomu z bitmapą. Podaj przykład sytuacji, w którejCanvas
nie nadaje się do wykonywania pracy, którąSurface
można wykonać.
android
android-canvas
surfaceview
fyodorananiev
źródło
źródło
Odpowiedzi:
Oto kilka definicji:
Powierzchnia to obiekt zawierający piksele, które są komponowane na ekranie. Każde okno, które widzisz na ekranie (okno dialogowe, aktywność na pełnym ekranie, pasek stanu) ma własną powierzchnię, do której wciąga, a Surface Flinger renderuje je na ostateczny ekran w prawidłowej kolejności Z. Powierzchnia zwykle ma więcej niż jeden bufor (zwykle dwa) do renderowania podwójnie buforowanego: aplikacja może rysować swój następny stan interfejsu użytkownika, podczas gdy powierzchnia odrzutnika komponuje ekran przy użyciu ostatniego bufora, bez konieczności czekania na zakończenie aplikacji rysunek.
Okno przypomina w zasadzie okno na pulpicie. Ma pojedynczą powierzchnię, w której renderowana jest zawartość okna. Aplikacja współdziała z Menedżerem okien w celu tworzenia okien; Menedżer okien tworzy powierzchnię dla każdego okna i przekazuje ją aplikacji do rysowania. Aplikacja może rysować na powierzchni, co chce; dla Menedżera okien jest to tylko nieprzezroczysty prostokąt.
Widok to interaktywny element interfejsu użytkownika wewnątrz okna. Okno ma dołączoną pojedynczą hierarchię widoków, która zapewnia całe zachowanie okna. Ilekroć okno wymaga ponownego narysowania (na przykład, ponieważ widok sam się unieważnił), jest to robione na powierzchni okna. Powierzchnia jest zablokowana, co zwraca kanwę, której można użyć do narysowania na niej. Przechodzenie przez rysowanie jest wykonywane w dół hierarchii, przekazując kanwę w dół dla każdego widoku, aby narysować jego część interfejsu użytkownika. Po zakończeniu Surface jest odblokowywany i publikowany, dzięki czemu właśnie narysowany bufor jest zamieniany na pierwszy plan, aby następnie zostać złożony na ekranie przez Surface Flinger.
SurfaceView to specjalna implementacja View, która tworzy również własną dedykowaną powierzchnię, do której aplikacja może bezpośrednio rysować (poza normalną hierarchią widoków, która w przeciwnym razie musi współużytkować pojedynczą powierzchnię dla okna). Sposób, w jaki to działa, jest prostszy, niż można by się spodziewać - wszystko, co robi SurfaceView, to poproszenie menedżera okien o utworzenie nowego okna, nakazanie mu uporządkowania tego okna bezpośrednio za lub przed oknem SurfaceView i ustawienie go tak, aby pasowało gdzie SurfaceView pojawia się w oknie zawierającym. Jeśli powierzchnia jest umieszczana za oknem głównym (w kolejności Z), SurfaceView również wypełnia swoją część okna głównego przezroczystością, aby powierzchnia była widoczna.
Mapa bitowa to tylko interfejs do niektórych danych pikseli. Piksele mogą być przydzielane przez samą Bitmapę, gdy tworzysz ją bezpośrednio, lub mogą wskazywać na piksele, których nie posiada, na przykład to, co wewnętrznie zdarza się podpiąć kanwę do powierzchni w celu rysowania. (Mapa bitowa jest tworzona i wskazywana na bieżący bufor rysunku powierzchni).
Należy również pamiętać, że, jak to sugeruje, SurfaceView jest dość ciężkim obiektem. Jeśli masz wiele SurfaceViews w konkretnym interfejsie użytkownika, zatrzymaj się i zastanów się, czy jest to naprawdę potrzebne. Jeśli masz więcej niż dwa, prawie na pewno za dużo.
źródło
#hackbod's
odpowiedziSurfaceView
można również renderować z wątku wtórnego, co nie jest możliwe w przypadkuView
obiektówOto bardzo podstawowy i prosty przegląd pojęciowy dotyczący interakcji między oknem, powierzchnią, kanwą i mapą bitową.
Czasami reprezentacja wizualna bardzo pomaga w zrozumieniu pokręconych koncepcji.
Mam nadzieję, że ta grafika mogłaby komuś pomóc.
źródło
Bitmapa to po prostu opakowanie dla kolekcji pikseli. Pomyśl o tym jako o tablicy pikseli z innymi wygodnymi funkcjami.
Canvas to po prostu klasa zawierająca wszystkie metody rysowania. Jest podobna do klasy Graphics w AWT / Swing, jeśli jesteś z nią zaznajomiony. Cała logika dotycząca rysowania koła, ramki itp. Znajduje się w kanwie. Kanwa rysuje się na mapie bitowej lub otwartym kontenerze GL, ale nie ma powodu, aby w przyszłości mogła zostać rozszerzona w celu rysowania na innych typach rastrów.
SurfaceView to widok zawierający Surface. Powierzchnia jest podobna do mapy bitowej (zawiera magazyn pikseli). Nie wiem, w jaki sposób jest zaimplementowany, ale wyobrażam sobie, że jest to rodzaj opakowania bitmapy z dodatkowymi metodami dla rzeczy, które są bezpośrednio związane z wyświetlaniem na ekranie (to jest powód dla powierzchni, mapa bitowa jest zbyt ogólna). Możesz pobrać kanwę ze swojej powierzchni, która naprawdę uzyskuje kanwę skojarzoną z bazową mapą bitową.
Twoje pytania.
Tak, płótno działa na mapie bitowej (lub otwartym panelu GL). Surface zapewnia kanwę działającą na dowolnym urządzeniu Surface używanym do przechowywania pikseli w stylu mapy bitowej.
Nie. Możesz mieć dowolną liczbę widoków powierzchni.
Tak. Podobnie jak ListView jest podklasą View, która ma własną strukturę danych List. Każda podklasa View robi coś innego.
źródło
Bitmap
czySurface
są to tylko różne rodzaje sklepów pikselowych i czyCanvas
można zawinąć którykolwiek z nich?