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 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 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 elemencie ViewGroup
i przekazać go 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


Dodawanie elementu sterującego niestandardowego
- Utwórz element Android View za pomocą niestandardowego elementu interfejsu lub grupy ViewGroup.
- Rozwinąć kod XML lub utworzyć instancję widoku niestandardowego, aby uzyskać jego instancję.
Użyj wartości
NavigationView.setCustomControl
lubSupportNavigationFragment.setCustomControl
z wybraną pozycją elementu sterującego niestandardowego z enumeracjiCustomControlPosition
.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 null
view i wybraną pozycją elementu sterującego niestandardowego.
Na przykład ten fragment kodu usuwa dowolny niestandardowy nagłówek dodatkowy i powraca do treści domyślnych:
mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);
Niestandardowe pozycje elementów sterujących
Nagłówek dodatkowy

Aby użyć tej niestandardowej pozycji elementu sterującego, przekaż 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 podrzędnego 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


Aby użyć tej niestandardowej pozycji elementu sterującego, przekaż pozycję CustomControlPosition.BOTTOM_START_BELOW
do setCustomControl
.
To niestandardowe położenie elementu sterującego znajduje się w lewym dolnym rogu mapy. W przypadku zarówno portrait mode
, jak i landscape mode
znajduje się ona nad kartą ETA lub niestandardowym nagłówkiem (lub u dołu mapy, jeśli żadne z nich nie są obecne), a elementy pakietu Nav SDK, 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 dodanie marginesu do dolnej lub górnej krawędzi mapy spowoduje również zmianę pozycji tego ustawienia.
Dolna krawędź


Aby użyć tej niestandardowej pozycji elementu sterującego, przekaż pozycję CustomControlPosition.BOTTOM_END_BELOW
do setCustomControl
.
Ta pozycja elementu sterującego znajduje się w prawym dolnym rogu mapy. W portrait mode
znajduje się ona nad kartą ETA lub niestandardowym stopniem (lub na dole mapy, jeśli żadne z tych elementów nie jest obecne), ale w landscape mode
jest wyrównana 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 niestandardowego elementu sterującego. Ten element jest umieszczony w widocznych granicach mapy, więc dodanie wypełnień do dolnej lub bocznej krawędzi mapy spowoduje zmianę położenia tego elementu.
Stopka


