Kamera i widok

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Wybierz platformę: Android iOS JavaScript

Mapy dostępne w pakiecie Maps SDK na Androida można przechylać i obracać, co ułatwia użytkownikom dostosowywanie mapy do własnych potrzeb. Na każdym poziomie powiększenia możesz przesuwać mapę lub zmieniać jej perspektywę z niewielkim opóźnieniem dzięki mniejszemu śladowi kart na wektorach.

Przykładowe fragmenty kodu

W repozytorium ApiDemos na GitHubie znajduje się przykład, który pokazuje funkcje aparatu:

Wstęp

Tak jak w Mapach Google w internecie pakiet SDK Map na Androida reprezentuje powierzchnię świata (kulę sferyczną) na ekranie urządzenia (płaską płaską samolot) za pomocą projekcji miksera. W kierunku wschodnim i zachodnim mapa powtarza się w nieskończoność, bo świat owija się płynnie. W kierunku północnym i południowym mapa jest ograniczona do około 85 stopni na północ i 85 stopni na południe.

Uwaga: odwzorowanie Mercator ma skończoną szerokość, ale nieskończoną wysokość. &Obcinamy i obcinamy podstawowe obrazy mapy, wykorzystując odwzorowanie Mercator w kwocie +/-85 stopni, dzięki czemu powstały kwadrat kształtu mapy ułatwia logikę wyboru kafelków.

Maps SDK na Androida umożliwia zmianę punktu widzenia mapy przez zmodyfikowanie aparatu użytkownika.

Zmiany w aparacie nie spowodują żadnych zmian w znacznikach, nakładkach ani innych grafikach dodanych przez Ciebie, ale możesz chcieć zmienić elementy, aby lepiej pasowały do nowego widoku.

Ponieważ możesz nasłuchiwać gestów użytkownika na mapie, możesz zmienić mapę w odpowiedzi na żądania użytkowników. Na przykład metoda wywołania zwrotnego OnMapClickListener.onMapClick() reaguje na jedno kliknięcie na mapie. Ze względu na to, że metoda ta podaje szerokość i długość geograficzną miejsca kliknięcia, możesz odpowiedzieć, przesuwając lub powiększając punkt. Podobne metody są dostępne w przypadku reakcji na dotyk w przypadku znacznika oraz za pomocą gestu przeciągania na znaczniku.

Możesz też wychwytywać ruchy kamery, aby aplikacja otrzymała powiadomienie, gdy kamera zacznie się poruszać, aktualnie będzie poruszać się lub zatrzymywać. Szczegółowe informacje znajdziesz w przewodniku po zdarzeniach zmiany kamery.

Pozycja kamery

Widok mapy jest modelowany jako aparat patrzący w dół na płaskiej płaszczyźnie. Położenie kamery (a tym samym renderowanie jest mapowane) zależy od tych właściwości: miejsce docelowe (szerokość i długość geograficzna), wysunięcie, pochylenie i powiększenie.

Diagram właściwości aparatu

Cel (lokalizacja)

Cel kamery to lokalizacja wyśrodkowana mapy, podana jako współrzędna szerokości i długości geograficznej.

Szerokość geograficzna może wynosić od -85 do 85 stopni (włącznie). Wartości powyżej lub poniżej tego zakresu są zmieniane na najbliższą wartość z tego zakresu. Na przykład określenie szerokości szerokości 100 ustawia wartość na 85. Długość geograficzna od -180 do 180 stopni (włącznie). Wartości powyżej lub poniżej tego zakresu zostaną spakowane, tak aby mieściły się w zakresie (-180, 180). Na przykład parametry 480, 840 i 1200 zostaną zapakowane do 120 stopni.

Łożysko (orientacja)

Łożysk aparatu określa kierunek kompasu (mierzony w stopniach od północy północnej) do górnej krawędzi mapy. Jeśli narysujesz pionową linię od środka mapy do górnej krawędzi mapy, łoże odpowiada wynagrodzeniu nagłówka kamery (mierzonego w stopniach) względem prawdziwej północy.

Znak 0 oznacza, że górna część mapy wskazuje północ. Wartość obciążenia 90 oznacza, że wierzchołek mapy jest położony na wschód (90 stopni na kompasie). Wartość 180 oznacza, że górny punkt mapy znajduje się na południe.

Interfejs API Map Google umożliwia zmianę położenia mapy. Osoba, która prowadzi samochód, często obraca mapę, aby dopasować ją do kierunku jazdy, a turyści korzystający z mapy i kompasu zwykle obracają mapę tak, aby pionowa linia przebiegała na północ.

