Modyfikowanie interfejsu użytkownika

Za pomocą pakietu Navigation SDK na Androida możesz zmodyfikować wrażenia użytkownika związane z mapą, określając, które z wbudowanych elementów i elementów interfejsu użytkownika mają się wyświetlać na mapie. Możesz też dostosować wygląd interfejsu nawigacji. Zasady dotyczące dozwolonych modyfikacji interfejsu nawigacji znajdziesz na stronie zasad.

Z tego dokumentu dowiesz się, jak zmodyfikować interfejs użytkownika mapy na 2 sposoby:

Elementy sterujące mapy

Elementy sterujące interfejsu mapy to zalecany sposób umieszczania niestandardowych elementów interfejsu w widoku nawigacji, aby zapewnić prawidłowe pozycjonowanie. Gdy wbudowany układ ulegnie zmianie, pakiet Navigation SDK na Androida automatycznie zmieni położenie elementów sterujących. W przypadku każdej pozycji możesz ustawić jeden widok niestandardowych ustawień. Jeśli Twój projekt wymaga wielu elementów interfejsu, możesz umieścić je w elementach ViewGroup i przekazać je metodzie setCustomControl.

Metoda setCustomControl udostępnia pozycje zdefiniowane w enumeracji CustomControlPosition:

  • SECONDARY_HEADER (wyświetla się tylko w orientacji pionowej)
  • BOTTOM_START_BELOW
  • BOTTOM_END_BELOW
  • FOOTER
Niestandardowe pozycje elementów sterujących w orientacji pionowej.
Niestandardowe pozycje elementów sterujących w orientacji pionowej
Niestandardowe pozycje elementów sterujących w orientacji poziomej.
Niestandardowe pozycje elementów sterujących w orientacji poziomej

