Cómo personalizar la interfaz de usuario de Navigation

Puedes personalizar elementos de la interfaz de usuario de navegación y el mapa, y agregar marcadores personalizados al mapa. Consulta la página Políticas para obtener lineamientos sobre modificaciones aceptables en la IU de Navigation.

Consulta el código

Cómo personalizar el encabezado de navegación

Usa NavigationFragment.setStylingOptions() o NavigationView.setStylingOptions() para cambiar el tema del encabezado de navegación y el indicador de próximo giro que aparece debajo del encabezado cuando esté disponible.

Puedes configurar los siguientes atributos:

Tipo de atributoAtributos
Color de fondo
  • Modo diurno principal: el color durante el día del encabezado de navegación
  • Modo diurno secundario: el color diurno del indicador de próximo giro.
  • Modo nocturno principal: Indica el color nocturno del encabezado de navegación.
  • Modo nocturno secundario: el color nocturno del indicador de próximo giro
Elementos de texto para instrucciones
  • Color del texto
  • Fuente
  • Tamaño del texto de la primera fila
  • Tamaño del texto de la segunda fila
Elementos de texto para los próximos pasos
  • Fuente
  • Color del texto del valor de distancia
  • Tamaño del texto del valor de distancia
  • Color del texto de las unidades de distancia
  • Tamaño del texto de las unidades de distancia
Íconos de maniobras
  • Color del ícono de maniobras grandes
  • Color del ícono de maniobra pequeña
Indicación de carril
  • Color del carril o carril recomendados

En el siguiente ejemplo, se muestra cómo configurar las opciones de diseño:

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

Cómo desactivar la capa de tráfico

Utiliza NavigationMap.setTrafficEnabled() para habilitar o inhabilitar la capa de tráfico en el mapa. Esta configuración afecta las indicaciones de densidad de tráfico que se muestran en el mapa en su totalidad, pero no afecta las indicaciones de tráfico en la ruta que traza el navegador.

private NavigationMap mMap;
// Get the map.
mMap = mNavFragment.getMap();
// Turn off the traffic layer on the map.
mMap.setTrafficEnabled(false);

Cómo agregar marcadores personalizados

Puedes agregar marcadores personalizados al mapa para indicar lugares de interés para tu aplicación o usuarios. Por ejemplo, es posible que desees indicar el punto de partida al final de la ruta. Usa NavigationMap.addMarker() para agregar un marcador y NavigationMap.setOnMarkerClickListener() para escuchar las presiones sobre un marcador.

En el siguiente código, se usa un ícono almacenado en los recursos de elementos de diseño del proyecto, R.drawable.ic_person_pin_48dp. Puedes usar cualquier imagen que se adapte a tu app.

// 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(destinationMarkerIcon)
            .title("Destination marker"));

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

Puedes especificar una imagen personalizada como marcador, pero, por el momento, el SDK no admite el etiquetado de estas imágenes con texto. Para obtener más información, consulta Cómo personalizar los marcadores.

Texto flotante

Puedes agregar texto flotante en cualquier lugar de la app, siempre y cuando no se abarque la atribución de Google. El SDK de Navigation no admite anclar el texto a una latitud o longitud en el mapa, ni a una etiqueta. Para obtener más información, consulta Ventanas de información.

Mostrar el límite de velocidad

Puedes ocultar o mostrar de manera programática el ícono de límite de velocidad. Usa NavigationFragment.setSpeedLimitIconEnabled(), NavigationView.setSpeedLimitIconEnabled() o SupportNavigationFragment.setSpeedLimitIconEnabled() para ocultar o mostrar el ícono de límite de velocidad. Cuando está habilitado, el ícono de límite de velocidad se muestra en una esquina inferior durante la guía. El ícono muestra el límite de velocidad de la ruta por la que viaja el vehículo. El ícono solo aparece en ubicaciones donde hay datos de límites de velocidad confiables disponibles.

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

El ícono de límite de velocidad se oculta temporalmente cuando se muestra el botón de volver a centrar.

Configurar modo nocturno

Puedes controlar el comportamiento del modo nocturno de manera programática. Usa NavigationFragment.setForceNightMode(), NavigationView.setForceNightMode() o SupportNavigationFragment.setForceNightMode() para activar o desactivar el modo nocturno, o bien deja que el SDK de Navigation lo controle.

  • AUTO Permite que el SDK de Navigation determine el modo apropiado según la ubicación del dispositivo y la hora local.
  • FORCE_NIGHT fuerza el modo nocturno.
  • FORCE_DAY fuerza el modo diurno.

En el siguiente ejemplo, se muestra cómo forzar la activación del modo nocturno en un fragmento de navegación:

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

Mostrar lista de instrucciones sobre cómo llegar

Primero, crea la vista y agrégala a tu jerarquía.

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

Asegúrate de reenviar los eventos de ciclo de vida a DirectionsListView tal como sucede con NaviagtionView. Por ejemplo:

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

Cómo ocultar rutas alternativas

Cuando la interfaz de usuario se satura con demasiada información, puedes reducir la sobrecarga si muestras menos rutas alternativas que las predeterminadas (dos) o no muestras ninguna ruta alternativa. Puedes configurar esta opción antes de recuperar las rutas mediante una llamada al método RoutingOptions.alternateRoutesStrategy() con uno de los siguientes valores de enumeración:

Valor de enumeraciónDescripción
AlternateRoutesStrategy.SHOW_ALL Predeterminado. Muestra hasta dos rutas alternativas.
AlternateRoutesStrategy.SHOW_ONE Muestra una ruta alternativa (si hay una disponible).
AlternateRoutesStrategy.SHOW_NONE Oculta rutas alternativas.

Ejemplo

En el siguiente ejemplo de código, se muestra cómo ocultar las rutas alternativas por completo.

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