Modificare l'interfaccia utente di navigazione

Con Navigation SDK for Android, puoi modificare l'esperienza utente con la tua mappa determinando quali elementi e controlli dell'interfaccia utente integrati devono essere visualizzati sulla mappa. Puoi anche modificare l'aspetto dell'interfaccia utente di navigazione. Consulta la pagina Norme per le linee guida sulle modifiche accettabili all'interfaccia utente di navigazione.

Questo documento descrive come modificare l'interfaccia utente della mappa in due modi:

Controlli dell'interfaccia utente della mappa

I controlli dell'interfaccia utente della mappa sono il modo consigliato per posizionare elementi dell'interfaccia utente personalizzati nella visualizzazione di navigazione per garantire il posizionamento corretto. Quando il layout integrato cambia, Navigation SDK per Android riposiziona automaticamente i controlli personalizzati. Puoi impostare una sola visualizzazione dei controlli personalizzati alla volta per ogni posizione. Se il tuo design richiede più elementi dell'interfaccia utente, puoi inserirli in un ViewGroup e passarlo al metodo setCustomControl.

Il metodo setCustomControl fornisce le posizioni come definite nell'enum CustomControlPosition:

  • SECONDARY_HEADER (viene visualizzato solo in modalità Ritratto)
  • BOTTOM_START_BELOW
  • BOTTOM_END_BELOW
  • FOOTER
Posizioni dei controlli personalizzati per l'orientamento verticale.
Posizioni dei controlli personalizzati per l'orientamento verticale
Posizioni dei controlli personalizzate per l'orientamento orizzontale.
Posizioni dei controlli personalizzati per l'orientamento orizzontale

Aggiungere un controllo personalizzato

  1. Crea una vista Android con l'elemento dell'interfaccia utente o ViewGroup personalizzato.
  2. Infla l'XML o esegui l'inizializzazione della vista personalizzata per ottenere un'istanza della vista.
  3. Utilizza NavigationView.setCustomControl o SupportNavigationFragment.setCustomControl con la posizione del controllo personalizzato scelto dall'CustomControlPosition enum.

    L'esempio seguente crea un frammento e aggiunge un controllo personalizzato nella posizione dell'intestazione secondaria.

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

Rimuovere un controllo personalizzato

Per rimuovere un controllo personalizzato, chiama il metodo setCustomControl con un parametro di visualizzazione null e la posizione del controllo personalizzato scelto.

Ad esempio, lo snippet seguente rimuove eventuali intestazioni secondarie personalizzate e ripristina i contenuti predefiniti:

mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);

Posizioni dei controlli personalizzati

Intestazione secondaria

Posizione del controllo personalizzato dell'intestazione secondaria per l'orientamento verticale.
Posizione del controllo personalizzato dell'intestazione secondaria per l'orientamento verticale

Per utilizzare questa posizione del controllo personalizzato, passa la posizione CustomControlPosition.SECONDARY_HEADER a setCustomControl.

Per impostazione predefinita, i layout delle schermate in modalità di navigazione prevedono una posizione per un'intestazione secondaria sotto l'intestazione principale. Questa intestazione secondaria viene visualizzata se necessario, ad esempio con le indicazioni stradali. L'app può utilizzare questa posizione del layout della sezione del titolo secondario per i contenuti personalizzati. Quando utilizzi questa funzionalità, il controllo copre tutti i contenuti dell'intestazione secondaria predefinita. Se la visualizzazione di navigazione ha un sfondo, questo rimane in posizione, coperto dall'intestazione secondaria. Quando l'app rimuove il controllo personalizzato, al suo posto può essere visualizzata qualsiasi intestazione secondaria predefinita.

La posizione dell'intestazione secondaria personalizzata allinea il bordo superiore al bordo inferiore dell'intestazione principale. Questa posizione è supportata solo in portrait mode. In landscape mode, l'intestazione secondaria non è disponibile e il layout non subisce modifiche.

Inizio da basso

Posizione del controllo personalizzato di inizio in basso per l'orientamento verticale.
Posizione del controllo personalizzato di inizio in basso per l'orientamento verticale
Posizione del controllo personalizzato di inizio in basso per l'orientamento orizzontale.
Posizione del controllo personalizzato in basso a sinistra per l'orientamento orizzontale

Per utilizzare questa posizione del controllo personalizzato, passa la posizione CustomControlPosition.BOTTOM_START_BELOW a setCustomControl.