Dodawanie elementu sterującego niestandardowego

  1. Utwórz element Android View za pomocą niestandardowego elementu interfejsu lub grupy ViewGroup.
  2. Rozwinąć kod XML lub utworzyć instancję widoku niestandardowego, aby uzyskać instancję widoku.
  3. Użyj wartości NavigationView.setCustomControl lub SupportNavigationFragment.setCustomControl z wybraną pozycją elementu sterującego niestandardowego z CustomControlPosition enum.

    Przykład poniżej tworzy fragment i dodaje element sterujący niestandardowy w pozycji nagłówka dodatkowego.

     mNavFragment.setCustomControl(getLayoutInflater().
       inflate(R.layout.your_custom_control, null),
       CustomControlPosition.SECONDARY_HEADER);
     ```
    

Usuwanie elementu sterującego niestandardowego

Aby usunąć element sterujący niestandardowy, wywołaj metodę setCustomControl z parametrem widoku null i wybraną pozycją elementu sterującego niestandardowego.

Na przykład ten fragment kodu usuwa dowolny niestandardowy nagłówek dodatkowy i zwraca zawartość domyślną:

mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);

Niestandardowe pozycje elementów sterujących

Nagłówek dodatkowy

Pozycja elementów sterujących w nagłówku dodatkowym w orientacji pionowej
Położenie elementów sterujących w nagłówku dodatkowym w orientacji pionowej

Aby użyć tej niestandardowej pozycji elementu sterującego, prześlij pozycję CustomControlPosition.SECONDARY_HEADER do setCustomControl.

Domyślnie układy ekranu w trybie nawigacji zawierają miejsce na dodatkowy nagłówek znajdujący się pod nagłówkiem głównym. Ten nagłówek dodatkowy pojawia się w razie potrzeby, np. w przypadku wskazywania pasa ruchu. Aplikacja może używać tego drugiego nagłówka w tym miejscu układu na potrzeby treści niestandardowych. Gdy korzystasz z tej funkcji, masz kontrolę nad domyślnymi treściami w nagłówku dodatkowym. Jeśli widok nawigacji ma tło, to tło pozostaje na swoim miejscu, przykryte przez nagłówek dodatkowy. Gdy aplikacja usunie element sterujący niestandardowy, na jego miejscu może pojawić się dowolny domyślny nagłówek dodatkowy.

Górna krawędź niestandardowej pozycji nagłówka dodatkowego jest wyrównana do dolnej krawędzi nagłówka głównego. Ta pozycja jest obsługiwana tylko w portrait mode. W przypadku landscape mode nagłówek dodatkowy jest niedostępny, a układ się nie zmienia.

Zacznij od dołu

Pozycja dolnego elementu sterującego w orientacji pionowej
Pozycja elementów sterujących w domyślnej pozycji na dole w orientacji pionowej
Pozycja niestandardowego elementu sterującego w pozycji startu od dołu w orientacji poziomej
Położenie elementów sterujących w poziomie na dole

Aby użyć tej niestandardowej pozycji elementu sterującego, przekaż pozycję CustomControlPosition.BOTTOM_START_BELOW do setCustomControl.

To niestandardowe ustawienie znajduje się w prawym dolnym rogu mapy. W przypadku zarówno portrait mode, jak i landscape mode widok ten znajduje się nad kartą ETA lub niestandardowym stopem strony (lub u dołu mapy, jeśli żadne z tych elementów nie jest obecne), a elementy pakietu SDK nawigacji, w tym przycisk ponownego wyśrodkowania i logo Google, przesuwają się w górę, aby uwzględnić wysokość widoku niestandardowych elementów sterujących. To ustawienie znajduje się w widocznych granicach mapy, więc wszelkie wcięcia dodane do dolnej lub górnej krawędzi mapy również zmienią położenie tego ustawienia.

Dolna krawędź

Pozycja dolnego końca elementów sterujących w orientacji pionowej.
Pozycja elementów sterujących w dolnej części ekranu w orientacji pionowej
Pozycja niestandardowego elementu sterującego na dole w orientacji poziomej.
Pozycja elementów sterujących w dolnej części ekranu w orientacji poziomej

Aby użyć tej niestandardowej pozycji elementu sterującego, prześlij pozycję CustomControlPosition.BOTTOM_END_BELOW do setCustomControl.

Ta pozycja elementu sterującego znajduje się w prawym dolnym rogu mapy. W trybie portrait mode znajduje się nad kartą szacowanego czasu dotarcia lub niestandardowym stopniem dolnym (lub u dołu mapy, jeśli żadne z tych elementów nie są obecne), ale w trybie landscape mode jest wyrównany z dołem mapy. Wszystkie elementy pakietu SDK nawigacji widoczne po prawej stronie (po lewej stronie w przypadku języków zapisywanych od lewej do prawej) przesuwają się w górę, aby uwzględnić wysokość widoku niestandardowych elementów sterujących. To ustawienie znajduje się w widocznych granicach mapy, więc dodanie wypełnień do dolnej lub bocznej krawędzi mapy spowoduje również zmianę pozycji tego ustawienia.

Pozycja elementów sterujących w stopce w orientacji pionowej
Pozycja elementów sterujących w stopce w orientacji pionowej
Pozycja niestandardowego elementu sterującego w stopce w orientacji poziomej
Pozycja elementów sterujących w stopce w orientacji poziomej

Aby użyć tej niestandardowej pozycji elementu sterującego, przekaż pozycję CustomControlPosition.FOOTER do setCustomControl.

Ta pozycja elementu sterującego jest przeznaczona do widoku niestandardowej stopki. Jeśli karta z szacowanym czasem dotarcia do celu z użyciem pakietu SDK nawigacji jest widoczna, to ustawienie znajduje się nad nią. W przeciwnym razie element sterujący jest wyrównany z dolną krawędzią mapy. W przeciwieństwie do elementów sterujących BOTTOM_START_BELOWBOTTOM_END_BELOW ten element jest umieszczony poza widocznymi granicami mapy, co oznacza, że dodanie do mapy jakiegokolwiek marginesu nie spowoduje zmiany położenia tego elementu.

portrait mode niestandardowa stopka ma pełną szerokość. Elementy sterujące niestandardowe w pozycjach CustomControlPosition.BOTTOM_START_BELOWCustomControlPosition.BOTTOM_END_BELOW, a także elementy interfejsu użytkownika w pakiecie Nav SDK, takie jak przycisk ponownego wyśrodkowania i logo Google, znajdują się nad stopką elementu sterującego niestandardowego. Domyślna pozycja strzałki uwzględnia niestandardową wysokość stopki.

landscape mode niestandardowy stopka ma połowę szerokości i jest wyrównany do lewej strony (w językach z kierunkiem pisania od lewej do prawej), tak jak karta ETA w Nav SDK. Elementy niestandardowe w pozycji CustomControlPosition.BOTTOM_START_BELOW oraz elementy interfejsu SDK nawigacji, takie jak przycisk ponownego wyśrodkowania i logo Google, znajdują się nad stopką elementów niestandardowych. Elementy sterujące niestandardowe w pozycji CustomControlPosition.BOTTOM_END_BELOW i wszystkie elementy interfejsu SDK nawigacji na końcu (po prawej stronie w przypadku języków zapisywanych od lewej do prawej) pozostają wyrównane z dolną krawędzią mapy. Domyślna pozycja strzałki nie zmienia się, gdy jest widoczna niestandardowa stopka, ponieważ nie sięga ona do końca mapy.

Elementy sterujące niestandardowe w pozycjach CustomControlPosition.BOTTOM_START_BELOWCustomControlPosition.BOTTOM_END_BELOW, a także elementy interfejsu użytkownika pakietu Nav SDK, takie jak przycisk ponownego wyśrodkowania i logo Google, znajdują się nad stopką elementu sterującego niestandardowego.

Akcesoria interfejsu mapy

Pakiet SDK do nawigacji na Androida udostępnia elementy interfejsu użytkownika, które pojawiają się podczas nawigacji i są podobne do tych, które można znaleźć w aplikacji Mapy Google na Androida. Możesz dostosować widoczność lub wygląd tych elementów sterujących w sposób opisany w tej sekcji. Zmiany, które tu wprowadzisz, będą widoczne podczas następnej sesji nawigacji.

Wskazówki dotyczące dozwolonych modyfikacji interfejsu nawigacji znajdziesz na stronie zasad.

Wyświetlanie kodu

package com.example.navsdkcustomization;

import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.CameraPerspective;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.libraries.navigation.ListenableResultFuture;
import com.google.android.libraries.navigation.NavigationApi;
import com.google.android.libraries.navigation.Navigator;
import com.google.android.libraries.navigation.SimulationOptions;
import com.google.android.libraries.navigation.StylingOptions;
import com.google.android.libraries.navigation.SupportNavigationFragment;
import com.google.android.libraries.navigation.Waypoint;

/** An activity that displays a map and a customized navigation UI. */
public class NavigationActivityCustomization extends AppCompatActivity {

  private static final String TAG = NavigationActivityCustomization.class.getSimpleName();
  private Navigator mNavigator;
  private SupportNavigationFragment mNavFragment;
  private GoogleMap mMap;
  // Define the Sydney Opera House by specifying its place ID.
  private static final String SYDNEY_OPERA_HOUSE = "ChIJ3S-JXmauEmsRUcIaWtf4MzE";
  // Set fields for requesting location permission.
  private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
  private boolean mLocationPermissionGranted;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initialize the Navigation SDK.
    initializeNavigationSdk();
  }

  /**
   * Starts the Navigation SDK and sets the camera to follow the device's location. Calls the
   * navigateToPlace() method when the navigator is ready.
   */
  private void initializeNavigationSdk() {
    /*
     * Request location permission, so that we can get the location of the
     * device. The result of the permission request is handled by a callback,
     * onRequestPermissionsResult.
     */
    if (ContextCompat.checkSelfPermission(
            this.getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION)
        == PackageManager.PERMISSION_GRANTED) {
      mLocationPermissionGranted = true;
    } else {
      ActivityCompat.requestPermissions(
          this,
          new String[] {android.Manifest.permission.ACCESS_FINE_LOCATION},
          PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
    }

    if (!mLocationPermissionGranted) {
      displayMessage(
          "Error loading Navigation SDK: " + "The user has not granted location permission.");
      return;
    }

    // Get a navigator.
    NavigationApi.getNavigator(
        this,
        new NavigationApi.NavigatorListener() {
          /** Sets up the navigation UI when the navigator is ready for use. */
          @Override
          public void onNavigatorReady(Navigator navigator) {
            displayMessage("Navigator ready.");
            mNavigator = navigator;
            mNavFragment =
                (SupportNavigationFragment)
                    getSupportFragmentManager().findFragmentById(R.id.navigation_fragment);

            // Get the map.
            mNavFragment.getMapAsync(
                new OnMapReadyCallback() {
                  @Override
                  public void onMapReady(GoogleMap map) {
                    mMap = map;
                    // Navigate to a place, specified by Place ID.
                    navigateToPlace(SYDNEY_OPERA_HOUSE);
                  }
                });
          }

          /**
           * Handles errors from the Navigation SDK.
           *
           * @param errorCode The error code returned by the navigator.
           */
          @Override
          public void onError(@NavigationApi.ErrorCode int errorCode) {
            switch (errorCode) {
              case NavigationApi.ErrorCode.NOT_AUTHORIZED:
                displayMessage(
                    "Error loading Navigation SDK: Your API key is "
                        + "invalid or not authorized to use the Navigation SDK.");
                break;
              case NavigationApi.ErrorCode.TERMS_NOT_ACCEPTED:
                displayMessage(
                    "Error loading Navigation SDK: User did not accept "
                        + "the Navigation Terms of Use.");
                break;
              case NavigationApi.ErrorCode.NETWORK_ERROR:
                displayMessage("Error loading Navigation SDK: Network error.");
                break;
              case NavigationApi.ErrorCode.LOCATION_PERMISSION_MISSING:
                displayMessage(
                    "Error loading Navigation SDK: Location permission " + "is missing.");
                break;
              default:
                displayMessage("Error loading Navigation SDK: " + errorCode);
            }
          }
        });
  }

  /** Customizes the navigation UI and the map. */
  private void customizeNavigationUI() {
    // Set custom colors for the navigator.
    mNavFragment.setStylingOptions(
        new StylingOptions()
            .primaryDayModeThemeColor(0xff1A237E)
            .secondaryDayModeThemeColor(0xff3F51B5)
            .primaryNightModeThemeColor(0xff212121)
            .secondaryNightModeThemeColor(0xff424242)
            .headerLargeManeuverIconColor(0xffffff00)
            .headerSmallManeuverIconColor(0xffffa500)
            .headerNextStepTypefacePath("/system/fonts/NotoSerif-BoldItalic.ttf")
            .headerNextStepTextColor(0xff00ff00)
            .headerNextStepTextSize(20f)
            .headerDistanceTypefacePath("/system/fonts/NotoSerif-Italic.ttf")
            .headerDistanceValueTextColor(0xff00ff00)
            .headerDistanceUnitsTextColor(0xff0000ff)
            .headerDistanceValueTextSize(20f)
            .headerDistanceUnitsTextSize(18f)
            .headerInstructionsTypefacePath("/system/fonts/NotoSerif-BoldItalic.ttf")
            .headerInstructionsTextColor(0xffffff00)
            .headerInstructionsFirstRowTextSize(24f)
            .headerInstructionsSecondRowTextSize(20f)
            .headerGuidanceRecommendedLaneColor(0xffffa500));

    mMap.setTrafficEnabled(false);

    // Place a marker at the final destination.
    if (mNavigator.getCurrentRouteSegment() != null) {
      LatLng destinationLatLng = mNavigator.getCurrentRouteSegment().getDestinationLatLng();

      Bitmap destinationMarkerIcon =
          BitmapFactory.decodeResource(getResources(), R.drawable.ic_person_pin_48dp);

      mMap.addMarker(
          new MarkerOptions()
              .position(destinationLatLng)
              .icon(BitmapDescriptorFactory.fromBitmap(destinationMarkerIcon))
              .title("Destination marker"));

      // Listen for a tap on the marker.
      mMap.setOnMarkerClickListener(
          new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
              displayMessage(
                  "Marker tapped: "
                      + marker.getTitle()
                      + ", at location "
                      + marker.getPosition().latitude
                      + ", "
                      + marker.getPosition().longitude);

              // The event has been handled.
              return true;
            }
          });
    }

    // Set the camera to follow the device location with 'TILTED' driving view.
    mMap.followMyLocation(CameraPerspective.TILTED);
  }

  /**
   * Requests directions from the user's current location to a specific place (provided by the
   * Google Places API).
   */
  private void navigateToPlace(String placeId) {
    Waypoint destination;
    try {
      destination =
          Waypoint.builder().setPlaceIdString(placeId).build();
    } catch (Waypoint.UnsupportedPlaceIdException e) {
      displayMessage("Error starting navigation: Place ID is not supported.");
      return;
    }

    // Create a future to await the result of the asynchronous navigator task.
    ListenableResultFuture<Navigator.RouteStatus> pendingRoute =
        mNavigator.setDestination(destination);

    // Define the action to perform when the SDK has determined the route.
    pendingRoute.setOnResultListener(
        new ListenableResultFuture.OnResultListener<Navigator.RouteStatus>() {
          @Override
          public void onResult(Navigator.RouteStatus code) {
            switch (code) {
              case OK:
                // Hide the toolbar to maximize the navigation UI.
                if (getActionBar() != null) {
                  getActionBar().hide();
                }

                // Customize the navigation UI.
                customizeNavigationUI();

                // Enable voice audio guidance (through the device speaker).
                mNavigator.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE);

                // Simulate vehicle progress along the route for demo/debug builds.
                if (BuildConfig.DEBUG) {
                  mNavigator
                      .getSimulator()
                      .simulateLocationsAlongExistingRoute(
                          new SimulationOptions().speedMultiplier(5));
                }

                // Start turn-by-turn guidance along the current route.
                mNavigator.startGuidance();
                break;
              // Handle error conditions returned by the navigator.
              case NO_ROUTE_FOUND:
                displayMessage("Error starting navigation: No route found.");
                break;
              case NETWORK_ERROR:
                displayMessage("Error starting navigation: Network error.");
                break;
              case ROUTE_CANCELED:
                displayMessage("Error starting navigation: Route canceled.");
                break;
              default:
                displayMessage("Error starting navigation: " + String.valueOf(code));
            }
          }
        });
  }

  /** Handles the result of the request for location permissions. */
  @Override
  public void onRequestPermissionsResult(
      int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    mLocationPermissionGranted = false;
    switch (requestCode) {
      case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION:
        {
          // If request is canceled, the result arrays are empty.
          if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            mLocationPermissionGranted = true;
          }
        }
    }
  }

  /**
   * Shows a message on screen and in the log. Used when something goes wrong.
   *
   * @param errorMessage The message to display.
   */
  private void displayMessage(String errorMessage) {
    Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
    Log.d(TAG, errorMessage);
  }
}

Modyfikowanie nagłówka nawigacji

Aby zmienić motyw nagłówka nawigacji i wskaźnika następnego skrętu, który pojawia się pod nagłówkiem (jeśli jest dostępny), kliknij SupportNavigationFragment.setStylingOptions() lub NavigationView.setStylingOptions().

Możesz ustawić te atrybuty:

Typ atrybutuAtrybuty
Kolor tła
  • Tryb dzienny główny – kolor nagłówka nawigacji w dzień
  • Tryb dzienny dodatkowy – kolor wskaźnika następnego skrętu w dniu
  • Tryb nocny podstawowy – kolor nagłówka menu odpowiadający nocy
  • Tryb nocny dodatkowy – kolor wskaźnika następnego skrętu w nocy
Elementy tekstowe instrukcji
  • Kolor tekstu
  • Czcionka
  • Rozmiar tekstu w pierwszej linii
  • Rozmiar tekstu w drugiej linii
Elementy tekstowe dotyczące dalszych kroków
  • Czcionka
  • Kolor tekstu wartości odległości
  • Rozmiar tekstu wartości odległości
  • Kolor tekstu jednostek odległości
  • Rozmiar tekstu jednostek odległości
Ikony manewrów
  • Kolor dużej ikony manewru
  • Kolor małej ikony manewru
Asystent pasa ruchu
  • Kolor rekomendowanych pasów

Ten przykład pokazuje, jak ustawić opcje stylizacji:

private SupportNavigationFragment mNavFragment;
mNavFragment = (SupportNavigationFragment) getFragmentManager()
  .findFragmentById(R.id.navigation_fragment);

// Set the styling options on the fragment.
mNavFragment.setStylingOptions(new StylingOptions()
  .primaryDayModeThemeColor(0xff1A237E)
  .secondaryDayModeThemeColor(0xff3F51B5)
  .primaryNightModeThemeColor(0xff212121)
  .secondaryNightModeThemeColor(0xff424242)
  .headerLargeManeuverIconColor(0xffffff00)
  .headerSmallManeuverIconColor(0xffffa500)
  .headerNextStepTypefacePath("/system/fonts/NotoSerif-BoldItalic.ttf")
  .headerNextStepTextColor(0xff00ff00)
  .headerNextStepTextSize(20f)
  .headerDistanceTypefacePath("/system/fonts/NotoSerif-Italic.ttf")
  .headerDistanceValueTextColor(0xff00ff00)
  .headerDistanceUnitsTextColor(0xff0000ff)
  .headerDistanceValueTextSize(20f)
  .headerDistanceUnitsTextSize(18f)
  .headerInstructionsTypefacePath("/system/fonts/NotoSerif-BoldItalic.ttf")
  .headerInstructionsTextColor(0xffffff00)
  .headerInstructionsFirstRowTextSize(24f)
  .headerInstructionsSecondRowTextSize(20f)
  .headerGuidanceRecommendedLaneColor(0xffffa500));

Wyłączanie warstwy danych o natężeniu ruchu

Użyj opcji GoogleMap.setTrafficEnabled(), aby włączyć lub wyłączyć warstwę natężenia ruchu na mapie. To ustawienie wpływa na wskazania gęstości ruchu wyświetlane na mapie jako całości. Nie wpływa jednak na wskazania dotyczące natężenia ruchu na trasie wyznaczonej przez nawigatora.

private GoogleMap mMap;
// Get the map, and when the async call returns, setTrafficEnabled
// (callback will be on the UI thread)
mMap = mNavFragment.getMapAsync(navMap -> navMap.setTrafficEnabled(false));

Włącz światła i znaki stop.

Podczas aktywnej nawigacji możesz wyświetlać na mapie sygnalizację świetlną i znaki stop, co zapewni dodatkowy kontekst dla tras i manewrów podczas podróży.

Domyślnie sygnalizacja świetlna i znaki stop są wyłączone w pakiecie SDK nawigacji. Aby włączyć tę funkcję, wywołaj funkcję DisplayOptions dla każdej funkcji osobno.

DisplayOptions displayOptions =
  new DisplayOptions().showTrafficLights(true).showStopSigns(true);

Dodawanie znaczników niestandardowych

Pakiet SDK do nawigacji na Androida używa teraz interfejsów API Map Google do obsługi znaczników. Więcej informacji znajdziesz w dokumentacji interfejsu Maps API.

tekst pływający,

Tekst unoszący się nad innymi elementami możesz dodawać w dowolnym miejscu w aplikacji, o ile nie zasłania informacji o Google. Pakiet SDK nawigacji nie obsługuje zakotwiczenia tekstu do współrzędnych geograficznych na mapie ani do etykiety. Aby dowiedzieć się więcej, otwórz okno Informacje.

Wyświetlanie ograniczenia prędkości

Możesz programowo wyświetlać lub ukrywać ikonę ograniczenia prędkości. Aby wyświetlić lub ukryć ikonę limitu prędkości, kliknij NavigationView.setSpeedLimitIconEnabled() lub SupportNavigationFragment.setSpeedLimitIconEnabled(). Gdy ta opcja jest włączona, podczas wskazywania trasy w prawym dolnym rogu wyświetla się ikona limitu prędkości. Ikona wyświetla ograniczenie prędkości obowiązujące na drodze, po której porusza się pojazd. Ikona pojawia się tylko w miejscach, w których dostępne są wiarygodne dane o ograniczeniu prędkości.

 // Display the Speed Limit icon
 mNavFragment.setSpeedLimitIconEnabled(true);

Ikona ograniczenia prędkości jest tymczasowo ukryta, gdy wyświetlany jest przycisk recentrowania.

Ustawianie trybu nocnego

Tryb nocny możesz kontrolować programowo. Użyj NavigationView.setForceNightMode() lub SupportNavigationFragment.setForceNightMode(), aby włączyć lub wyłączyć tryb nocny, albo pozwól pakietowi SDK do nawigacji na Androida sterować trybem nocnym.

  • AUTO Pozwala pakietowi SDK nawigacji określić odpowiedni tryb na podstawie lokalizacji urządzenia i czasu lokalnego.
  • FORCE_NIGHT włącza tryb nocny.
  • FORCE_DAY włącza tryb dzienny.

Ten przykład pokazuje, jak wymusić włączenie trybu nocnego w fragmentie nawigacji:

// Force night mode on.
mNavFragment.setForceNightMode(FORCE_NIGHT);

Wyświetlanie listy wskazówek dojazdu

Najpierw utwórz widok i dodaj go do hierarchii.

void setupDirectionsListView() {
  // Create the view.
  DirectionsListView directionsListView = new DirectionsListView(getApplicationContext());
  // Add the view to your view hierarchy.
  ViewGroup group = findViewById(R.id.directions_view);
  group.addView(directionsListView);

  // Add a button to your layout to close the directions list view.
  ImageButton button = findViewById(R.id.close_directions_button); // this button is part of the container we hide in the next line.
  button.setOnClickListener(
      v -> findViewById(R.id.directions_view_container).setVisibility(View.GONE));
}

Pamiętaj, aby przekazać zdarzenia z cyklu życia do usługi DirectionsListView, tak jak to się dzieje w przypadku usługi NavigationView. Na przykład:

protected void onResume() {
  super.onResume();
  directionsListView.onResume();
}

Ukrywanie tras alternatywnych

Gdy interfejs użytkownika jest zbyt zatłoczony, możesz ograniczyć ilość wyświetlanych informacji, wyświetlając mniej tras alternatywnych niż domyślnie (2 trasy) lub nie wyświetlając ich wcale. Możesz skonfigurować tę opcję przed pobraniem tras, wywołując metodę RoutingOptions.alternateRoutesStrategy() z jedną z tych wartości wyliczenia:

Wartość wyliczeniaOpis
AlternateRoutesStrategy.SHOW_ALL Domyślny: Wyświetla maksymalnie 2 trasy alternatywne.
AlternateRoutesStrategy.SHOW_ONE Wyświetla jedną trasę alternatywną (jeśli jest dostępna).
AlternateRoutesStrategy.SHOW_NONE Ukrywa trasy alternatywne.

Poniższy przykład kodu pokazuje, jak ukryć alternatywne trasy.

RoutingOptions routingOptions = new RoutingOptions();
routingOptions.alternateRoutesStrategy(AlternateRoutesStrategy.SHOW_NONE);
navigator.setDestinations(destinations, routingOptions, displayOptions);

Pasek postępu podróży

Dodano pasek postępu przejazdu do nawigacji.

Pasek postępu podróży to pionowy pasek, który pojawia się na prawym skraju mapy po rozpoczęciu nawigacji. Po włączeniu wyświetla ona ogólny widok całej podróży wraz z miejscem docelowym i bieżącą pozycją użytkownika.

Umożliwia użytkownikom szybkie przewidywanie nadchodzących problemów, takich jak korki, bez konieczności przybliżania mapy. W razie potrzeby może zmienić trasę przejazdu. Jeśli użytkownik zmieni trasę przejazdu, pasek postępu zostanie zresetowany, tak jakby od tego momentu rozpoczęła się nowa podróż.

Pasek postępu podróży wyświetla te wskaźniki stanu:

  • Przebyty odcinek trasy – przebyty odcinek trasy.

  • Bieżąca pozycja – aktualna lokalizacja użytkownika w trakcie podróży.

  • Stan ruchu – stan zbliżającego się ruchu.

  • Ostateczny cel podróży – końcowy cel podróży.

Włącz pasek postępu przejazdu, wywołując metodę setTripProgressBarEnabled()NavigationView lub SupportNavigationFragment. Na przykład:

// Enable the trip progress bar.
mNavFragment.setTripProgressBarEnabled(true);