Pochylenie (kąt patrzenia)

Pochylenie definiuje pozycję kamery na łuku bezpośrednio nad pozycją mapy i stopień mierzenia od nadiru (kierunku bezpośrednio pod kamerą). Wartość 0 oznacza, że aparat jest skierowany prosto w dół. Wartości większe niż 0 oznaczają, że kamera jest nachylona w kierunku horyzontu o określoną liczbę stopni. Po zmianie kąta wyświetlania mapa jest wyświetlana z perspektywy, a dalsze elementy są mniejsze, a obiekty w pobliżu – większe. Ilustracja poniżej pokazuje,

Na poniższych obrazach kąt obrotu wynosi 0 stopni. Pierwszy obraz przedstawia schemat. Pozycja 1 oznacza położenie kamery, a 2 – aktualną pozycję na mapie. Powstała pod nim mapa będzie wyświetlana poniżej.

Zrzut ekranu mapy z aparatem zarejestrowanym pod kątem 0 stopni przy poziomie powiększenia 18.
Mapa wyświetlana z użyciem domyślnego kąta wyświetlania kamery.
Schemat pokazujący domyślne położenie kamery, bezpośrednio nad pozycją mapy, pod kątem 0 stopni.
Domyślny kąt nachylenia kamery.

Na poniższych obrazach kąt obrotu wynosi 45 stopni. Zwróć uwagę, że kamera przesuwa się w połowie łuku między prostym sufitem (0 stopni) a podłogą (90 stopni) do pozycji 3. Kamera nadal wskazuje punkt środkowy mapy, ale obszar reprezentowany przez linię w pozycji 4 jest teraz widoczny.

Zrzut ekranu mapy z aparatem zarejestrowanym pod kątem 45 stopni przy poziomie powiększenia 18.
Mapa jest wyświetlana pod kątem 45 stopni.
Schemat pokazujący kąt widzenia aparatu ustawiony na 45 stopni przy poziomie powiększenia jeszcze 18.
Kąt widzenia: 45 stopni.

Mapa na tym zrzucie ekranu będzie nadal wyśrodkowana w tym samym miejscu co oryginalna mapa, ale u góry mapy pojawi się więcej funkcji. W miarę zwiększania kąta ponad 45 stopni obiekty między kamerą a pozycją mapy wyglądają na proporcjonalnie większe, a elementy poza pozycją na mapie wyglądają proporcjonalnie mniejsze, co daje efekt trójwymiarowy.

Szersza

Poziom powiększenia aparatu określa skalę mapy. Na większych poziomach powiększenia na ekranie może być widać więcej szczegółów, a w przypadku mniejszych poziomów więcej obrazu można zobaczyć na ekranie. Na poziomie powiększenia na poziomie 0 skala mapy wygląda tak, że cały świat ma szerokość około 256 dp (pikseli niezależne od gęstości).

Zwiększenie poziomu powiększenia o 1 powoduje podwojenie szerokości świata na ekranie. Dlatego na poziomie powiększenia N świat ma około 256 × 2N dp. Na przykład przy powiększeniu na poziomie 2 cały świat ma około 1024 dp.

Poziom powiększenia nie musi być liczbą całkowitą. Zakres dozwolonych przez mapę poziomów powiększenia zależy od wielu czynników, w tym celu, typu mapy i rozmiaru ekranu. Każda liczba spoza zakresu zostanie przekonwertowana na następną najbliższą prawidłową wartość, która może być minimalnym lub maksymalnym powiększeniem. Na poniższej liście znajdziesz przybliżony poziom szczegółowości na każdym poziomie powiększenia:

  • 1: Świat
  • 5: Teren/kontynent
  • 10: miasto
  • 15: ulice
  • 20: budynki
Na poniższych obrazach przedstawiono wygląd różnych poziomów powiększenia:
Zrzut ekranu mapy z powiększeniem na poziomie 5
Mapa na poziomie powiększenia 5.
Zrzut ekranu mapy z powiększeniem na poziomie 15
Mapa na poziomie powiększenia 15.
Zrzut ekranu mapy na poziomie powiększenia 20
Mapa na poziomie powiększenia 20.

Przenoszenie kamery

Interfejs Maps API umożliwia zmianę, która część świata jest widoczna na mapie. Można to osiągnąć, zmieniając pozycję kamery (a nie przesuwając mapę).

Po zmianie kamery możesz wprowadzić animację jej ruchu. Animacja łączy się między bieżącymi atrybutami kamery. Możesz też ustawić czas trwania animacji.

