Mapy w pakiecie Maps SDK na Androida można łatwo przechylać i obracać. za pomocą gestów, co daje użytkownikom możliwość dostosowania mapy do orientacji, co ma dla nich sens. Na dowolnym poziomie powiększenia możesz przesunąć mapę lub zmienić jej poziom z niewielkim opóźnieniem wynikającym z niewielkich rozmiarów wektorowych fragmentów mapy.
Przykładowe fragmenty kodu
Repozytorium API Apigee na GitHubie zawiera przykład, przedstawia funkcje aparatu:
- CameraDemoActivity – Kotlin: zmiana pozycji kamery
- CameraDemoActivity (Java): zmiana pozycji kamery
Wprowadzenie
Podobnie jak Mapy Google w internecie, pakiet Maps SDK na Androida reprezentuje powierzchnię świata (sferę) na ekranie urządzenia (płaską płaszczyznę) za pomocą Odwzorowanie metryczne. We wschodniej i zachodniej części mapy w nieskończoność, tak jak świat płynnie się wokół siebie. W kierunek północny i południowy jest ograniczony do około 85 stopni na północ i 85 stopni na południe.
Uwaga: odwzorowanie Merkatora ma skończoną szerokość. na długość, ale na nieskończoną wysokość. „Zakończyliśmy” mapa podstawowa z użyciem odwzorowania Merkatora pod kątem około +/-85 stopni do zmieni kształt mapy na kwadrat, co ułatwi logikę wyboru.
Maps SDK na Androida pozwala zmienić punkt widzenia użytkownika mapy, modyfikując jej aparat.
Zmiany w aparacie nie spowodują żadnych zmian w znacznikach, nakładkach ani innych dodanych grafik, ale możesz też zmienić je, z nowym widokiem.
Możesz nasłuchiwać gestów użytkowników na mapie, więc możesz zmienić mapę w
odpowiadania na prośby użytkowników. Na przykład metoda wywołania zwrotnego
OnMapClickListener.onMapClick()
odpowiada na
jedno kliknięcie na mapie. Ponieważ metoda otrzymuje szerokość i długość geograficzną
miejsca kliknięcia, możesz zareagować, przesuwając lub powiększając widok do tego punktu.
Podobne metody są dostępne w przypadku kliknięć w dymku znacznika lub
za reagowanie na gest przeciągania na znaczniku.
Możesz też nasłuchiwać ruchów kamery, aby aplikacja odbierała powiadomienie, gdy kamera zacznie się poruszać, w danym momencie porusza się lub się zatrzyma ruchu. Szczegółowe informacje znajdziesz w przewodniku po zdarzeniach zmiany kamery.
Położenie kamery
Widok mapy jest modelowany jako kamera patrząca w dół na płaskiej płaszczyźnie. Pozycja kamery (a tym samym renderowanie mapy) są określane przez te właściwości: target (szerokość/długość geograficzna), bearing, przechyla, oraz powiększenie.
Cel (lokalizacja)
Cel kamery to lokalizacja środka mapy, określona jako 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 zostanie ograniczona do najbliższej wartości z tego zakresu. Na przykład szerokość geograficzna równa 100 powoduje ustawienie wartości 85. Długość geograficzna mieści się w zakresie od -180 do 180 stopni włącznie. Wartości powyżej lub poniżej tej wartości zakres zostanie zawijany w taki sposób, aby mieścił się w zakresie (-180, 180). Dla: Na przykład 480, 840 i 1200 zostaną zapakowane w zakresie 120 stopni.Orientacja
Orientacja kamery określa kierunek kompasu, mierzony w stopniach od rzeczywistej północy, odpowiadając do górnej krawędzi mapy. Jeśli narysujesz pionową linię od środka mapy do górnej krawędzi położenie na mapie, położenie odpowiada kierunkowi kamery (mierzonemu w stopniach) do północy geograficznej.
Orientacja 0 oznacza, że góra mapy wskazuje rzeczywistą północ. Wartość kierunku 90 oznacza, że góra mapy jest skierowana we wschód (90 stopni na kompasie). Wartość A 180 oznacza górną część mapy wskazujący kierunek południowy.
Interfejs API Map Google umożliwia zmianę kierunku mapy. Na przykład gdy ktoś jedzie samochodem często zmienia mapę, wyrównując ją z kierunkiem podróży, a turyści korzystają z mapy, kompas zazwyczaj ustala mapę tak, aby pionowa linia wskazywała północ.
Pochylenie (kąt patrzenia)
Pochylenie określa położenie kamery na łuku bezpośrednio nad mapą położenie środkowe, mierzone w stopniach od Nadir (kierunek skierowany bezpośrednio pod aparatem). Wartość 0 oznacza, że aparat jest skierowany. prosto w dół. Wartości większe niż 0 odpowiadają kamerze, która jest nachylona w kierunku horyzontu o określoną liczbę stopni. Po zmianie kąta patrzenia mapa jest wyświetlana w perspektywie z odległymi obiektami mniejsze, a pobliskie obiekty wydają się większe. Poniżej ilustracje.
Na poniższych obrazach kąt patrzenia wynosi 0 stopni. Pierwszy obraz przedstawia to schematy, pozycja 1 to pozycja kamery, a pozycja 2 to bieżąca pozycja na mapie. Powstała mapa jest widoczna pod nią.
Na poniższych obrazach kąt patrzenia wynosi 45 stopni. Zwróć uwagę, że kamera porusza się do połowy łuku między głowem prostym (0 stopni) a podłożem (90 stopni), w pozycji 3. Aparat nadal wskazuje środek mapy, ale obszar reprezentowana przez linię w pozycji 4 jest teraz widoczna.
Mapa na tym zrzucie ekranu jest wciąż wyśrodkowana w tym samym punkcie, co w oryginalnej mapy, ale na jej górze pojawiło się więcej obiektów. Gdy zwiększ kąt powyżej 45 stopni, elementy między aparatem a mapą położenie jest proporcjonalnie większe, a obiekty poza położeniem na mapie wydawać się proporcjonalnie mniejsze, co daje efekt trójwymiarowy.
Zoom
Poziom powiększenia kamery określa skalę mapy. Przy większym powiększeniu bardziej szczegółowa jest widoczność na ekranie przy mniejszym powiększeniu. więcej informacji ze świata jest widoczne na ekranie. Przy poziomie powiększenia 0 skala Mapa jest taka, że cały świat ma szerokość około 256 dp. (piksele niezależne od gęstości).
Zwiększenie poziomu powiększenia o 1 powoduje podwojenie szerokości ekranu. Dlatego przy powiększeniu N szerokość świata wynosi około 256 * 2N dp. Na przykład przy powiększeniu 2 cały świat jest ustawiony na około Szerokość 1024 dp.
Poziom powiększenia nie musi być liczbą całkowitą. Zakres powiększenia poziomy dozwolone przez mapę zależą od wielu czynników, w tym od wartości docelowej, typu mapy i rozmiaru ekranu. Każda liczba spoza zakresu zostanie przekonwertowana na następną najbliższą prawidłową wartością, którą może być minimalny poziom powiększenia maksymalny poziom powiększenia. Poniższa lista pokazuje przybliżony poziom szczegółowości które możesz zobaczyć przy każdym powiększeniu:
- 1: Świat
- 5: Ląd/kontynent
- 10: Miasto
- 15: Ulice
- 20. Budynki
Poruszanie aparatem
W interfejsie API Map Google możesz wybrać, która część świata jest widoczna na mapy. Służy do tego zmiana położenia kamery (w przeciwieństwie do przesunięcie mapy).
Po zmianie aparatu możesz animować wynikowy obraz ruch kamery. Animacja interpoluje się między bieżącym aparatem i nowych atrybutach aparatu. Możesz też określić czas trwania animacji.
Aby zmienić pozycję kamery, musisz określić, gdzie ma się ona znajdować
przesuń kamerę za pomocą CameraUpdate
. Interfejs API Map Google
pozwala na tworzenie wielu różnych typów CameraUpdate
za pomocą
CameraUpdateFactory
Dostępne są te ustawienia:
Zmiana poziomu powiększenia oraz ustawienie minimalnego/maksymalnego powiększenia
CameraUpdateFactory.zoomIn()
i
CameraUpdateFactory.zoomOut()
uzyskasz CameraUpdate
, który zmienia poziom powiększenia o 1,0, przy zachowaniu
z pozostałymi właściwościami.
CameraUpdateFactory.zoomTo(float)
daje wartość CameraUpdate
, która zmienia poziom powiększenia na podaną wartość,
bez zmian we wszystkich pozostałych właściwościach.
CameraUpdateFactory.zoomBy(float)
oraz
CameraUpdateFactory.zoomBy(float, Point)
otrzymasz CameraUpdate
, który rośnie (lub maleje, jeśli wartość jest
ujemnego poziomu powiększenia o podaną wartość. To ostatnie określa dany punkt
na ekranie, tak aby pozostało w tej samej lokalizacji (szerokość/długość geograficzna).
i może zmienić jego położenie.
Warto ustawić preferowany minimalny lub maksymalny poziom powiększenia. Jest to przydatne na przykład wtedy, gdy chcesz kontrolować sposób, w jaki użytkownik korzysta z aplikacji, gdy wyświetla się w określonym obszarze wokół ciekawego miejsca, a jeśli korzystasz z niestandardowego kafelka z nakładką z ograniczonym zestawem poziomów powiększenia.
Kotlin
private lateinit var map: GoogleMap map.setMinZoomPreference(6.0f) map.setMaxZoomPreference(14.0f)
Java
private GoogleMap map; map.setMinZoomPreference(6.0f); map.setMaxZoomPreference(14.0f);
Pamiętaj, że ze względów technicznych mogą one uniemożliwiać które umożliwiają użytkownikom zbyt małe lub zbyt duże powiększenie. Na przykład Satelita lub ukształtowanie terenu może mieć niższe maksymalne powiększenie niż podstawowe kafelki mapy.
Zmiana pozycji kamery
Są 2 wygodne metody wprowadzania typowych zmian pozycji.
CameraUpdateFactory.newLatLng(LatLng)
daje CameraUpdate
, który zmienia szerokość i długość geograficzną kamery,
przy zachowaniu pozostałych właściwości.
CameraUpdateFactory.newLatLngZoom(LatLng, float)
daje CameraUpdate
, który zmienia
szerokości i długości geograficznej oraz powiększenia przy zachowaniu wszystkich pozostałych właściwości.
Aby mieć pełną swobodę zmiany pozycji kamery, użyj
CameraUpdateFactory.newCameraPosition(CameraPosition)
Dzięki temu masz CameraUpdate
, który przenosi kamerę w
daną pozycję. CameraPosition
można uzyskać bezpośrednio przy użyciu
new CameraPosition()
lub w połączeniu z usługą CameraPosition.Builder
w przypadku:
new CameraPosition.Builder()
Przesuwanie (przewijanie)
CameraUpdateFactory.scrollBy(float, float)
daje Ci CameraUpdate
, który
zmienia szerokość i długość geograficzną kamery w taki sposób, że mapa jest przesuwana
określoną liczbę pikseli. Dodatnia wartość x powoduje przesunięcie kamery
w prawo, aby mapa przesunęła się w lewo. A dodatnie y
powoduje przesuwanie kamery w dół, sprawiając, że mapa się przesunęła
w górę. I na odwrót, wartości ujemne powodują przesuwanie kamery w lewo,
że mapa przesunęła się w prawo, a ujemne wartości y powodują
aby przesunąć kamerę w górę. Przewijanie zależy od bieżącego ustawienia kamery
orientacji ekranu. Jeśli na przykład kamera jest ustawiona na 90 stopni, kierunek wschód
jest „w górę”.
Wyznaczanie granic
Wyznaczanie granic mapy
Czasami warto przenieść
dzięki czemu cały interesujący Cię obszar jest widoczny
poziom powiększenia. Jeśli na przykład wyświetlasz wszystkie stacje benzynowe w okolicy:
na odległość 8 km od bieżącej pozycji użytkownika, możesz przesunąć kamerę tak,
aby były widoczne na ekranie. Aby to zrobić, najpierw oblicz
LatLngBounds
, które mają być widoczne na ekranie. Ty
może następnie użyć CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int
padding)
, aby uzyskać CameraUpdate
do zmiany aparatu
położenie w taki sposób, aby dane LatLngBounds
pasowały w całości do mapy, co
biorąc pod uwagę
określone dopełnienie (w pikselach). Zwrócona wartość CameraUpdate
zapewnia przerwę (w pikselach) między podanymi granicami a krawędzią
mapa będzie równa co najmniej określonemu dopełnieniu. Pamiętaj, że funkcja przechylenia
przesunięcie mapy będzie wynosić 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))
Java
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0));
Wyśrodkowanie mapy na obszarze
W niektórych przypadkach warto wyśrodkować kamerę w określonym obszarze, a nie
łącznie z granicami skrajnymi. Aby na przykład wyśrodkować kamerę na kraju
utrzymując stałe powiększenie. W takim przypadku możesz użyć podobnej metody,
po utworzeniu LatLngBounds
i przy użyciu funkcji
CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom)
z
LatLngBounds
Metoda getCenter()
. Metoda getCenter() zwraca
centrum geograficznego LatLngBounds
.
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))
Java
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.getCenter(), 10));
Przeciążenie metody, newLatLngBounds(boundary, width, height,
padding)
pozwala określić szerokość i wysokość w pikselach
w taki sposób, aby odpowiadały one wymiarom
mapy. Prostokąt jest tak umieszczony, że jego środek jest taki sam jak
widoku mapy (jeśli określone wymiary są takie same jak
widoku mapy, wtedy prostokąt zbiega się z widokiem mapy).
zwrócona wartość CameraUpdate
przesunie kamerę tak, że określony
LatLngBounds
są wyśrodkowane na ekranie wewnątrz danego prostokąta w
największego możliwego poziomu powiększenia, biorąc pod uwagę wymagane dopełnienie.
Uwaga: używaj tylko prostszej metody
newLatLngBounds(boundary, padding)
aby wygenerować CameraUpdate
, jeśli ma być używany do przenoszenia
gdy już zmienisz układ mapy. Podczas tworzenia układu interfejs API
oblicza granice wyświetlania mapy, które są niezbędne do poprawnego
i wyświetlić ramkę ograniczającą. Dla porównania możesz użyć atrybutu
Funkcja CameraUpdate
zwrócona przez bardziej złożoną metodę
newLatLngBounds(boundary, width, height, padding)
w dowolnym momencie, jeszcze przed zmianą układu mapy, ponieważ interfejs API
oblicza granice wyświetlania na podstawie przekazywanych argumentów.
Ograniczanie przesuwania w danym obszarze przez użytkownika
W powyższych scenariuszach ustalasz granice dla mapy, a użytkownik które można przewijać lub przesunąć poza te granice. Zamiast tego lepiej będzie: ograniczyć granicę środka szerokości i długości geograficznej punktu fokalnego mapy (kamera cel), dzięki czemu użytkownicy mogą tylko przewijać i przesuwać tylko w obrębie tych granic. Przykład: w przypadku aplikacji dla sklepów w centrum handlowym lub na lotnisku może być konieczne ograniczenie mapy określonych granic, co umożliwia użytkownikom przewijanie i przesuwanie w obrębie tych granic.
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)
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);
Poniższy diagram przedstawia scenariusz, w którym cel kamery to ograniczony do obszaru, który jest nieco większy niż widoczny obszar. Użytkownik może przewijanie i przesuwanie, pod warunkiem że cel kamery pozostaje w ograniczonym obszarze. krzyżyk oznacza cel kamery:
Mapa zawsze wypełnia widoczny obszar, nawet jeśli spowoduje to obszary znajdujące się poza zdefiniowanymi granicami. Jeśli na przykład umieścisz parametr cel kamery w rogu ograniczonego obszaru, widoczne w widocznym obszarze, ale użytkownicy nie mogą przewinąć do tego obszaru. ilustruje ten scenariusz: Krzyż oznacza aparat cel:
Na poniższym schemacie cel kamery ma bardzo ograniczone granice. oferowanie użytkownikowi jak najmniejszej możliwości przewijania lub przesuwania mapy. Krzyż reprezentuje cel kamery:
Aktualizuję obraz z kamery
Aby zastosować na mapie element CameraUpdate
, możesz przenieść
lub płynnie ją animować. Aby przesunąć kamerę
przy użyciu CameraUpdate
, możesz zadzwonić
GoogleMap.moveCamera(CameraUpdate)
Możesz sprawić, że wrażenia użytkowników będą bardziej przyjemne,
zwłaszcza w przypadku krótkich ruchów,
animując tę zmianę. Aby to zrobić zamiast dzwonić
GoogleMap.moveCamera
zadzwoń
GoogleMap.animateCamera
Nowe atrybuty mapy zostaną płynnie przeniesione. Najbardziej szczegółowa forma tej metody
GoogleMap.animateCamera(cameraUpdate, duration, callback)
,
Podaje 3 argumenty:
cameraUpdate
CameraUpdate
który opisuje, gdzie przesunąć kamerę.callback
- Obiekt, który implementuje
GoogleMap.CancellableCallback
Ten uogólniony interfejs obsługi zadań definiuje 2 metody „onCancel()” i „onFinished()”. W przypadku animacji metody są wywoływane w zachodzą te okoliczności:onFinish()
- Wywoływana, jeśli animacja zostanie odtworzona bez zakłóceń.
onCancel()
-
Wywoływana, jeśli animacja została przerwana przez wywołanie
stopAnimation()
lub rozpoczyna nowy ruch kamerą.Może się to również zdarzyć, gdy zadzwonisz
GoogleMap.stopAnimation()
duration
- Oczekiwany czas trwania animacji w milisekundach w formie
int
.
Poniższe fragmenty kodu ilustrują niektóre typowe sposoby przenoszenia aparat fotograficzny.
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))
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));