Aby użyć tej niestandardowej pozycji elementu sterującego, przekaż pozycję CustomControlPosition.FOOTER
do setCustomControl
.
Ta pozycja elementu sterującego jest przeznaczona do niestandardowego widoku stopki. Jeśli widoczna jest karta szacowanego czasu dotarcia z Navigating SDK, to właśnie nad nią znajduje się to pole. W przeciwnym razie element sterujący będzie wyrównany z dolną krawędzią mapy. W przeciwieństwie do elementów sterujących BOTTOM_START_BELOW
i BOTTOM_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.
W portrait mode
niestandardowa stopka ma pełną szerokość. Elementy sterujące w pozycji CustomControlPosition.BOTTOM_START_BELOW
i CustomControlPosition.BOTTOM_END_BELOW
, a także elementy interfejsu SDK nawigacji, takie jak przycisk ponownego wyśrodkowania i logo Google, znajdują się nad stopką elementu sterującego niestandardowego. Domyślna pozycja strzałki bierze pod uwagę niestandardową wysokość stopki.
W landscape mode
niestandardowy stopka ma połowę szerokości i jest wyrównany do lewej strony (po lewej stronie w przypadku języków zapisywanych od lewej do prawej), tak jak karta ETA w Nav SDK. Elementy sterujące 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 sterujących. Elementy sterujące niestandardowe w pozycji CustomControlPosition.BOTTOM_END_BELOW
i wszystkie elementy interfejsu SDK nawigacji wzdłuż krawędzi końcowej (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 obecna niestandardowa stopka, ponieważ nie sięga ona do końca mapy.
Elementy sterujące w pozycjach CustomControlPosition.BOTTOM_START_BELOW
i CustomControlPosition.BOTTOM_END_BELOW
, a także elementy interfejsu pakietu SDK nawigacji, takie jak przycisk ponownego wyśrodkowania i logo Google, znajdują się nad stopką elementów sterujących.
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 zgodnie z opisem w tej sekcji. Zmiany, które tu wprowadzisz, będą widoczne podczas następnej sesji nawigacji.
Wskazówki dotyczące akceptowanych modyfikacji interfejsu nawigacji znajdziesz na stronie zasad.
Wyświetlanie kodu
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), użyj SupportNavigationFragment.setStylingOptions()
lub NavigationView.setStylingOptions()
.
Możesz ustawić te atrybuty:
Typ atrybutu | Atrybuty |
---|---|
Kolor tła |
|
Elementy tekstowe instrukcji |
|
Elementy tekstowe dotyczące dalszych kroków |
|
Ikony manewrów |
|
Asystent pasa ruchu |
|
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 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 włączyć wyświetlanie na mapie sygnalizacji świetlnej i znaków stopu, co zapewni dodatkowy kontekst dla tras i manewrów podczas podróży.
Domyślnie światła 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 dodać 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 ograniczeń 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 przedstawia 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 dotyczące ograniczenia 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żna 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ść wyliczenia | Opis |
---|---|
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 alternatywne trasy. |
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
Pasek postępu podróży to pionowy pasek, który pojawia się po stronie początkowej mapy, gdy rozpoczyna się nawigacja. 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()
w NavigationView lub SupportNavigationFragment.
Na przykład:
// Enable the trip progress bar.
mNavFragment.setTripProgressBarEnabled(true);
Umieszczenie paska postępu podróży
- Lewa strona paska jest w przybliżeniu wyrównana z lewą stroną prędkościomierza, logo Google i przyciskiem Wyśrodkuj (jeśli jest widoczny). Szerokość to 12 dp.
- Pasek postępu podróży ma stałą wysokość. Aby dostosować się do ograniczeń związanych z przestrzenią pionową na mniejszych urządzeniach, widoczność i wysokość paska postępu podróży dostosowuje się na podstawie określonych punktów przełamania w wysokości ekranu. Te punkty graniczne są niezależne od orientacji urządzenia i tego, ile miejsca na ekranie zajmuje mapa:
- Jeśli pasek postępu podróży nakłada się na kartę zakrętu lub inne elementy interfejsu nawigacji, pojawia się pod tymi elementami.
Wysokość ekranu | Widoczność paska postępu podróży | Wysokość paska postępu podróży | Pozycja na osi Y paska postępu wyjazdu |
---|---|---|---|
Mały: 0 dp – 551 dp | Niewidoczne | Nie dotyczy | Nie dotyczy |
Średnia: 552 dp – 739 dp | Widoczne | 130 dp | Elementy sterujące po prawej stronie ekranu (prędkościomierz, logo Google, przycisk ponownego wyśrodkowania) |
Duża: 740 dp i więcej | Widoczne | 290 dp | Elementy sterujące po prawej stronie ekranu (prędkościomierz, logo Google, przycisk ponownego wyśrodkowania) |
Prompt Visibility API (eksperymentalny)
Interfejs API PromptVisibility umożliwia unikanie konfliktów między elementami interfejsu generowanymi przez pakiet SDK do nawigacji a Twoimi niestandardowymi elementami interfejsu. Wystarczy, że dodasz odbiornik wywołania zwrotnego, który będzie wywoływany przed wyświetleniem elementu interfejsu generowanego przez pakiet SDK do nawigacji i zaraz po jego usunięciu. Więcej informacji, w tym przykłady kodu, znajdziesz w sekcji Prompt Visibility API na stronie Konfigurowanie przerw w dostępie w czasie rzeczywistym.