Aby zmienić położenie kamery, musisz za pomocą CameraUpdate określić, gdzie chcesz ją przenieść. Interfejs API Map Google umożliwia tworzenie wielu różnych typów obiektów CameraUpdate za pomocą CameraUpdateFactory. Oto one:

Zmienianie poziomu powiększenia i ustawianie minimalnej/maksymalnej powiększenia

CameraUpdateFactory.zoomIn() i CameraUpdateFactory.zoomOut() udostępniają parametr CameraUpdate, który zmienia poziom powiększenia o 1,0, zachowując pozostałe właściwości.

CameraUpdateFactory.zoomTo(float) zwraca wartość CameraUpdate, która zmienia poziom powiększenia na daną wartość, zachowując pozostałe właściwości.

CameraUpdateFactory.zoomBy(float) i CameraUpdateFactory.zoomBy(float, Point) podają CameraUpdate wartość, która zwiększa (lub zmniejsza, jeśli wartość jest ujemna) poziom powiększenia o daną wartość. Ta druga opcja koryguje dany punkt na ekranie, tak aby pozostała w tej samej lokalizacji (szerokość i długość geograficzna). W tym celu może zmienić położenie kamery.

Warto ustawić preferowany minimalny lub maksymalny poziom powiększenia. Jest to przydatne na przykład w celu kontrolowania wygody użytkowników, jeśli aplikacja wyświetla określony obszar w ciekawym miejscu lub gdy stosuje się niestandardowe kafelki z ograniczonym zestawem poziomów powiększenia.

Java


private GoogleMap map;
    map.setMinZoomPreference(6.0f);
    map.setMaxZoomPreference(14.0f);

      

Kotlin


private lateinit var map: GoogleMap

    map.setMinZoomPreference(6.0f)
    map.setMaxZoomPreference(14.0f)

      

Istnieją kwestie techniczne, które mogą uniemożliwiać użytkownikom zbyt duże lub zbyt duże powiększenie. Na przykład satelita lub teren mogą mieć niższe maksymalne powiększenie niż kafelki mapy podstawowej.

Zmiana położenia kamery

Istnieją 2 metody dogodnego położenia. CameraUpdateFactory.newLatLng(LatLng) udostępnia CameraUpdate, który zmienia szerokość i długość geograficzną aparatu przy zachowaniu wszystkich pozostałych właściwości. CameraUpdateFactory.newLatLngZoom(LatLng, float) CameraUpdate zmienia szerokość i długość geograficzną kamery oraz długość i powiększenie przy zachowaniu wszystkich pozostałych właściwości.

Aby uzyskać pełną elastyczność przy zmienianiu pozycji kamery, użyj właściwości CameraUpdateFactory.newCameraPosition(CameraPosition), dzięki której obiekt CameraUpdate może przesuwać kamerę w określone miejsce. CameraPosition można uzyskać bezpośrednio, używając new CameraPosition() lub CameraPosition.Builder za pomocą new CameraPosition.Builder().

Przesunięcie (przewijanie)

W polu CameraUpdateFactory.scrollBy(float, float) wyświetlana jest wartość CameraUpdate, która powoduje zmianę szerokości i długości geograficznej kamery tak, aby mapa przesunęła się o określoną liczbę pikseli. Dodatnia wartość X powoduje przesunięcie kamery w prawo, dzięki czemu mapa wydaje się przesuwać w lewo. Dodatnia wartość y powoduje przesunięcie kamery w dół, tak aby mapa mogła się przesunąć w górę. Natomiast wartości ujemne x powodują przesunięcie kamery w lewo, co powoduje przesunięcie mapy w prawo, a ujemne wartości Y, czyli przesunięcie w górę kamery. Przewijanie jest względem aktualnej orientacji kamery. Jeśli na przykład kamera ma 90 stopni, kierunek wschodni jest „&”.

Ustawianie granic

Ustawianie granic mapy

Czasem warto przesunąć kamerę w taki sposób, żeby widoczny obszar był widoczny na jak największym poziomie. Jeśli na przykład wyświetlasz wszystkie stacje benzynowe w promieniu pięciu kilometrów od bieżącej pozycji użytkownika, możesz przesunąć kamerę, tak aby były widoczne na ekranie. Aby to zrobić, musisz najpierw obliczyć wartość LatLngBounds, która ma być widoczna na ekranie. Następnie możesz użyć właściwości CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding), by uzyskać CameraUpdate, który powoduje zmianę położenia kamery w taki sposób, aby podane miejsce LatLngBounds było całkowicie dopasowane do mapy, z uwzględnieniem dopełnienia (w pikselach). Zwrócona wartość CameraUpdate zapewnia, że przerwa (w pikselach) między określonymi granicami i krawędzią mapy będzie taka sama jak określone dopełnienie. Pamiętaj, że pochylenie i wyrównanie mapy będzie wynosić 0.

