Konfigurowanie mapy

Wybierz platformę: Android iOS

Z tego dokumentu dowiesz się, jak skonfigurować mapę dodaną do aplikacji na Androida za pomocą pakietu Maps SDK na Androida.

Przegląd

Mapa Kioto ze skonfigurowanymi ustawieniami mapy. Po dodaniu mapy do aplikacji możesz skonfigurować jej ustawienia początkowe i ustawienia czasu działania. Ustawienia początkowe należy 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ł dodany dynamicznie, możesz skonfigurować ustawienia początkowe w wywołaniu zwrotnym OnCreate za pomocą obiektu GoogleMapOptions.

Szczegółowe informacje o dodawaniu kontenera mapy znajdziesz w artykule Dodawanie mapy.

Początkowe ustawienia mapy obejmują:

  • Pozycja kamery, w tym: lokalizacja, powiększenie, kierunek i nachylenie. Szczegółowe informacje o ustawianiu kamery znajdziesz w sekcji Kamera i widok.
  • Typ mapy.
  • Komponenty interfejsu, które mają być wyświetlane, takie jak przyciski powiększenia i kompas.
  • Gesty, które chcesz włączyć.
  • Czy wersja uproszczona jest włączona.

W czasie działania możesz skonfigurować te ustawienia i niektóre dodatkowe ustawienia, aktualizując obiekt GoogleMap w wywołaniu zwrotnym onMapReady. Dodatkowe ustawienia konfiguruje się za pomocą metod klasy GoogleMap, takich jak te, które konfigurują warstwę natężenia 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.

Ustawienia początkowe są skonfigurowane w pliku układu:

  • Włącz elementy sterujące powiększeniem.
  • Włącz sterowanie gestem obracania.
  • Ustaw nachylenie mapy na 30.

Ustawienia środowiska wykonawczego:

  • Wyśrodkuj widok kamery na 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 ś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ć podstawową mapę, korzystając z tych opcji:

  • utworzyć aplikację za pomocą szablonu Mapy w Android Studio, Szablon Mapy automatycznie konfiguruje projekt i dodaje podstawową mapę. Fragment jest używany jako kontener mapy i jest dodawany statycznie. Więcej informacji znajdziesz w krótkim wprowadzeniu.

  • Ręcznie skonfiguruj projekt pod kątem pakietu SDK i dodaj podstawową mapę. Dzięki temu możesz użyć dowolnego szablonu Androida i dodać mapę do istniejącej aplikacji.

Konfigurowanie mapy po dodaniu jej statycznie

W tej sekcji opisano, jak ustawić początkowy stan mapy, jeśli została ona dodana statycznie do pliku układu.

Pakiet Maps SDK na Androida definiuje zestaw niestandardowych atrybutów XML dla elementu SupportMapFragment lub MapView, których możesz użyć do skonfigurowania stanu początkowego mapy bezpośrednio z pliku układu. Zdefiniowane są te atrybuty:

  • mapType – typ mapy do wyświetlenia. Prawidłowe wartości to: none, normal, hybrid, satellite i terrain.

  • cameraTargetLat, cameraTargetLng, cameraZoom, cameraBearing, cameraTilt – początkowa pozycja kamery. Szczegółowe informacje znajdziesz w przewodniku po kamerze i widokach.

  • uiZoomControls, uiCompass – określa, czy wyświetlane są elementy sterujące powiększeniem i kompas. Więcej informacji: UiSettings.

  • uiZoomGestures, uiScrollGestures, uiRotateGestures, uiTiltGestures – określa, czy konkretne gesty są włączone. Więcej informacji: UiSettings.

  • zOrderOnTop – wskazuje, czy powierzchnia widoku mapy jest wyświetlana nad oknem mapy, elementami sterującymi mapy i dowolnym obiektem w oknie. Więcej informacji znajdziesz w artykule SurfaceView.setZOrderOnTop(boolean).

  • useViewLifecycle – prawidłowe tylko z obiektem SupportMapFragment. Określa, czy cykl życia mapy powinien być powiązany z widokiem fragmentu czy z samym fragmentem. Szczegółowe informacje znajdziesz w dokumentacji.

  • liteMode – true, aby włączyć wersję uproszczoną; w przeciwnym razie false.

  • mapColorScheme – określa schemat kolorów mapy zwykłej i terenowej. Wartości to light, dark i follow_system (domyślna), co oznacza użycie bieżącego ustawienia systemu na podstawie ustawienia urządzenia dla UI_NIGHT_MODE_MASK. Więcej informacji znajdziesz w artykule Schemat kolorów mapy.

