Modifier l'interface utilisateur de navigation

Le SDK Navigation pour Android vous permet de modifier l'expérience utilisateur avec votre carte en déterminant quels éléments et commandes d'interface utilisateur intégrés s'affichent sur la carte. Vous pouvez également ajuster l'apparence visuelle de l'interface utilisateur de navigation. Consultez la page des règles pour connaître les consignes concernant les modifications acceptables de l'interface utilisateur de navigation.

Ce document explique comment modifier l'interface utilisateur de votre carte de deux manières :

Commandes d'interface utilisateur de la carte

Pour placer des éléments d'interface utilisateur personnalisés dans la vue de navigation, utilisez les commandes d'interface utilisateur de la carte pour un positionnement correct. Lorsque la mise en page intégrée change, le SDK Navigation pour Android repositionne automatiquement vos commandes personnalisées. Vous pouvez définir une vue de contrôle personnalisée à la fois pour chaque position. Si votre conception nécessite plusieurs éléments d'interface utilisateur, vous pouvez les placer dans un ViewGroup et les transmettre à la méthode setCustomControl.

La méthode setCustomControl fournit des positions telles que définies dans l'énumération CustomControlPosition :

  • SECONDARY_HEADER (s'affiche en mode Portrait uniquement)
  • BOTTOM_START_BELOW
  • BOTTOM_END_BELOW
  • FOOTER
Positions des commandes personnalisées pour l'orientation portrait.
Positions des commandes personnalisées pour l'orientation portrait
Positions des commandes personnalisées pour l'orientation paysage.
Positions des commandes personnalisées pour l'orientation paysage

Ajouter une commande personnalisée

  1. Créez une vue Android avec l'élément d'interface utilisateur ou le ViewGroup personnalisé.
  2. Gonflez le fichier XML ou instanciez la vue personnalisée pour obtenir une instance de la vue.
  3. Utilisez NavigationView.setCustomControl ou NavigationFragment.setCustomControl avec la position de commande personnalisée choisie dans l'énumération CustomControlPosition.

    L'exemple suivant crée un fragment et ajoute une commande personnalisée à la position de l'en-tête secondaire.

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

Supprimer un contrôle personnalisé

Pour supprimer une commande personnalisée, appelez la méthode setCustomControl avec un paramètre de vue null et la position de la commande personnalisée choisie.

Par exemple, l'extrait de code suivant supprime tout en-tête secondaire personnalisé et rétablit le contenu par défaut :

mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);

Positions des commandes personnalisées

En-tête secondaire

Position de la commande personnalisée de l'en-tête secondaire pour l'orientation portrait.
Position de la commande personnalisée de l'en-tête secondaire pour l'orientation portrait

Pour utiliser cette position de commande personnalisée, transmettez la position CustomControlPosition.SECONDARY_HEADER à setCustomControl.

Par défaut, les mises en page en mode navigation fournissent une position pour un en-tête secondaire situé sous l'en-tête principal. Cet en-tête secondaire s'affiche si nécessaire, par exemple pour l'assistance au changement de voie. Votre application peut utiliser cette position d'en-tête secondaire de la mise en page pour le contenu personnalisé. Lorsque vous utilisez cette fonctionnalité, votre contrôle couvre tout contenu d'en-tête secondaire par défaut. Si votre vue de navigation comporte un arrière-plan, celui-ci reste en place, couvert par l'en-tête secondaire. Lorsque votre application supprime la commande personnalisée, un en-tête secondaire par défaut peut s'afficher à la place.

La position de l'en-tête secondaire personnalisé aligne son bord supérieur sur le bord inférieur de l'en-tête principal. Cette position n'est disponible que dans portrait mode. Dans landscape mode, l'en-tête secondaire n'est pas disponible et la mise en page ne change pas.

Bottom start

Position de la commande personnalisée de démarrage en bas pour l'orientation portrait.
Position de la commande personnalisée en bas à gauche pour l'orientation portrait
Position de la commande personnalisée de démarrage en bas pour l'orientation paysage.
Position de la commande personnalisée en bas à gauche pour l'orientation paysage

Pour utiliser cette position de commande personnalisée, transmettez la position CustomControlPosition.BOTTOM_START_BELOW à setCustomControl.

Cette position de commande personnalisée se trouve dans l'angle inférieur de départ de la carte. Dans portrait mode et landscape mode, elle se trouve au-dessus de la carte d'heure d'arrivée prévue et/ou du pied de page personnalisé (ou en bas de la carte si aucun des deux n'est présent). Les éléments du SDK Navigation, y compris le bouton de recentrage et le logo Google, se déplacent vers le haut pour tenir compte de la hauteur de la vue de contrôle personnalisée. Cette commande est positionnée dans les limites visibles de la carte. Par conséquent, tout remplissage ajouté aux bords inférieur ou de début de la carte modifiera également la position de cette commande.