Java


LatLngBounds australiaBounds = new LatLngBounds(
    new LatLng(-44, 113), // SW bounds
    new LatLng(-10, 154)  // NE bounds
);
map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0));

      

Kotlin


val australiaBounds = LatLngBounds(
    LatLng((-44.0), 113.0),  // SW bounds
    LatLng((-10.0), 154.0) // NE bounds
)
map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0))

      

Środkowanie mapy na danym obszarze

W niektórych przypadkach warto ustawić aparat w granicach, a nie w skrajnych zakresach. Może to być np. wyśrodkowanie kamery na kraju przy jednorazowym powiększeniu. W tym przypadku możesz użyć podobnej metody, tworząc LatLngBounds i używając właściwości CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom) z LatLngBounds.Metoda getCenter(). Metoda getCenter() zwróci centrum geograficzne LatLngBounds.

Java


LatLngBounds australiaBounds = new LatLngBounds(
    new LatLng(-44, 113), // SW bounds
    new LatLng(-10, 154)  // NE bounds
);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.getCenter(), 10));

      

Kotlin


val australiaBounds = LatLngBounds(
    LatLng((-44.0), 113.0),  // SW bounds
    LatLng((-10.0), 154.0) // NE bounds
)
map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.center, 10f))

      

Przeciążenie tej metody umożliwia newLatLngBounds(boundary, width, height, padding) określanie szerokości i wysokości w pikselach w przypadku prostokąta, przy założeniu, że odpowiadają one wymiarom mapy. Prostokąt jest ustawiony w taki sposób, że jego środek jest taki sam jak w widoku mapy (żeby podane wymiary były takie same jak w widoku mapy, kwadrat zbiega się z widokiem mapy). Zwrócona wartość CameraUpdate spowoduje przesunięcie kamery w taki sposób, aby określony obszar LatLngBounds był wyśrodkowany na ekranie w ramach danego prostokąta przy jak największym powiększeniu, biorąc pod uwagę wymagane dopełnienie.

Uwaga: użyj prostszej metody newLatLngBounds(boundary, padding), aby wygenerować właściwość CameraUpdate, jeśli będzie ona służyć do przesuwania kamery po zmianie układu mapy. Podczas układu interfejs API oblicza granice wyświetlania, które są potrzebne do poprawnego pokazania ramki granicznej. Dla porównania możesz użyć wartości CameraUpdate zwróconej przez bardziej złożoną metodę newLatLngBounds(boundary, width, height, padding) w dowolnym momencie, nawet jeśli mapa zostanie obliczona, ponieważ interfejs API oblicza granice na podstawie przekazywanych argumentów.

Ograniczenie przesuwania użytkownika do określonego obszaru

W powyższych scenariuszach ustawiasz granice mapy, ale użytkownik może je przewijać lub przesuwać. Zamiast tego możesz ograniczyć granice obszaru środkowego na mapie (element docelowy kamery), tak aby użytkownicy mogli ją przesuwać i przesuwać tylko w tych granicach. Na przykład aplikacja służąca do obsługi centrum handlowego lub lotniska może ograniczać mapę do określonych granic, umożliwiając użytkownikom przewijanie i przesunięcie w obrębie tych granic.

Java


// Create a LatLngBounds that includes the city of Adelaide in Australia.
LatLngBounds adelaideBounds = new LatLngBounds(
    new LatLng(-35.0, 138.58), // SW bounds
    new LatLng(-34.9, 138.61)  // NE bounds
);

// Constrain the camera target to the Adelaide bounds.
map.setLatLngBoundsForCameraTarget(adelaideBounds);

      

Kotlin


// Create a LatLngBounds that includes the city of Adelaide in Australia.
val adelaideBounds = LatLngBounds(
    LatLng(-35.0, 138.58),  // SW bounds
    LatLng(-34.9, 138.61) // NE bounds
)

// Constrain the camera target to the Adelaide bounds.
map.setLatLngBoundsForCameraTarget(adelaideBounds)

      

