W tym temacie opisujemy, jak skonfigurować mapę dodaną do aplikacji na Androida za pomocą pakietu SDK Map Google na Androida.
Przegląd
Po dodaniu mapy do aplikacji możesz skonfigurować jej ustawienia początkowe i czasowe. Początkowe ustawienia musisz skonfigurować w zależności od tego, czy kontener mapy (SupportMapFragment
lub MapView
) został dodany statycznie czy dynamicznie. Jeśli kontener mapy został dodany statycznie, możesz skonfigurować początkowe ustawienia mapy w pliku układu.
Jeśli zostało dodane dynamicznie, możesz skonfigurować ustawienia początkowe w wywołaniu zwrotnym OnCreate
za pomocą obiektu GoogleMapOptions
.
Więcej informacji o dodawaniu kontenera mapy znajdziesz w sekcji Dodawanie mapy.
Początkowe ustawienia mapy obejmują:
- Pozycja kamery, w tym: lokalizacja, powiększenie, kierunek i pochylenie kamery. Szczegółowe informacje o pozycjonowaniu kamery znajdziesz w sekcji Aparat i widok.
- Typ mapy.
- Komponenty interfejsu, które mają być wyświetlane, np. przyciski powiększenia i kompas.
- Gesty, które mają zostać włączone.
- Określa, czy wersja uproszczona jest włączona.
Te ustawienia i niektóre dodatkowe ustawienia możesz skonfigurować w środowisku wykonawczym, aktualizując obiekt GoogleMap
w wywołaniu zwrotnym onMapReady
. Dodatkowe ustawienia konfiguruje się za pomocą metod klasy GoogleMap
, np. tych, które konfiguruje warstwę ruchu i dopeł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 konfiguruje się w pliku układu:
- Włącz elementy sterujące powiększeniem.
- Włącz sterowanie gestami obracania.
- Ustaw pochylenie mapy na 30.
Ustawienia środowiska wykonawczego:
- Wyśrodkuj aparat na Kioto, Japonia.
- Włącz typ mapy hybrydowej.
- 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 środowiska wykonawczego
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ć mapę podstawową, korzystając z tych opcji:
Utwórz aplikację, korzystając z szablonu Map dla Android Studio. Szablon Map automatycznie konfiguruje projekt i dodaje podstawową mapę. Fragment jest używany jako kontener mapy i jest dodawany statycznie. Więcej informacji znajdziesz w quickstart.
Ręcznie skonfiguruj projekt na potrzeby pakietu SDK i dodaj mapę podstawową. Dzięki temu możesz użyć dowolnego szablonu na Androida i dodać mapę do istniejącej aplikacji.
Konfigurowanie mapy po jej statycznej dodaniu
W tej sekcji opisujemy, jak ustawić początkowy stan mapy, jeśli został on dodany statycznie do pliku układu.
Pakiet SDK Map Google na Androida definiuje zestaw niestandardowych atrybutów XML dla obiektów SupportMapFragment
lub MapView
, których możesz użyć do skonfigurowania początkowego stanu mapy bezpośrednio w pliku układu. Obecnie zdefiniowane są te atrybuty:
mapType
– typ mapy do wyświetlenia. Prawidłowe wartości tonone
,normal
,hybrid
,satellite
iterrain
.cameraTargetLat
,cameraTargetLng
,cameraZoom
,cameraBearing
,cameraTilt
– początkowa pozycja kamery. Szczegółowe informacje znajdziesz w przewodniku dotyczącym aparatu i widoków.uiZoomControls
,uiCompass
– określa, czy mają być wyświetlane elementy sterujące powiększeniem i kompas. Więcej informacji:UiSettings
.uiZoomGestures
,uiScrollGestures
,uiRotateGestures
,uiTiltGestures
– określa, czy są włączone określone gesty. Więcej informacji znajdziesz w sekcjiUiSettings
.zOrderOnTop
– wskazuje, czy powierzchnia widoku mapy jest wyświetlana u góry okna mapy, elementów sterujących mapy i dowolnego obiektu w oknie. Więcej informacji znajdziesz w sekcji SurfaceView.setZOrderOnTop(boolean).useViewLifecycle
– prawidłowy tylko z obiektemSupportMapFragment
. Określa, czy cykl życia mapy powinien być powiązany z widokiem fragmentu, czy z samym fragmentem. Szczegółowe informacje znajdziesz tutaj.liteMode
–true
, aby włączyć wersję uproszczoną. W przeciwnym raziefalse
.
Aby można było używać atrybutów niestandardowych w pliku układu, musi on zawierać poniższą deklarację przestrzeni nazw. Możesz wybrać dowolną przestrzeń nazw. Nie musi to być map
:
xmlns:map="http://schemas.android.com/apk/res-auto"
Potem możesz dodać atrybuty z prefiksem map:
do pliku układu.
Poniższy plik układu konfiguruje obiekt SupportMapFragment
z niestandardowymi atrybutami mapy. Te same atrybuty można też stosować 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:uiCompass="false"
map:uiRotateGestures="true"
map:uiScrollGestures="false"
map:uiTiltGestures="true"
map:uiZoomControls="false"
map:uiZoomGestures="true"/>
Konfigurowanie mapy po dynamicznym dodaniu
W tej sekcji dowiesz się, jak ustawić początkowy stan mapy, jeśli została ona dodana do aplikacji dynamicznie.
Jeśli właściwość SupportMapFragment
lub MapView
została dodana dynamicznie, możesz ustawić początkowy stan mapy w obiekcie GoogleMapOptions
. Dostępne opcje są takie same jak w pliku układu.
GoogleMapOptions
możesz utworzyć w ten sposób:
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ć go w ustawieniach. - Jeśli używasz
MapView
, użyj konstruktoraMapView(Context, GoogleMapOptions)
i przekaż go w ustawieniach.
Konfigurowanie warstwy natężenia ruchu
Dane o natężeniu ruchu można wyświetlać na mapie, włączając warstwę natężenia ruchu. Warstwa ruchu możesz włączać i wyłączać, wywołując metodę setTrafficEnabled()
. Aby sprawdzić, czy warstwa ruchu jest obecnie włączona, wywołaj metodę isTrafficEnabled()
. Poniższy zrzut ekranu przedstawia mapę z włączoną warstwą natężenia ruchu.
Ustawianie typu mapy
Aby ustawić typ mapy, wywołaj metodę setMapType
.
Na przykład, aby 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);
Poniższa ilustracja przedstawia porównanie map zwykłych, hybrydowych i terenowych:
Konfigurowanie budynków 3D
W wielu miastach z bliska widać budynki 3D, co widać na poniższym zdjęciu Vancouver w Kanadzie. Budynki 3D możesz wyłączyć, wywołując
GoogleMap.setBuildingsEnabled(false)
.
Konfigurowanie ustawień mapy obiektu
Przy dużym powiększeniu mapa pokazuje plany pięter budynków wewnątrz budynków, takich jak lotniska, centra handlowe, duże sklepy i stacje transportu publicznego. Te plany pięter, nazywane mapami obiektów, są wyświetlane w przypadku typów map „normalnych” i „satelitarnych” (GoogleMap.MAP_TYPE_NORMAL
i GoogleMap.MAP_TYPE_SATELLITE
). Są włączane automatycznie, gdy użytkownik powiększa widok, i znikają, gdy mapa jest pomniejszona.
Powiadomienie o wycofaniu: w kolejnej wersji mapy obiektów będą dostępne tylko na mapie typu normal
. Od przyszłej wersji mapy obiektów nie będą obsługiwane na mapach w systemie satellite
, terrain
ani hybrid
. Nawet jeśli funkcja wewnątrz nie jest obsługiwana, isIndoorEnabled()
będzie nadal zwracać wartość ustawioną za pomocą metody setIndoorEnabled()
tak jak obecnie. Domyślnie setIndoorEnabled
ma wartość true
. Informacje o wersji poinformują Cię, gdy obsługa obiektów we wnętrzach przestanie być dostępna w przypadku tych typów map.
Oto podsumowanie funkcji map obiektów dostępnych w interfejsie API:
- Mapy obiektów możesz wyłączyć, dzwoniąc pod numer
GoogleMap.setIndoorEnabled(false)
. Domyślnie mapy obiektów są włączone. Mapy obiektów są wyświetlane na jednej mapie naraz. Domyślnie jest to pierwsza mapa dodana do Twojej aplikacji. Aby wyświetlać mapy obiektu na innej mapie, wyłącz je na pierwszej mapie, a następnie zadzwoń pod numersetIndoorEnabled(true)
na drugiej mapie. - Aby wyłączyć domyślny selektor poziomów (selektor pięter), wywołaj metodę
GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false)
. Więcej informacji znajdziesz w artykule Korzystanie z mapy. OnIndoorStateChangeListener
– definiuje detektory, które wykrywają, kiedy budynek znajduje się w centrum uwagi lub gdy w budynku aktywuje się poziom. Więcej informacji znajdziesz w sekcji Korzystanie z mapy.getFocusedBuilding
– pobiera budynek, który jest zaznaczony. Następnie możesz znaleźć aktywny poziom, wywołującIndoorBuilding.getActiveLevelIndex()
.- Styl mapy podstawowej nie wpływa na mapy obiektów.
Konfigurowanie dopełnienia mapy
Ten film pokazuje przykład dopełnienia mapy.
Mapa Google została zaprojektowana w taki sposób, aby wypełnić cały region zdefiniowany przez jej element kontenera, zwykle MapView
lub SupportMapFragment
. Niektóre aspekty wyglądu i działania mapy zależą od wymiarów jej kontenera:
- Cel kamery będzie odbijać środek wyściełanego obszaru.
- Elementy sterujące mapy są ustawiane względem krawędzi mapy.
- Informacje prawne, takie jak deklaracje dotyczące praw autorskich lub logo Google, wyświetlają się przy dolnej krawędzi mapy.
Możesz dodać dopełnienie wokół krawędzi mapy za pomocą komponentu GoogleMap
.setPadding()
. Mapa będzie nadal wypełniać cały kontener, ale jej pozycjonowanie, gesty i ruchy kamery działają tak, jakby została umieszczona w mniejszej przestrzeni. Powoduje to następujące zmiany:
- Ruch kamery za pomocą wywołań interfejsu API lub naciśnięć przycisków (np. kompasu, lokalizacji, przycisków powiększenia) zależy od obszaru wyściełanego.
- Metoda
getCameraPosition
zwraca środek dopełnionego regionu. - Metody
Projection
igetVisibleRegion
zwracają dopełniony region. - elementy sterujące interfejsu są odsunięte od krawędzi kontenera o określoną liczbę pikseli.
Dopełnienie może być przydatne przy projektowaniu interfejsów, które nakładają się na pewien fragment mapy. Na ilustracji poniżej mapa jest dopełniona wzdłuż górnej i prawej krawędzi. Wzdłuż krawędzi dopełnionego obszaru będą wyświetlane widoczne elementy sterujące mapą i informacje prawne, które są zaznaczone na zielono, a mapa nadal będzie wypełniać cały kontener (kolor niebieski). W tym przykładzie możesz umieścić menu po prawej stronie mapy, nie zasłaniając jej elementów sterujących.