Aby używać tych atrybutów niestandardowych w pliku układu, musisz w nim umieścić 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 prefiksem map: do pliku układu.

Ten plik układu konfiguruje obiekt SupportMapFragment z atrybutami mapy niestandardowej. 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 dynamicznym dodaniu

W tej sekcji opisano, jak ustawić początkowy stan mapy, jeśli została ona dodana do aplikacji dynamicznie.

Jeśli element SupportMapFragment lub MapView został dodany dynamicznie, możesz ustawić stan początkowy mapy w obiekcie GoogleMapOptions. Dostępne opcje są takie same jak w pliku układu. Aby utworzyć GoogleMapOptions:

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:

Lokalizowanie mapy

Gdy dodasz do aplikacji MapView lub SupportMapFragment, elementy tekstowe na mapie będą wyświetlane w odpowiednim języku na podstawie ustawień urządzenia i lokalizacji użytkownika. Możesz ograniczyć języki używane przez aplikację do podzbioru wszystkich obsługiwanych języków, dodając element resConfigs do pliku Gradle. Jest to przydatne do usuwania nieużywanych języków, a także zmniejsza 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 natężenia ruchu

Możesz wyświetlać dane o natężeniu ruchu na mapie, włączając warstwę natężenia ruchu. Warstwę natężenia ruchu możesz włączać i wyłączać, wywołując metodę setTrafficEnabled(), a to, czy jest ona włączona, możesz sprawdzać, wywołując metodę isTrafficEnabled(). Zrzut ekranu poniżej przedstawia mapę z włączoną warstwą natężenia ruchu.

Warstwa natężenia ruchu

Konfigurowanie warstwy transportu publicznego

Dane transportu publicznego możesz wyświetlać na mapie, włączając warstwę transportu publicznego. Warstwę transportu publicznego możesz włączać i wyłączać, wywołując metodę setTransitEnabled(). Aby sprawdzić, czy warstwa transportu publicznego jest włączona, wywołaj metodę isTransitEnabled(). Zrzut ekranu poniżej przedstawia mapę z włączoną warstwą transportu publicznego.

Warstwa transportu publicznego

Ustawianie typu 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 obrazie poniżej porównano typy map: normalną, hybrydową i terenową:

Porównanie 3 typów map: normalnej, hybrydowej i terenowej.

Konfigurowanie budynków 3D

Wiele miast, gdy są wyświetlane z bliska, ma widoczne budynki 3D, jak na poniższym zdjęciu Vancouver w Kanadzie. Możesz wyłączyć budynki 3D, wywołując metodę GoogleMap.setBuildingsEnabled(false).

Mapa Vancouver w Kanadzie

Konfigurowanie ustawień mapy obiektu

Przy dużych poziomach powiększenia mapa pokazuje plany pięter pomieszczeń, 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 „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 ją pomniejsza.

Powiadomienie o wycofaniu: w przyszłej wersji mapy wnętrz będą dostępne tylko w przypadku typu mapy normal. Od tej przyszłej wersji mapy obiektów nie będą obsługiwane na mapach satellite, terrain ani hybrid. Nawet jeśli lokalizacja w pomieszczeniach nie jest obsługiwana, isIndoorEnabled() będzie nadal zwracać wartość ustawioną za pomocą setIndoorEnabled(), tak jak obecnie. Domyślnie setIndoorEnabled to true. W informacjach o wersji znajdziesz informacje o tym, kiedy obsługa map wnętrz przestanie być dostępna w przypadku tych typów map.

Mapa obiektu centrum handlowego, na której zaznaczono wyjścia i działy z towarami.

Oto podsumowanie funkcji map obiektów w interfejsie API:

  • Możesz wyłączyć Mapy obiektów, wywołując metodę GoogleMap.setIndoorEnabled(false). Domyślnie mapy obiektów są włączone. Mapy obiektów są wyświetlane pojedynczo. Domyślnie jest to pierwsza mapa dodana do aplikacji. Aby wyświetlać mapy obiektów na innej mapie, wyłącz je na pierwszej mapie, a następnie wywołaj setIndoorEnabled(true) na drugiej mapie.
  • Aby wyłączyć domyślny selektor poziomu (selektor piętra), wywołaj GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false). Więcej informacji znajdziesz w artykule Interakcja z mapą.
  • OnIndoorStateChangeListener – definiuje detektory, które wykrywają, kiedy budynek jest zaznaczony lub kiedy poziom w budynku jest aktywowany. Więcej informacji znajdziesz w artykule Interakcja z mapą.
  • getFocusedBuilding – pobiera budynek, który jest zaznaczony. Następnie możesz znaleźć aktywny poziom, wywołując funkcję IndoorBuilding.getActiveLevelIndex().
  • Styl mapy podstawowej nie ma wpływu na mapy obiektów.

