Con el SDK de Navigation para Android, puedes modificar la experiencia del usuario con tu mapa. Para ello, debes determinar qué controles y elementos de la IU integrados aparecerán en el mapa. También puedes ajustar el aspecto visual de la IU de navegación. Consulta la página de políticas para obtener lineamientos sobre las modificaciones aceptables en la IU de navegación.
En este documento, se describe cómo modificar la interfaz de usuario de tu mapa de dos maneras:
Controles de la IU del mapa
Los controles de la IU del mapa son la forma recomendada de colocar elementos de la IU personalizados en la vista de navegación para garantizar un posicionamiento adecuado. Cuando cambia el diseño integrado, el SDK de Navigation para Android vuelve a posicionar automáticamente tus controles personalizados. Puedes establecer una vista de control personalizada a la vez para cada posición. Si tu diseño requiere varios elementos de la IU, puedes colocarlos en un ViewGroup
y pasarlo al método setCustomControl
.
El método setCustomControl
proporciona posiciones como se define en la enumeración CustomControlPosition
:
SECONDARY_HEADER
(solo aparece en modo vertical)BOTTOM_START_BELOW
BOTTOM_END_BELOW
FOOTER
Cómo agregar un control personalizado
- Crea un Android View con el elemento de IU o ViewGroup personalizado.
- Expande el XML o crea una instancia de la vista personalizada para obtener una instancia de la vista.
Usa
NavigationView.setCustomControl
oSupportNavigationFragment.setCustomControl
con la posición de control personalizada elegida de la enumeraciónCustomControlPosition
.En el siguiente ejemplo, se crea un fragmento y se agrega un control personalizado en la posición del encabezado secundario.
mNavFragment.setCustomControl(getLayoutInflater(). inflate(R.layout.your_custom_control, null), CustomControlPosition.SECONDARY_HEADER); ```
Cómo quitar un control personalizado
Para quitar un control personalizado, llama al método setCustomControl
con un parámetro de vista null
y la posición del control personalizado elegida.
Por ejemplo, el siguiente fragmento quita cualquier encabezado secundario personalizado y vuelve al contenido predeterminado:
mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);
Posiciones de los controles personalizados
Encabezado secundario
Para usar esta posición de control personalizada, pasa la posición CustomControlPosition.SECONDARY_HEADER
a setCustomControl
.
De forma predeterminada, los diseños de pantalla en modo de navegación proporcionan una posición para un encabezado secundario ubicado debajo del encabezado principal. Este encabezado secundario aparece cuando es necesario, como con la guía de carriles. Tu app puede usar esta posición de encabezado secundario del diseño para el contenido personalizado. Cuando usas esta función, el control abarca todo el contenido predeterminado del encabezado secundario. Si tu vista de navegación tiene un fondo, este permanecerá en su lugar, cubierto por el encabezado secundario. Cuando tu app quita el control personalizado, puede aparecer cualquier encabezado secundario predeterminado en su lugar.
La posición del encabezado secundario personalizado alinea su borde superior con el borde inferior del encabezado principal. Esta posición solo se admite en portrait mode
. En landscape mode
, el encabezado secundario no está disponible y el diseño no cambia.
Inicio inferior
Para usar esta posición de control personalizada, pasa la posición CustomControlPosition.BOTTOM_START_BELOW
a setCustomControl
.
Esta posición de control personalizado se encuentra en la esquina inferior inicial del mapa. En portrait mode
y landscape mode
, se encuentra sobre la tarjeta de ETA o el pie de página personalizado (o en la parte inferior del mapa si no hay ninguno), y los elementos del SDK de Nav, incluido el botón para volver a centrar y el logotipo de Google, se mueven hacia arriba para tener en cuenta la altura de la vista de control personalizado. Este control se ubica dentro de los límites visibles del mapa, por lo que cualquier padding que se agregue a los bordes inferior o inicial del mapa también cambiará la posición de este control.
Extremo inferior
Para usar esta posición de control personalizada, pasa la posición CustomControlPosition.BOTTOM_END_BELOW
a setCustomControl
.
Esta posición de control personalizado se encuentra en la esquina inferior del mapa. En portrait mode
, se encuentra sobre la tarjeta de hora de llegada o el pie de página personalizado (o en la parte inferior del mapa si no hay ninguno), pero en landscape mode
está alineado con la parte inferior del mapa. Todos los elementos del SDK de Nav visibles a lo largo del lado final (lado derecho en LTR) se mueven hacia arriba para tener en cuenta la altura de la vista de control personalizado. Este control se ubica dentro de los límites visibles del mapa, por lo que cualquier padding que se agregue a los bordes inferior o final del mapa también cambiará la posición de este control.
Pie de página
Para usar esta posición de control personalizada, pasa la posición CustomControlPosition.FOOTER
a setCustomControl
.
Esta posición de control personalizada está diseñada para una vista de pie de página personalizada. Si la tarjeta de hora de llegada del SDK de Nav está visible, este control se encuentra sobre ella. De lo contrario, el control se alinea con la parte inferior del mapa. A diferencia de los controles personalizados BOTTOM_START_BELOW
y BOTTOM_END_BELOW
, este control se ubica fuera de los límites visibles del mapa, lo que significa que cualquier padding que se agregue al mapa no cambiará la posición de este control.
En portrait mode
, el pie de página personalizado tiene el ancho completo. Los controles personalizados en las posiciones CustomControlPosition.BOTTOM_START_BELOW
y CustomControlPosition.BOTTOM_END_BELOW
, así como los elementos de la IU del SDK de Nav, como el botón para volver a centrar y el logotipo de Google, se ubican sobre el pie de página del control personalizado. La posición predeterminada del signo de intercalación tiene en cuenta la altura del pie de página personalizado.
En landscape mode
, el pie de página personalizado tiene la mitad de ancho y está alineado con el lado de inicio (lado izquierdo en LTR), al igual que la tarjeta de ETA del SDK de Nav. Los controles personalizados en la posición CustomControlPosition.BOTTOM_START_BELOW
y los elementos de la IU del SDK de Nav, como el botón para volver a centrar y el logotipo de Google, se ubican sobre el pie de página del control personalizado. Los controles personalizados en la posición CustomControlPosition.BOTTOM_END_BELOW
y cualquier elemento de la IU del SDK de Nav a lo largo del lado final (lado derecho en LTR) permanecen alineados con la parte inferior del mapa. La posición predeterminada del signo de intercalación no cambia cuando hay un pie de página personalizado, ya que este no se extiende hasta el extremo del mapa.
Los controles personalizados en las posiciones CustomControlPosition.BOTTOM_START_BELOW
y CustomControlPosition.BOTTOM_END_BELOW
, así como los elementos de la IU del SDK de Nav, como el botón para volver a centrar y el logotipo de Google, se encuentran ubicados sobre el pie de página del control personalizado.
Accesorios de la IU del mapa
El SDK de Navigation para Android proporciona accesorios de la IU que aparecen durante la navegación, similares a los que se encuentran en la aplicación de Google Maps para Android. Puedes ajustar la visibilidad o el aspecto visual de estos controles como se describe en esta sección. Los cambios que realices aquí se reflejarán durante la próxima sesión de navegación.
Consulta la página de políticas para obtener lineamientos sobre las modificaciones aceptables en la IU de navegación.
Consulta el código
Modifica el encabezado de navegación
Usa SupportNavigationFragment.setStylingOptions()
o NavigationView.setStylingOptions()
para cambiar el tema del encabezado de navegación y el indicador de giro que aparece debajo del encabezado cuando está disponible.
Puedes establecer los siguientes atributos:
Tipo de atributo | Atributos |
---|---|
Color de fondo |
|
Elementos de texto para las instrucciones |
|
Elementos de texto para los próximos pasos |
|
Íconos de maniobra |
|
Indicación de carril |
|
En el siguiente ejemplo, se muestra cómo establecer opciones de diseño:
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));
Cómo desactivar la capa de tráfico
Usa GoogleMap.setTrafficEnabled()
para habilitar o inhabilitar la capa de tráfico en el mapa. Este parámetro de configuración afecta a las indicaciones de densidad de tráfico que se muestran en el mapa en su totalidad. Sin embargo, no afecta las indicaciones de tráfico en la ruta que traza el navegador.
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));
Habilita los semáforos y los carteles de alto
Puedes habilitar los semáforos y los carteles de alto en la IU del mapa. Con esta función, el usuario puede habilitar la visualización de semáforos o íconos de señales de alto a lo largo de su ruta, lo que proporciona un mejor contexto para viajes más eficientes y precisos.
De forma predeterminada, los semáforos y los carteles de alto están inhabilitados en el SDK de Navigation. Para habilitar esta función, llama a DisplayOptions
para cada función de forma independiente.
DisplayOptions displayOptions =
new DisplayOptions().showTrafficLights(true).showStopSigns(true);
Agrega marcadores personalizados
El SDK de Navigation para Android ahora usa las APIs de Google Maps para los marcadores. Para obtener más información, consulta la documentación de la API de Maps.
Texto flotante
Puedes agregar texto flotante en cualquier parte de la app, siempre y cuando no cubra la atribución de Google. El SDK de Navigation no admite fijar el texto a una latitud/longitud en el mapa ni a una etiqueta. Para obtener más información, consulta Ventanas de información.
Cómo mostrar el límite de velocidad
Puedes ocultar o mostrar el ícono de límite de velocidad de forma programática. Usa NavigationView.setSpeedLimitIconEnabled()
o SupportNavigationFragment.setSpeedLimitIconEnabled()
para mostrar o ocultar 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 circula el vehículo. El ícono solo aparece en ubicaciones donde hay datos confiables de límites de velocidad 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 para volver a centrar.
Cómo configurar el modo nocturno
Puedes controlar de forma programática el comportamiento del modo nocturno. Usa NavigationView.setForceNightMode()
o SupportNavigationFragment.setForceNightMode()
para activar o desactivar el modo nocturno, o bien permite que el SDK de Navigation para Android 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
activa el modo nocturno.FORCE_DAY
activa el modo diurno.
En el siguiente ejemplo, se muestra cómo forzar el modo nocturno para que se active dentro de un fragmento de navegación:
// Force night mode on.
mNavFragment.setForceNightMode(FORCE_NIGHT);
Cómo mostrar la lista de instrucciones sobre cómo llegar
Primero, crea la vista y agrégala a tu jerarquía.
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));
}
Asegúrate de reenviar los eventos de ciclo de vida a DirectionsListView
, al igual que lo haces con NavigationView
. Por ejemplo:
protected void onResume() {
super.onResume();
directionsListView.onResume();
}
Cómo ocultar rutas alternativas
Cuando la interfaz de usuario se llena de demasiada información, puedes reducir el desorden mostrando menos rutas alternativas que las predeterminadas (dos) o no mostrando ninguna ruta alternativa. Puedes configurar esta opción antes de recuperar las rutas llamando al método RoutingOptions.alternateRoutesStrategy()
con uno de los siguientes valores de enumeración:
Valor de enumeración | Descripció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 las rutas alternativas. |
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);
Barra de progreso del viaje
La barra de progreso del viaje es una barra vertical que aparece en el borde derecho del mapa cuando comienza la navegación. Cuando está habilitado, muestra una descripción general de un viaje completo, junto con el destino y la posición actual del usuario.
Les permite a los usuarios anticipar rápidamente cualquier problema, como el tráfico, sin necesidad de acercar la imagen. Luego, puede redireccionar el viaje si es necesario. Si el usuario cambia la ruta del viaje, la barra de progreso se restablece como si se hubiera iniciado un viaje nuevo desde ese punto.
La barra de progreso del viaje muestra los siguientes indicadores de estado:
Recorrido transcurrido: Es la parte del viaje transcurrido.
Posición actual: Es la ubicación actual del usuario en el viaje.
Estado del tráfico: Es el estado del tráfico que se aproxima.
Destino final: Es el destino final del viaje.
Para habilitar la barra de progreso del viaje, llama al método setTripProgressBarEnabled()
en NavigationView o SupportNavigationFragment.
Por ejemplo:
// Enable the trip progress bar.
mNavFragment.setTripProgressBarEnabled(true);