Extrémité inférieure

Position de la commande personnalisée en bas pour l'orientation portrait.
Position de la commande personnalisée en bas pour l'orientation portrait
Position de la commande personnalisée en bas à droite pour l'orientation paysage.
Position de la commande personnalisée en bas de l'écran en mode paysage

Pour utiliser cette position de commande personnalisée, transmettez la position CustomControlPosition.BOTTOM_END_BELOW à setCustomControl.

Cette position de commande personnalisée se trouve dans l'angle inférieur de la carte. Dans portrait mode, il se trouve au-dessus de la carte d'heure d'arrivée prévue et/ou du pied de page personnalisé (ou en bas de la carte si aucun des deux n'est présent), mais dans landscape mode, il est aligné avec le bas de la carte. Tous les éléments du SDK Navigation visibles sur le côté de fin (côté droit en LTR) se déplacent vers le haut pour tenir compte de la hauteur de la vue de contrôle personnalisée. Cette commande est positionnée dans les limites visibles de la carte. Par conséquent, tout remplissage ajouté aux bords inférieur ou d'extrémité de la carte modifiera également la position de cette commande.

Position de la commande personnalisée du pied de page pour l'orientation portrait.
Position de la commande personnalisée du pied de page pour l'orientation portrait
Position de la commande personnalisée du pied de page pour l'orientation paysage.
Position de la commande personnalisée du pied de page pour l'orientation paysage

Pour utiliser cette position de commande personnalisée, transmettez la position CustomControlPosition.FOOTER à setCustomControl.

Cette position de commande personnalisée est conçue pour une vue de pied de page personnalisée. Si la carte d'heure d'arrivée prévue du SDK Navigation est visible, cette commande se trouve au-dessus. Sinon, la commande est alignée sur le bas de la carte. Contrairement aux commandes personnalisées BOTTOM_START_BELOW et BOTTOM_END_BELOW, cette commande est positionnée en dehors des limites visibles de la carte. Cela signifie que tout remplissage ajouté à la carte ne modifiera pas la position de cette commande.

Dans portrait mode, le pied de page personnalisé s'affiche en pleine largeur. Les commandes personnalisées aux positions CustomControlPosition.BOTTOM_START_BELOW et CustomControlPosition.BOTTOM_END_BELOW, ainsi que les éléments d'interface utilisateur du SDK Navigation tels que le bouton de recentrage et le logo Google, sont positionnés au-dessus du pied de page des commandes personnalisées. La position par défaut du chevron tient compte de la hauteur du pied de page personnalisé.

Dans landscape mode, le pied de page personnalisé est de demi-largeur et aligné sur le côté de départ (côté gauche en LTR), tout comme la carte d'heure d'arrivée prévue du SDK Navigation. Les commandes personnalisées en position CustomControlPosition.BOTTOM_START_BELOW et les éléments d'interface utilisateur du SDK Navigation, comme le bouton de recentrage et le logo Google, sont positionnés au-dessus du pied de page des commandes personnalisées. Les commandes personnalisées en position CustomControlPosition.BOTTOM_END_BELOW et tous les éléments d'interface utilisateur du SDK Navigation situés sur le côté de fin (côté droit en LTR) restent alignés avec le bas de la carte. La position par défaut du chevron ne change pas lorsqu'un pied de page personnalisé est présent, car le pied de page ne s'étend pas jusqu'à l'extrémité de la carte.

Les commandes personnalisées aux positions CustomControlPosition.BOTTOM_START_BELOW et CustomControlPosition.BOTTOM_END_BELOW, ainsi que les éléments d'interface utilisateur du SDK Navigation tels que le bouton de recentrage et le logo Google, sont positionnés au-dessus du pied de page des commandes personnalisées.

Accessoires de l'UI de la carte

Le SDK Navigation pour Android fournit des accessoires d'interface utilisateur qui s'affichent pendant la navigation, semblables à ceux de l'application Google Maps pour Android. Vous pouvez ajuster la visibilité ou l'apparence visuelle de ces commandes, comme décrit dans cette section. Les modifications que vous apportez ici seront prises en compte lors de la prochaine session de navigation.

Consultez la page des règles pour connaître les consignes concernant les modifications acceptables de l'interface utilisateur de navigation.

Afficher le code

Mise en évidence de la destination et des entrées

Lorsqu'une destination est créée avec un placeID, le bâtiment de destination est mis en surbrillance et une icône d'entrée s'affiche, dans la mesure du possible. Ces repères visuels aident les utilisateurs à distinguer leur destination et à s'y rendre.

Pour créer une destination avec un placeID, utilisez la méthode Waypoint.Builder.setPlaceIdString().

Modifier l'en-tête de navigation

