W tym temacie opisano konfigurowanie mapy dodanej do aplikacji na Androida za pomocą pakietu Maps SDK na Androida.
Omówienie
Po dodaniu mapy do aplikacji możesz skonfigurować jej ustawienia początkowe i ustawienia w czasie działania. Ustawienia początkowe należy skonfigurować w zależności od tego, czy kontener mapy (SupportMapFragment
czy MapView
) został dodany w sposób statyczny czy dynamiczny. Jeśli kontener mapy został dodany statycznie, możesz skonfigurować początkowe ustawienia mapy w pliku układu.
Jeśli został dodany dynamicznie, możesz skonfigurować początkowe ustawienia w zwrotnym wywołaniu OnCreate
z obiektem GoogleMapOptions
.
Szczegółowe informacje o dodawaniu kontenera mapy znajdziesz w artykule Dodawanie mapy.
Do wstępnych ustawień mapy należą:
- Pozycja kamery, w tym lokalizacja, powiększenie, kierunek i pochylenie. Szczegółowe informacje o pozycji kamery znajdziesz w sekcji Kamera i widok.
- Typ mapy.
- Elementy interfejsu do wyświetlenia, takie jak przyciski powiększania i kompas.
- Gesty, które chcesz włączyć.
- Czy włączona jest wersja uproszczona.
W czasie wykonywania kodu możesz konfigurować te ustawienia i niektóre dodatkowe ustawienia, aktualizując obiekt GoogleMap
w zwrotnym wywołaniu onMapReady
. Dodatkowe ustawienia są konfigurowane za pomocą metod klasy GoogleMap
, takich jak te, które konfigurują warstwę ruchu i wypełnienie mapy.
Przykład
W przykładowym kodzie poniżej i na zrzucie ekranu powyżej mapa jest skonfigurowana z tymi ustawieniami.
Początkowe ustawienia są konfigurowane w pliku układu:
- Włącz kontrolę powiększenia.
- Włącz gesty obracania.
- Ustaw kąt nachylenia mapy na 30°.
Ustawienia czasu działania:
- Umieść aparat w centrum Kioto w Japonii.
- Włącz hybrydowy typ mapy.
- Włącz warstwę natężenia ruchu.
Ustawienia początkowe
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:name="com.google.android.gms.maps.SupportMapFragment" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" map:uiZoomControls="true" map:uiRotateGestures="true" map:cameraTilt="30" />
Ustawienia czasu działania
package com.example.mapsetup; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } // Update the map configuration at runtime. @Override public void onMapReady(GoogleMap googleMap) { // Set the map coordinates to Kyoto Japan. LatLng kyoto = new LatLng(35.00116, 135.7681); // Set the map type to Hybrid. googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); // Add a marker on the map coordinates. googleMap.addMarker(new MarkerOptions() .position(kyoto) .title("Kyoto")); // Move the camera to the map coordinates and zoom in closer. googleMap.moveCamera(CameraUpdateFactory.newLatLng(kyoto)); googleMap.moveCamera(CameraUpdateFactory.zoomTo(15)); // Display traffic. googleMap.setTrafficEnabled(true); } }
Zanim zaczniesz
Zanim zaczniesz, możesz skonfigurować projekt i dodać podstawową mapę, korzystając z tych opcji:
Utwórz aplikację za pomocą szablonu Map w Android Studio. Szablon Map automatycznie konfiguruje projekt i dodaje podstawową mapę. Fragment jest używany jako kontener mapy i jest dodawany statycznie. Szczegółowe informacje znajdziesz w krótkim przewodniku.
Ręcznie skonfiguruj projekt pod kątem pakietu SDK i dodaj podstawową mapę. Dzięki temu możesz używać dowolnego szablonu na Androida i dodawać mapy do istniejącej aplikacji.
Konfigurowanie mapy po jej dodaniu w sposób statyczny
W tej sekcji opisano, jak ustawić początkowy stan mapy, jeśli została ona dodana do pliku układu w sposób statyczny.
Pakiet Maps SDK na Androida definiuje zestaw niestandardowych atrybutów XML dla elementu SupportMapFragment
lub MapView
, których możesz użyć do skonfigurowania początkowego stanu mapy bezpośrednio z pliku układu. Obecnie zdefiniowane są te atrybuty:
mapType
– typ mapy do wyświetlenia. Dozwolone wartości tonone
,normal
,hybrid
,satellite
iterrain
.cameraTargetLat
,cameraTargetLng
,cameraZoom
,cameraBearing
,cameraTilt
– początkowa pozycja kamery. Szczegółowe informacje znajdziesz w przewodniku Kamera i widoki.uiZoomControls
,uiCompass
– określa, czy elementy sterujące powiększeniem i kompas są wyświetlane. Więcej informacji:UiSettings
.uiZoomGestures
,uiScrollGestures
,uiRotateGestures
,uiTiltGestures
– określa, czy określone gesty są włączone. Więcej informacji znajdziesz w sekcjiUiSettings
.zOrderOnTop
– wskazuje, czy powierzchnia widoku mapy jest wyświetlana na wierzchu okna mapy, elementów sterujących mapy i dowolnego obiektu w oknie. Więcej informacji znajdziesz w funkcji SurfaceView.setZOrderOnTop(boolean).useViewLifecycle
– prawidłowy tylko w przypadku obiektuSupportMapFragment
. Określa, czy cykl życia mapy ma być powiązany z widokiem fragmentu czy samym fragmentem. Więcej informacji znajdziesz tutaj.liteMode
–true
, aby włączyć wersję uproszczoną; w przeciwnym raziefalse
.mapColorScheme
– określa schemat kolorów mapy normalnej i mapy terenu. Dostępne wartości tolight
(domyślnie),dark
ifollow_system
, co oznacza użycie bieżącego ustawienia systemu na podstawie ustawienia urządzenia dlaUI_NIGHT_MODE_MASK
. Więcej informacji znajdziesz w artykule Schemat kolorów mapy.
Aby móc używać tych atrybutów niestandardowych w pliku układu, musisz umieścić w nim tę deklarację przestrzeni nazw. Możesz wybrać dowolną przestrzeń nazw, nie musi to być map
:
xmlns:map="http://schemas.android.com/apk/res-auto"
Następnie możesz dodać atrybuty z preiksem map:
do pliku układu.
Podany poniżej plik układu konfiguruje obiekt SupportMapFragment
za pomocą niestandardowych atrybutów mapy. Te same atrybuty można też zastosować do obiektu MapView
.
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
map:cameraBearing="112.5"
map:cameraTargetLat="-33.796923"
map:cameraTargetLng="150.922433"
map:cameraTilt="30"
map:cameraZoom="13"
map:mapType="normal"
map:mapColorScheme="dark"
map:uiCompass="false"
map:uiRotateGestures="true"
map:uiScrollGestures="false"
map:uiTiltGestures="true"
map:uiZoomControls="false"
map:uiZoomGestures="true"/>
Konfigurowanie mapy po jej dodaniu dynamicznie
Z tej sekcji dowiesz się, jak ustawić początkowy stan mapy, jeśli została ona dodana do aplikacji dynamicznie.
Jeśli SupportMapFragment
lub MapView
zostało dodane dynamicznie, możesz ustawić początkowy stan mapy w obiekcie GoogleMapOptions
. Dostępne opcje są takie same jak w pliku układu.
Aby utworzyć GoogleMapOptions
, wykonaj te czynności:
Kotlin
val options = GoogleMapOptions()
Java
GoogleMapOptions options = new GoogleMapOptions();
Następnie skonfiguruj go w ten sposób:
Kotlin
options.mapType(GoogleMap.MAP_TYPE_SATELLITE) .compassEnabled(false) .rotateGesturesEnabled(false) .tiltGesturesEnabled(false)
Java
options.mapType(GoogleMap.MAP_TYPE_SATELLITE) .compassEnabled(false) .rotateGesturesEnabled(false) .tiltGesturesEnabled(false);
Aby zastosować te opcje podczas tworzenia mapy, wykonaj jedną z tych czynności:
- Jeśli używasz
SupportMapFragment
, użyj statycznej metody fabrycznejSupportMapFragment.newInstance(GoogleMapOptions options)
, aby utworzyć fragment i przekazać ustawienia. - Jeśli używasz obiektu
MapView
, użyj konstruktoraMapView(Context, GoogleMapOptions)
i przekaż ustawienia.
Lokalizacja mapy
Gdy dodasz do aplikacji MapView
lub SupportMapFragment
, elementy tekstowe na mapie będą wyświetlane w odpowiednim języku na podstawie ustawień i lokalizacji urządzenia użytkownika. Możesz ograniczyć języki używane przez aplikację do podzbioru wszystkich obsługiwanych języków, dodając do pliku Gradle element resConfigs
. Jest to przydatne, ponieważ pozwala usunąć nieużywane języki i zmniejsz rozmiar pliku binarnego aplikacji. Na przykład:
defaultConfig {
resConfigs "en", "fr", "es", "zh", "de", "ja", "ru", "ko", "pt", "in"
}
Dowiedz się więcej o lokalizowaniu aplikacji na Androida.
Konfigurowanie warstwy danych o natężeniu ruchu
Możesz wyświetlać dane o ruchu na mapie, włączając warstwę ruchu. Możesz włączać i wyłączać warstwę ruchu, wywołując metodę setTrafficEnabled()
. Możesz też sprawdzić, czy warstwa ruchu jest obecnie włączona, wywołując metodę isTrafficEnabled()
. Na tym zrzucie ekranu widać mapę z włączoną warstwą ruchu.
Ustaw typ mapy
Aby ustawić typ mapy, wywołaj metodę setMapType
.
Aby na przykład wyświetlić mapę satelitarną:
Kotlin
// Sets the map type to be "hybrid" map.mapType = GoogleMap.MAP_TYPE_HYBRID
Java
// Sets the map type to be "hybrid" map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
Na tym obrazku porównano mapy normalną, hybrydową i terenową:
Konfigurowanie budynków 3D
W wielu miastach, gdy spojrzysz na nie z bliska, zobaczysz budynki w 3D, jak na zdjęciu Vancouver w Kanadzie. Możesz wyłączyć budynki 3D, wywołując funkcję GoogleMap.setBuildingsEnabled(false)
.
Konfigurowanie ustawień mapy wewnętrznej
Przy dużym powiększeniu mapa wyświetla plany pięter pomieszczeń wewnętrznych, takich jak lotniska, centra handlowe, duże sklepy detaliczne i stacje tranzytowe. Te plany pięter, zwane mapami wewnętrznymi, są wyświetlane w mapach typu „normalna” i „satelitarna” (GoogleMap.MAP_TYPE_NORMAL
i GoogleMap.MAP_TYPE_SATELLITE
). Są one automatycznie włączane, gdy użytkownik powiększa mapę, i znikają, gdy mapę pomniejsza.
Ostrzeżenie o wycofaniu: w nadchodzącej wersji mapy wewnątrz budynków będą dostępne tylko w przypadku typu mapy normal
. W przyszłej wersji mapy wewnątrz budynków nie będą obsługiwane na mapach satellite
, terrain
i hybrid
. Nawet jeśli indoor nie jest obsługiwane, isIndoorEnabled()
będzie nadal zwracać wartość ustawioną za pomocą setIndoorEnabled()
, tak jak ma to miejsce obecnie. Domyślnie setIndoorEnabled
to true
. Uwagi do wersji będą informować o tym, kiedy obsługa wewnątrz budynków stanie się niedostępna na tych typach map.
Oto podsumowanie funkcji map obiektów w interfejsie API:
- Możesz wyłączyć mapy wewnątrz budynków, dzwoniąc na numer
GoogleMap.setIndoorEnabled(false)
. Domyślnie mapy obiektów są włączone. Mapy wewnątrz budynków są wyświetlane na jednej mapie naraz. Domyślnie jest to pierwsza mapa dodana do aplikacji. Aby wyświetlać mapy wewnątrz budynków na innej mapie, wyłącz je na pierwszej mapie, a następnie wywołaj funkcjęsetIndoorEnabled(true)
na drugiej mapie. - Aby wyłączyć domyślny selektor poziomu (selektor podłogi), wywołaj funkcję
GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false)
. Więcej informacji znajdziesz w artykule Interakcje z mapą. OnIndoorStateChangeListener
– definiuje słuchaczy, którzy wykrywają, kiedy budynek staje się punktem zainteresowania lub gdy aktywowany jest poziom w budynku. Więcej informacji znajdziesz w artykule Interakcje z mapą.getFocusedBuilding
– pobiera dane budynku, na którym jest nacisk. Aby znaleźć aktywny poziom, wywołaj funkcjęIndoorBuilding.getActiveLevelIndex()
.- Stylizacja mapy bazowej nie ma wpływu na mapy wewnątrz budynków.
Konfigurowanie dopełniania mapy
Ten film pokazuje przykład wypełnienia mapy.
Mapa Google ma wypełniać cały region zdefiniowany przez element kontenera, zwykle MapView
lub SupportMapFragment
. Niektóre aspekty wyglądu i działania mapy są zdefiniowane przez wymiary jej kontenera:
- Cel kamery będzie odpowiadał środkowi obszaru z dodatkiem.
- Opcje mapy są umieszczane względem krawędzi mapy.
- Informacje prawne, takie jak oświadczenia o prawach autorskich lub logo Google, wyświetlają się na dolnej krawędzi mapy.
Możesz dodać wypełnienie wokół krawędzi mapy za pomocą opcji GoogleMap
.używaj metody setPadding()
. Mapa nadal będzie wypełniać cały kontener, ale tekst i pozycjonowanie elementów sterujących, gesty mapy oraz ruchy kamery będą działać tak, jakby były umieszczone w mniejszym obszarze. Wprowadziliśmy następujące zmiany:
- Ruchy kamery wywoływane przez wywołania interfejsu API lub naciśnięcia przycisków (np. kompasu, mojej lokalizacji czy przycisków powiększania) są względne względem obszaru z dodatkiem.
- Metoda
getCameraPosition
zwraca środek obszaru z wypełnieniem. - Metody
Projection
igetVisibleRegion
zwracają wypełniony region. - Elementy sterujące interfejsu są przesunięte od krawędzi kontenera o wyznaczoną liczbę pikseli.
Odstęp może być przydatny podczas projektowania interfejsów, które zachodzą na część mapy. Na poniższym obrazie mapa jest wypełniona w górnej i prawej części. Elementy sterujące widocznej mapy i tekst prawny będą wyświetlane na obrzeżach obszaru z dodatkowym marginesem (kolor zielony), a mapa będzie wypełniać cały kontener (kolor niebieski). W tym przykładzie możesz wyświetlić menu po prawej stronie mapy bez zasłaniania elementów sterujących mapą.
Schemat kolorów mapy
W przypadku map typu normalna i teren możesz dynamicznie ustawić schemat kolorów mapy na ciemny, jasny lub użyć bieżącego ustawienia systemu. Możesz na przykład przyciemnić lub rozjaśnić schemat kolorów mapy w zależności od pory dnia lub używania urządzenia w pomieszczeniu lub na zewnątrz.
Domyślnie mapa używa trybu jasnego. Bieżąca wartość ustawienia systemu jest określana na podstawie ustawienia UI_NIGHT_MODE_MASK
na urządzeniu.
Kotlin
mapFragment = SupportMapFragment.newInstance(GoogleMapOptions().mapColorScheme(MapColorScheme.DARK).mapId(mapId2))
Java
mapFragment = SupportMapFragment.newInstance(new GoogleMapOptions().mapColorScheme(MapColorScheme.DARK).mapId(mapId2));
Możesz przełączyć schemat kolorów, korzystając z metody GoogleMap.setMapColorScheme()
, aby ustawić bieżący styl jako tryb ciemny, jasny lub zgodnie z ustawieniami systemu.
Kotlin
googleMap.setMapColorScheme(MapColorScheme.DARK) googleMap.setMapColorScheme(MapColorScheme.LIGHT) googleMap.setMapColorScheme(MapColorScheme.FOLLOW_SYSTEM)
Java
googleMap.setMapColorScheme(MapColorScheme.DARK); googleMap.setMapColorScheme(MapColorScheme.LIGHT); googleMap.setMapColorScheme(MapColorScheme.FOLLOW_SYSTEM);
Konfigurowanie koloru tła
Podczas pracy w trybie ciemnym lub przełączania się między widokami mapy warto skonfigurować domyślny kolor tła mapy. Można to zrobić, ustawiając właściwość map options backgroundColor
.
Kotlin
private val googleMapOptions: GoogleMapOptions = GoogleMapOptions().backgroundColor(Color.argb(255, 255, 0, 0));
Java
private GoogleMapOptions options = new GoogleMapOptions().backgroundColor(Color.argb(255, 255, 0, 0));
Do konfigurowania koloru tła możesz też użyć stylów map w Google Cloud. Kolor tła ustawiony w stylizacji map ma wyższy priorytet niż lokalny kolor tła. Więcej informacji o zmianie koloru tła aplikacji znajdziesz w sekcji stylizacji map opartych na chmurze.