Questa posizione del controllo personalizzato si trova nell'angolo inferiore sinistro della mappa. In entrambi portrait mode e landscape mode, si trova sopra la scheda ETA e/o il piè di pagina personalizzato (o nella parte inferiore della mappa se non sono presenti), mentre gli elementi dell'SDK Nav, tra cui il pulsante di reimpostazione della visualizzazione al centro e il logo di Google, si spostano verso l'alto per tenere conto dell'altezza della visualizzazione del controllo personalizzato. Questo controllo è posizionato all'interno dei confini della mappa visibili, pertanto qualsiasi spaziatura aggiunta ai bordi inferiore o iniziale della mappa cambierà anche la posizione di questo controllo.

Parte inferiore

Posizione del controllo personalizzato in basso per l'orientamento verticale.
Posizione del controllo personalizzato in basso per l'orientamento verticale
Posizione del controllo personalizzato in basso per l'orientamento orizzontale.
Posizione del controllo personalizzato in basso per l'orientamento orizzontale

Per utilizzare questa posizione del controllo personalizzato, passa la posizione CustomControlPosition.BOTTOM_END_BELOW a setCustomControl.

Questa posizione del controllo personalizzato si trova nell'angolo in basso a destra della mappa. In portrait mode, si trova sopra la scheda ETA e/o il piè di pagina personalizzato (o lungo la parte inferiore della mappa se non sono presenti), ma in landscape mode è allineato con la parte inferiore della mappa. Gli elementi dell'SDK Nav visibili sul lato opposto (lato destro in LTR) si spostano verso l'alto per tenere conto dell'altezza della visualizzazione del controllo personalizzato. Questo controllo è posizionato all'interno dei limiti della mappa visibili, pertanto eventuali spazi aggiuntivi aggiunti ai bordi inferiori o finali della mappa modificheranno anche la posizione di questo controllo.

Posizione del controllo personalizzato del piè di pagina per l'orientamento verticale.
Posizione del controllo personalizzato del piè di pagina per l'orientamento verticale
Posizione del controllo personalizzato del piè di pagina per l'orientamento orizzontale.
Posizione del controllo personalizzato del piè di pagina per l'orientamento orizzontale

Per utilizzare questa posizione del controllo personalizzato, passa la posizione CustomControlPosition.FOOTER a setCustomControl.

Questa posizione del controllo personalizzato è progettata per una visualizzazione del piè di pagina personalizzato. Se la scheda Orari di arrivo stimato del SDK Nav è visibile, questo controllo si trova sopra. In caso contrario, il controllo è alinhato con la parte inferiore della mappa. A differenza dei controlli personalizzati BOTTOM_START_BELOW e BOTTOM_END_BELOW, questo controllo è posizionato al di fuori dei limiti della mappa visibili, il che significa che eventuali spazi aggiuntivi aggiunti alla mappa non cambieranno la posizione di questo controllo.

In portrait mode, il piè di pagina personalizzato è a tutta larghezza. I controlli personalizzati nelle posizioni CustomControlPosition.BOTTOM_START_BELOW e CustomControlPosition.BOTTOM_END_BELOW, nonché gli elementi dell'interfaccia utente dell'SDK Nav come il pulsante di reimpostazione al centro e il logo Google, sono posizionati sopra il piè di pagina del controllo personalizzato. La posizione predefinita del triangolo prende in considerazione l'altezza personalizzata del piè di pagina.

In landscape mode, il piè di pagina personalizzato è metà della larghezza ed è allineato al lato iniziale (lato sinistro in LTR), proprio come la scheda ETA dell'SDK Nav. I controlli personalizzati nella posizione CustomControlPosition.BOTTOM_START_BELOW e gli elementi dell'interfaccia utente dell'SDK Nav, come il pulsante di centratura e il logo di Google, sono posizionati sopra il piè di pagina del controllo personalizzato. I controlli personalizzati in posizione CustomControlPosition.BOTTOM_END_BELOW e tutti gli elementi dell'interfaccia utente di Nav SDK lungo il lato di chiusura (lato destro in LTR) rimangono allineati alla parte inferiore della mappa. La posizione predefinita del triangolo non cambia se è presente un piè di pagina personalizzato, poiché il piè di pagina non si estende fino al lato finale della mappa.

I controlli personalizzati nelle posizioni CustomControlPosition.BOTTOM_START_BELOW e CustomControlPosition.BOTTOM_END_BELOW, nonché gli elementi dell'interfaccia utente dell'SDK Nav come il pulsante di centratura e il logo Google, sono posizionati sopra il piè di pagina del controllo personalizzato.