Poniższy diagram przedstawia sytuację, gdy cel kamery jest ograniczony do obszaru, który jest nieco większy od widocznego obszaru. Użytkownik może przewijać i przesuwać, pod warunkiem, że cel kamery nie wykracza poza ograniczony obszar. Krzyż reprezentuje cel aparatu:

Schemat przedstawiający latarki, które mają większy rozmiar niż widoczny obszar

Mapa zawsze wypełnia widoczny obszar, nawet jeśli widoczne obszary znajdują się poza zdefiniowanymi granicami. Jeśli na przykład ustawisz kamerę w rogu ograniczonej części, widoczny obszar będzie widoczny w widocznym obszarze, ale użytkownicy nie będą mogli przewijać go do przodu. Poniższy scenariusz przedstawia ten scenariusz. Krzyż reprezentuje cel kamery:

Schemat przedstawiający cel pozycji aparatu umieszczony w prawym dolnym rogu kamery LatLngBound.

Na tym diagramie cel kamery ma bardzo ograniczone granice, co daje użytkownikowi niewiele możliwości przewijania lub przesuwania mapy. Krzyż reprezentuje cel aparatu:

Schemat przedstawiający latarki, które są mniejsze niż widoczny obszar

Aktualizowanie widoku kamery

Aby zastosować na mapie obiekt CameraUpdate, możesz przesunąć kamerę od razu lub płynnie uruchomić animację. Aby od razu przenieść kamerę pod kątem wybranego elementu CameraUpdate, możesz zadzwonić do GoogleMap.moveCamera(CameraUpdate).

Możesz wprowadzić zmiany, aby uatrakcyjnić wygląd strony, zwłaszcza w przypadku krótkich ruchów. Aby to zrobić, zamiast łączyć się z GoogleMap.moveCamera zadzwoń pod numer GoogleMap.animateCamera. Mapa zostanie płynnie przeniesiona do nowych atrybutów. Szczegółowa metoda GoogleMap.animateCamera(cameraUpdate, duration, callback) zawiera 3 argumenty:

cameraUpdate
CameraUpdate opisujący, gdzie przenieść aparat.
callback
Obiekt implementujący GoogleMap.CancellableCallback. Ten ujednolicony interfejs do obsługi zadań definiuje 2 metody „onCancel()” i „onFinished()”. W przypadku animacji metody są wywoływane w tych sytuacjach:
onFinish()
Wywoływane, gdy animacja zakończy się bez zakłóceń.
onCancel()

Wywoływane, jeśli animacja zostanie przerwana, wywołując polecenie stopAnimation() lub uruchamiając nowy ruch kamery.

Inną przyczyną może być wywołanie elementu GoogleMap.stopAnimation().

duration
Oczekiwany czas trwania animacji w milisekundach jako int.

Poniżej znajdziesz fragmenty kodu, które pokazują, jak przesuwać aparat.

Java


LatLng sydney = new LatLng(-33.88,151.21);
LatLng mountainView = new LatLng(37.4, -122.1);

// Move the camera instantly to Sydney with a zoom of 15.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15));

// Zoom in, animating the camera.
map.animateCamera(CameraUpdateFactory.zoomIn());

// Zoom out to zoom level 10, animating with a duration of 2 seconds.
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

// Construct a CameraPosition focusing on Mountain View and animate the camera to that position.
CameraPosition cameraPosition = new CameraPosition.Builder()
    .target(mountainView )      // Sets the center of the map to Mountain View
    .zoom(17)                   // Sets the zoom
    .bearing(90)                // Sets the orientation of the camera to east
    .tilt(30)                   // Sets the tilt of the camera to 30 degrees
    .build();                   // Creates a CameraPosition from the builder
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

      

Kotlin


val sydney = LatLng(-33.88, 151.21)
val mountainView = LatLng(37.4, -122.1)

// Move the camera instantly to Sydney with a zoom of 15.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15f))

// Zoom in, animating the camera.
map.animateCamera(CameraUpdateFactory.zoomIn())

// Zoom out to zoom level 10, animating with a duration of 2 seconds.
map.animateCamera(CameraUpdateFactory.zoomTo(10f), 2000, null)

// Construct a CameraPosition focusing on Mountain View and animate the camera to that position.
val cameraPosition = CameraPosition.Builder()
    .target(mountainView) // Sets the center of the map to Mountain View
    .zoom(17f)            // Sets the zoom
    .bearing(90f)         // Sets the orientation of the camera to east
    .tilt(30f)            // Sets the tilt of the camera to 30 degrees
    .build()              // Creates a CameraPosition from the builder
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))