Konfigurowanie dopełnienia mapy

Ten film przedstawia przykład dopełnienia mapy.

Mapa Google jest zaprojektowana tak, aby wypełniać cały region zdefiniowany przez element kontenera, zwykle MapView lub SupportMapFragment. Kilka aspektów wyglądu i działania mapy jest określanych przez wymiary jej kontenera:

  • Cel kamery będzie odzwierciedlać środek wypełnionego obszaru.
  • Elementy sterujące mapy są rozmieszczone względem krawędzi mapy.
  • Informacje prawne, takie jak oświadczenia o prawach autorskich czy logo Google, pojawiają się wzdłuż dolnej krawędzi mapy.

Możesz dodać dopełnienie wokół krawędzi mapy za pomocą GoogleMap.setPadding(). Mapa nadal będzie wypełniać cały kontener, ale pozycjonowanie tekstu i elementów sterujących, gesty na mapie i ruchy kamery będą się zachowywać tak, jakby mapa znajdowała się w mniejszej przestrzeni. Spowoduje to te zmiany:

  • Ruchy kamery wywoływane przez wywołania interfejsu API lub naciśnięcie przycisku (np. kompas, moja lokalizacja, przyciski powiększenia) są względne do obszaru z dopełnieniem.
  • Metoda getCameraPosition zwraca środek obszaru z dopełnieniem.
  • Metody Projection i getVisibleRegion zwracają obszar z dopełnieniem.
  • Elementy sterujące interfejsu są przesunięte od krawędzi kontenera o określoną liczbę pikseli.

Dopełnienie może być przydatne podczas projektowania interfejsów, które nakładają się na część mapy. Na obrazie poniżej mapa jest dopełniona wzdłuż górnej i prawej krawędzi. Widoczne elementy sterujące mapy i tekst prawny będą wyświetlane wzdłuż krawędzi wypełnionego obszaru (na zielono), a mapa będzie nadal wypełniać cały kontener (na niebiesko). W tym przykładzie możesz umieścić menu po prawej stronie mapy, nie zasłaniając elementów sterujących mapą.

Dopełnienie mapy

Schemat kolorów mapy

W przypadku map typu normalnego i terenowego możesz dynamicznie ustawić ciemny lub jasny schemat kolorów mapy, możesz też użyć bieżącego ustawienia systemowego. 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.

Począwszy od wersji 20.1.0 pakietu Maps SDK na Androida, mapa domyślnie dostosowuje się do bieżącego ustawienia systemu. We wcześniejszych wersjach mapa domyślnie używa trybu jasnego. Bieżąca wartość ustawienia systemowego zależy od ustawienia urządzenia dla aplikacji UI_NIGHT_MODE_MASK.

Kotlin

mapFragment = SupportMapFragment.newInstance(GoogleMapOptions().mapColorScheme(MapColorScheme.DARK).mapId(mapId2))

Java

mapFragment = SupportMapFragment.newInstance(new GoogleMapOptions().mapColorScheme(MapColorScheme.DARK).mapId(mapId2));

Możesz przełączać schemat kolorów za pomocą metody GoogleMap.setMapColorScheme(), aby ustawić bieżący styl na tryb ciemny, tryb jasny lub zgodny z ustawieniami systemowymi.

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);

Aby utworzyć niestandardowe style jasne i ciemne dla map, użyj definiowania stylów map w Google Cloud.

Konfigurowanie koloru tła

Podczas pracy w trybie ciemnym lub przełączania się między widokami mapy przydatne może być skonfigurowanie domyślnego koloru tła mapy. Można to zrobić, ustawiając właściwość opcji mapy 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));

Możesz też użyć definiowania stylów map w Google Cloud, aby skonfigurować kolor tła. Kolor tła ustawiony w stylach map ma wyższy priorytet niż lokalny kolor tła. Więcej informacji znajdziesz w artykule Zmienianie koloru tła aplikacji dotyczącym definiowania stylów map w Google Cloud.