Accessori dell'interfaccia utente della mappa

L'SDK Navigation per Android fornisce accessori dell'interfaccia utente visualizzati durante la navigazione, simili a quelli presenti nell'applicazione Google Maps per Android. Puoi regolare la visibilità o l'aspetto di questi controlli come descritto in questa sezione. Le modifiche apportate qui vengono applicate durante la successiva sessione di navigazione.

Consulta la pagina Norme per le linee guida sulle modifiche accettabili all'interfaccia utente di navigazione.

Visualizza il codice

Modificare l'intestazione di navigazione

Utilizza SupportNavigationFragment.setStylingOptions() o NavigationView.setStylingOptions() per cambiare il tema dell'intestazione di navigazione e l'indicatore della svolta successiva visualizzato sotto l'intestazione, se disponibile.

Puoi impostare i seguenti attributi:

Tipo di attributoAttributi
Colore sfondo
  • Modalità giorno principale: il colore diurno dell'intestazione di navigazione
  • Modalità giorno secondaria: il colore diurno dell'indicatore della svolta successiva
  • Modalità notturna principale: il colore notturno dell'intestazione di navigazione
  • Modalità notturna secondaria: il colore notturno dell'indicatore della svolta successiva
Elementi di testo per le istruzioni
  • Colore testo
  • Carattere
  • Dimensioni del testo della prima riga
  • Dimensioni del testo della seconda riga
Elementi di testo per i passaggi successivi
  • Carattere
  • Colore del testo del valore della distanza
  • Dimensioni del testo del valore della distanza
  • Colore del testo delle unità di misura della distanza
  • Dimensioni del testo delle unità di misura della distanza
Icone di manovra
  • Colore dell'icona della manovra grande
  • Colore dell'icona della manovra piccola
Indicazioni sulle corsie in cui posizionarsi
  • Colore della corsia o delle corsie consigliate

L'esempio seguente mostra come impostare le opzioni di stile:

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

Disattivare il livello di traffico

Utilizza GoogleMap.setTrafficEnabled() per attivare o disattivare il livello di traffico sulla mappa. Questa impostazione influisce sulle indicazioni della densità del traffico mostrate sulla mappa nel suo complesso. Tuttavia, non influisce sulle indicazioni sul traffico sul percorso tracciato dal navigatore.

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

Attivare semafori e segnali di stop

Puoi attivare la visualizzazione di semafori e segnali di stop nella mappa durante la navigazione attiva, in modo da avere un contesto aggiuntivo per i percorsi e le manovre.

Per impostazione predefinita, i semafori e i segnali di stop sono disattivati nell'SDK Navigation. Per attivare questa funzionalità, chiama DisplayOptions per ogni funzionalità indipendentemente.

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

Aggiungere indicatori personalizzati

L'SDK Navigation per Android ora utilizza le API Google Maps per gli indicatori. Per saperne di più, consulta la documentazione dell'API Maps.

Testo fluttuante

Puoi aggiungere testo fluttuante in qualsiasi punto dell'app, a condizione che non copra l'attribuzione a Google. L'SDK Navigation non supporta l'ancoraggio del testo a una latitudine/longitudine sulla mappa o a un'etichetta. Per ulteriori informazioni, vai a Finestre informative.

Visualizzare il limite di velocità

Puoi mostrare o nascondere l'icona del limite di velocità tramite codice. Utilizza NavigationView.setSpeedLimitIconEnabled() o SupportNavigationFragment.setSpeedLimitIconEnabled() per mostrare o nascondere l'icona del limite di velocità. Se l'opzione è attivata, l'icona del limite di velocità viene visualizzata in un angolo in basso durante la guida assistita. L'icona mostra il limite di velocità della strada su cui viaggia il veicolo. L'icona viene visualizzata solo nelle località in cui sono disponibili dati affidabili sui limiti di velocità.

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

L'icona del limite di velocità viene nascosta temporaneamente quando viene visualizzato il pulsante per centrare la mappa.

Impostare la modalità notturna

Puoi controllare il comportamento della modalità notturna tramite programmazione. Utilizza NavigationView.setForceNightMode() o SupportNavigationFragment.setForceNightMode() per attivare o disattivare la modalità notturna oppure lascia che sia l'SDK Navigation per Android a controllarla.

  • AUTO Consente all'SDK di navigazione di determinare la modalità appropriata in base alla posizione e all'ora locale del dispositivo.
  • FORCE_NIGHT forza l'attivazione della modalità notturna.
  • FORCE_DAY forza l'attivazione della modalità giorno.

