2012-05-04 21 views
10

Używam SurfaceView do wyświetlania dużego obrazu (zwykle większego niż ekran, ale nie zawsze) w aplikacji na Androida. Jest to naprawdę trywialnie prosta grafika i łatwo jest zaimplementować przewijanie za pomocą OnTouchListener lub GestureDetector. Grafika działa w pętli renderowania, ale wydajność wydaje się bardziej odpowiednia dla wszystkich rzeczywistych urządzeń (emulator może być jednak trochę uciążliwy).Implementacja uszczypnięcia i powiększenia na Androidzie SurfaceView

Zastanawiam się nad zastosowaniem Pinch i Zoom na obrazie, ale wolałbym nie musieć iść do OpenGL, ponieważ mam bardzo małe doświadczenie z OpenGL i używanie OpenGL wydaje się prawie przesadą dla czegoś tak prostego. .

Wygląda na to, że klasa android.graphics.Camera może pozwolić mi na wdrożenie funkcji powiększania, która jest mi potrzebna.

Czy ktoś wie o dobrych przykładach pokazujących implementację funkcji zbliżenia typu "zbliżenia" na podstawowym Android SurfaceView?

Również, jeśli zaimplementowałeś coś takiego, myśli o wydajności? Czy OpenGL jest wart dodatkowych kłopotów, zważywszy, że to, co jest wymagane, jest tak proste?


Czy to pytanie jest niejasne, czy też brakuje mi jakiejś oślepiająco oczywistej dokumentacji/kodu na stronie programisty Androida, którą powinienem znaleźć?

+0

Szukam również czegoś takiego. Dostałeś rozwiązanie. Czy możesz to udostępnić. – Nir

+0

Niestety, nic, z czego jestem naprawdę zadowolony. Oczywiście możliwe jest "brutalne wymuszenie" powiększenia (przy użyciu GestureDetector), ale nie jest to bardzo dobre rozwiązanie i może być bardzo obciążające pamięć. –

+0

Hmm ... spójrz na ten samouczek: http://blahti.wordpress.com/2013/01/07/pan-zoom-examples-for-android/ Jeszcze tego nie sprawdziłem, ale po prostu na podstawie szybkiego spojrzenia wygląda obiecująco. –

Odpowiedz

3

OK - ostatecznie znalazłem rozwiązanie, które rozwiązało problem, który miałem.

Rozwiązanie opiera się na BitmapRegionDecoder (API10 +). Dzięki temu aplikacja może ładować się w części mapy bitowej, zamiast próbować załadować całą bitmapę za jednym razem.

Istotą rozwiązania:

  1. poddanego operacji downsamplingu banku wersję całego mapie bitowej są przechowywane w pamięci. Ponieważ ta wersja jest próbkowana, może być tam na stałe.
  2. Gwint ładuje w bieżącej rzutni (lub nieco więcej) bitmapy do pamięci w sposób ciągły (przy pomocy BitmapRegionDecoder). Ponieważ jest to co najwyżej nieco większe niż ekran, powinno to również wygodnie zmieścić się w pamięci.
  3. Wątek renderowania rysuje odpowiednią wersję na płótnie; to znaczy, gdy powiększasz lub bitmapa jest niedostępna (np. ponieważ ładuje się w tle), używana jest wersja z próbą pobrania.
  4. Przesuwanie, obrzucanie i powiększanie są obsługiwane za pomocą GestureListeners.

Podziękowania dla Johna Lombardo za pierwsze wdrożenie idei, którą znalazłem.

otworzę-pozyskiwane własną realizację wraz z niektórymi z moich innych klas użytkowych na https://github.com/micabyte/android_game

To całkiem niedawne wdrożenie, więc jej nie miał chrzest bojowy od prawdziwych użytkowników w tym czasie. Przeprowadziłem jednak testy z wyświetlaniem bitmap o rozmiarach 8000x4000 pikseli i nie miałem żadnych problemów. Wydajność z pewnością wydaje się wystarczająca dla moich potrzeb.

+0

Projekt biblioteki IT – Dilip

0

Wdrożenie szczypania i powiększania to coś, co można zrobić za pomocą kombinacji ScaleGestureDetector i interfejsu Canvas z macierzą transformacji. Będziesz chciał skorzystać z tej samej macierzy transformacji, aby obsłużyć zarówno skalę, jak i tłumaczenie.

Powiązane problemy