Utilisez NavigationFragment.setStylingOptions() ou NavigationView.setStylingOptions() pour modifier le thème de l'en-tête de navigation et de l'indicateur de changement de direction qui s'affiche sous l'en-tête, le cas échéant.

Vous pouvez définir les attributs suivants :

Type d'attributAttributs
Couleur de l'arrière-plan
  • Mode Jour principal : couleur de l'en-tête de navigation en journée
  • Mode jour secondaire : couleur de jour de l'indicateur de changement de direction
  • Mode nuit principal : couleur de l'en-tête de navigation la nuit
  • Mode nuit secondaire : couleur de nuit de l'indicateur de changement de direction
Éléments de texte pour les instructions
  • Couleur du texte
  • Police
  • Taille du texte de la première ligne
  • Taille du texte de la deuxième ligne
Éléments de texte pour les étapes suivantes
  • Police
  • Couleur du texte de la valeur de distance
  • Taille du texte de la valeur de distance
  • Couleur du texte des unités de distance
  • Taille du texte des unités de distance
Icônes de manœuvre
  • Couleur de la grande icône de manœuvre
  • Couleur de la petite icône de manœuvre
Assistant de voies de circulation
  • Couleur de la ou des voies recommandées

L'exemple suivant montre comment définir des options de style :

private NavigationFragment mNavFragment;
mNavFragment = (NavigationFragment) getSupportFragmentManager()
  .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));

Désactiver le calque de trafic

Utilisez GoogleMap.setTrafficEnabled() pour activer ou désactiver le calque de trafic sur la carte. Ce paramètre affecte les indications de densité du trafic affichées sur l'ensemble de la carte. Toutefois, cela n'affecte pas les indications de trafic sur l'itinéraire tracé par le navigateur.

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

Feux de circulation et panneaux stop

Icônes de feux de circulation et de panneaux stop le long d'un itinéraire de navigation.

Pendant la navigation active, la carte affiche les feux de circulation et les panneaux Stop pour donner aux utilisateurs plus de contexte sur l'itinéraire et les prochaines manœuvres. À partir de la version 8.0.0, vous ne pouvez pas désactiver cette fonctionnalité.

Ajouter des repères personnalisés

Le SDK Navigation pour Android utilise désormais les API Google Maps pour les repères. Pour en savoir plus, consultez la documentation de l'API Maps.

Texte flottant

Vous pouvez ajouter du texte flottant n'importe où dans votre application, à condition qu'il ne masque pas l'attribution Google. Le SDK Navigation ne permet pas d'ancrer le texte à une latitude/longitude sur la carte, ni à un libellé. Pour en savoir plus, consultez Fenêtres d'informations.

Afficher la limite de vitesse

Vous pouvez afficher ou masquer l'icône de limitation de vitesse de manière automatisée. Utilisez NavigationView.setSpeedLimitIconEnabled() ou NavigationFragment.setSpeedLimitIconEnabled() pour afficher ou masquer l'icône de limitation de vitesse. Lorsque cette option est activée, l'icône de limitation de vitesse s'affiche dans un angle inférieur pendant le guidage. L'icône affiche la limitation de vitesse de la route sur laquelle le véhicule circule. L'icône n'apparaît que dans les zones où des données fiables sur les limitations de vitesse sont disponibles.

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

L'icône de limitation de vitesse est temporairement masquée lorsque le bouton de recentrage est affiché.

Définir le mode Nuit

Vous pouvez contrôler le comportement du mode nuit de manière programmatique. Utilisez NavigationView.setForceNightMode() ou NavigationFragment.setForceNightMode() pour activer ou désactiver le mode nuit, ou laissez le SDK Navigation pour Android le contrôler.

  • AUTO : permet au SDK Navigation de déterminer le mode approprié en fonction de la position de l'appareil et de l'heure locale.
  • FORCE_NIGHT force l'activation du mode Nuit.
  • FORCE_DAY force l'activation du mode Jour.

L'exemple suivant montre comment forcer l'activation du mode nuit dans un fragment de navigation :

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

Afficher la liste des itinéraires

Commencez par créer la vue et l'ajouter à votre hiérarchie.

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

Veillez à transférer les événements de cycle de vie vers DirectionsListView, comme vous le faites avec NavigationView. Exemple :

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

Masquer les itinéraires bis

Lorsque l'interface utilisateur est encombrée par trop d'informations, vous pouvez réduire l'encombrement en affichant moins d'itinéraires bis que le nombre par défaut (deux) ou en n'affichant aucun itinéraire bis. Vous pouvez configurer cette option avant de récupérer les itinéraires en appelant la méthode RoutingOptions.alternateRoutesStrategy() avec l'une des valeurs d'énumération suivantes :