L'esempio seguente mostra come forzare l'attivazione della modalità notturna all'interno di un frammento di navigazione:

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

Mostra elenco indicazioni stradali

Innanzitutto, crea la visualizzazione e aggiungila alla gerarchia.

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

Assicurati di inoltrare gli eventi del ciclo di vita a DirectionsListView, come avviene per NavigationView. Ad esempio:

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

Nascondere i percorsi alternativi

Quando l'interfaccia utente è troppo ingombrata da troppe informazioni, puoi ridurre il numero di percorsi alternativi rispetto a quelli predefiniti (due) o non mostrare alcun percorso alternativo. Puoi configurare questa opzione prima di recuperare le route chiamando il metodo RoutingOptions.alternateRoutesStrategy() con uno dei seguenti valori di enumerazione:

Valore di enumerazioneDescrizione
AlternateRoutesStrategy.SHOW_ALL Predefinita. Mostra fino a due percorsi alternativi.
AlternateRoutesStrategy.SHOW_ONE Mostra un percorso alternativo (se disponibile).
AlternateRoutesStrategy.SHOW_NONE Nasconde i percorsi alternativi.

Il seguente esempio di codice mostra come nascondere completamente i percorsi alternativi.

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

Barra di avanzamento del viaggio

La barra di avanzamento del viaggio aggiunta alla navigazione.

La barra di avanzamento del viaggio è una barra verticale che viene visualizzata sul lato iniziale/di marcia della mappa all'avvio della navigazione. Se è attiva, viene visualizzata una panoramica di un intero viaggio, insieme alla destinazione e alla posizione corrente dell'utente.

Consente agli utenti di anticipare rapidamente eventuali problemi imminenti, come il traffico, senza dover aumentare lo zoom. Se necessario, può cambiare il percorso della corsa. Se l'utente cambia il percorso della corsa, la barra di avanzamento viene reimpostata come se da quel punto fosse iniziata una nuova corsa.

La barra di avanzamento del viaggio mostra i seguenti indicatori di stato:

  • Percorso trascorso: la parte del viaggio trascorsa.

  • Posizione attuale: la posizione attuale dell'utente nel viaggio.

  • Stato del traffico: lo stato del traffico che si trova davanti.

  • Destinazione finale: la destinazione finale del viaggio.

Attiva la barra di avanzamento del viaggio chiamando il metodo setTripProgressBarEnabled() su NavigationView o SupportNavigationFragment. Ad esempio:

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

Posizionamento della barra di avanzamento del viaggio

  • Il lato sinistro della barra è allineato approssimativamente alla parte sinistra del tachimetro, del logo Google e del pulsante Ricentra (se visibile). La larghezza è 12 dp.
  • La barra di avanzamento del viaggio mantiene un'altezza fissa. Per adattarsi alle limitazioni di spazio verticale nei dispositivi più piccoli, la visibilità e l'altezza della barra di avanzamento del viaggio si adattano in base ai punti di interruzione specificati nell'altezza dello schermo. Questi punti di interruzione sono indipendenti dall'orientamento del dispositivo e dallo spazio effettivamente occupato dalla mappa sullo schermo:
  • Altezza dello schermo Visibilità della barra di avanzamento del viaggio Altezza della barra di avanzamento del viaggio Posizione dell'asse Y della barra di avanzamento del viaggio
    Piccolo: da 0 a 551 dp Non visibile N/D N/D
    Media: 552 dp - 739 dp Visibile 130 dp Controlli laterali sopra l'avvio (tachimetro / logo Google / pulsante di reimpostazione al centro)
    Grande: 740 dp e oltre Visibile 290 dp Controlli laterali sopra l'avvio (tachimetro / logo Google / pulsante di reimpostazione al centro)
  • Se la barra di avanzamento del viaggio si sovrappone alla scheda di svolta o ad altri elementi dell'interfaccia utente di Navigazione, viene visualizzata sotto questi altri elementi.

API Prompt Visibility (sperimentale)

L'API Prompt Visibility ti consente di evitare conflitti tra gli elementi dell'interfaccia utente generati dall'SDK Navigation e i tuoi elementi dell'interfaccia utente personalizzati aggiungendo un listener per ricevere un callback prima che un elemento dell'interfaccia utente dell'SDK Navigation stia per essere visualizzato e non appena l'elemento viene rimosso. Per ulteriori informazioni, inclusi i sample di codice, consulta la sezione API Prompt Visibility della pagina Configurare le interruzioni in tempo reale.