Valeur d'énumérationDescription
AlternateRoutesStrategy.SHOW_ALL Par défaut. Affiche jusqu'à deux itinéraires bis.
AlternateRoutesStrategy.SHOW_ONE Affiche un itinéraire bis (si disponible).
AlternateRoutesStrategy.SHOW_NONE Masque les itinéraires bis.

L'exemple de code suivant montre comment masquer complètement les itinéraires bis.

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

Barre de progression du trajet

Ajout de la barre de progression du trajet à la navigation.

La barre de progression du trajet est une barre verticale qui s'affiche sur le côté de départ/principal de la carte lorsque la navigation commence. Lorsqu'elle est activée, elle affiche un aperçu de l'ensemble du trajet, ainsi que la destination et la position actuelle de l'utilisateur.

Les utilisateurs peuvent ainsi anticiper les problèmes à venir, comme les embouteillages, sans avoir à zoomer. Ils peuvent ensuite modifier l'itinéraire si nécessaire. Si l'utilisateur modifie l'itinéraire du trajet, la barre de progression se réinitialise comme si un nouveau trajet avait commencé à partir de ce point.

La barre de progression du trajet affiche les indicateurs d'état suivants :

  • Route écoulée : partie écoulée du trajet.

  • Position actuelle : position actuelle de l'utilisateur pendant le trajet.

  • État du trafic : état du trafic à venir.

  • Destination finale : destination finale du trajet.

Activez la barre de progression du trajet en appelant la méthode setTripProgressBarEnabled() sur NavigationView ou NavigationFragment. Exemple :

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

Positionnement de la barre de progression du trajet

  • Le côté gauche de la barre est à peu près aligné avec le côté gauche du compteur de vitesse, du logo Google et du bouton "Recentrer" (lorsqu'il est visible). La largeur est de 12 dp.
  • La barre de progression du trajet conserve une hauteur statique. Pour s'adapter aux limites d'espace vertical sur les appareils plus petits, la visibilité et la hauteur de la barre de progression du trajet s'adaptent en fonction des points d'arrêt spécifiés pour la hauteur de l'écran. Ces points d'arrêt sont indépendants de l'orientation de l'appareil et de l'espace que la carte occupe réellement à l'écran :
  • Hauteur de l'écran Visibilité de la barre de progression du trajet Hauteur de la barre de progression du trajet Position de la barre de progression du trajet sur l'axe Y
    Petit : 0 dp à 551 dp Non visible N/A N/A
    Moyenne : 552 dp à 739 dp Visible 130 dp Au-dessus des commandes du côté de départ (compteur de vitesse / logo Google / bouton "Recentrer")
    Grand : 740 dp et plus Visible 290 dp Au-dessus des commandes du côté de départ (compteur de vitesse / logo Google / bouton "Recentrer")
  • Si la barre de progression du trajet chevauche la fiche de changement de direction ou d'autres éléments d'interface utilisateur de navigation, elle s'affiche sous ces autres éléments.

Boussole

Le SDK Navigation fournit une image de boussole qui apparaît dans l'angle supérieur droit de la carte, dans certaines conditions et uniquement lorsqu'elle est activée. Lorsque l'utilisateur clique sur la boussole, la caméra s'anime pour revenir à une direction de zéro (orientation par défaut), et la boussole disparaît progressivement juste après.

Si la navigation est activée et que le mode de la caméra est défini sur "Suivi", la boussole reste visible. Appuyer sur la boussole permet de basculer entre les perspectives de caméra inclinée et de vue d'ensemble.

Pour éviter la distraction du conducteur, la boussole reste au même endroit si l'en-tête (en mode Portrait) s'agrandit et entre en conflit avec la position par défaut de la boussole. Si vous ajoutez un contrôle personnalisé d'en-tête secondaire ou une vue d'accessoire d'en-tête, la boussole est masquée pour éviter les conflits d'UI.

La boussole est compatible avec les modes jour et nuit, ainsi qu'avec le mode sombre.

La boussole est activée par défaut. Vous pouvez activer ou désactiver la boussole à l'aide de la méthode compassEnabled de la classe GoogleMapOptions.

Désactiver les bâtiments 3D

Pour les appareils aux performances limitées, vous pouvez désactiver l'affichage des bâtiments en 3D en appelant GoogleMap.setBuildingsEnabled(false).

API Prompt Visibility (expérimentale)

L'API Prompt Visibility vous permet d'éviter les conflits entre les éléments d'interface utilisateur générés par le SDK Navigation et vos propres éléments d'interface utilisateur personnalisés. Pour ce faire, elle ajoute un écouteur qui reçoit un rappel avant qu'un élément d'interface utilisateur du SDK Navigation n'apparaisse et dès qu'il est supprimé. Pour en savoir plus, y compris pour obtenir des exemples de code, consultez la section API Prompt Visibility de la page Configurer les perturbations en temps réel.