Com o SDK do Navigation para Android, é possível modificar a experiência do usuário com o mapa, determinando quais controles e elementos integrados da interface aparecem no mapa. Também é possível ajustar a aparência visual da interface de navegação. Consulte a página Políticas para conferir as diretrizes sobre modificações aceitáveis na interface de navegação.
Este documento descreve como modificar a interface do usuário do mapa de duas maneiras:
Controles da interface do mapa
Para posicionar elementos personalizados da interface na visualização de navegação, use os controles da interface do mapa. Quando o layout integrado muda, o SDK do Navigation para Android reposiciona automaticamente os controles personalizados. É possível definir uma visualização de controle personalizado por vez para cada posição. Se o design exigir vários elementos da interface, coloque-os em um ViewGroup e transmita para o método setCustomControl.
O setCustomControl
método
fornece posições conforme definido na CustomControlPosition
enumeração:
SECONDARY_HEADER(aparece apenas no modo retrato)BOTTOM_START_BELOWBOTTOM_END_BELOWFOOTER
Adicionar um controle personalizado
- Crie uma visualização do Android com o elemento da interface personalizado ou ViewGroup.
- Infle o XML ou instancie a visualização personalizada para receber uma instância da visualização.
Use
NavigationView.setCustomControlouSupportNavigationFragment.setCustomControlcom a posição de controle personalizado escolhida naCustomControlPositionenum.O exemplo abaixo cria um fragmento e adiciona um controle personalizado na posição do cabeçalho secundário.
mNavFragment.setCustomControl(getLayoutInflater(). inflate(R.layout.your_custom_control, null), CustomControlPosition.SECONDARY_HEADER); ```
Remover um controle personalizado
Para remover um controle personalizado, chame o método setCustomControl com um parâmetro de visualização null e a posição de controle personalizado escolhida.
Por exemplo, o snippet a seguir remove qualquer cabeçalho secundário personalizado e retorna ao conteúdo padrão:
mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);
Posições de controle personalizado
Cabeçalho secundário
Para usar essa posição de controle personalizado, transmita a posição CustomControlPosition.SECONDARY_HEADER para setCustomControl.
Por padrão, os layouts de tela no modo de navegação fornecem uma posição para um cabeçalho secundário localizado abaixo do cabeçalho principal. Esse cabeçalho secundário aparece quando necessário, como com a indicação de faixa. Seu app pode usar essa posição de cabeçalho secundário do layout para conteúdo personalizado. Quando você usa esse recurso, o controle cobre qualquer conteúdo secundário padrão do cabeçalho. Se a visualização de navegação tiver um plano de fundo, ele permanecerá no lugar, coberto pelo cabeçalho secundário. Quando o app remove o controle personalizado, qualquer cabeçalho secundário padrão pode aparecer no lugar dele.
A posição do cabeçalho secundário personalizado alinha a borda superior com a borda inferior do cabeçalho principal. Essa posição só é compatível com o portrait mode. No landscape mode, o cabeçalho secundário não está disponível e o layout não muda.
Início da parte de baixo
Para usar essa posição de controle personalizado, transmita a posição CustomControlPosition.BOTTOM_START_BELOW para setCustomControl.
Essa posição de controle personalizado fica no canto inferior esquerdo do mapa. Nos modos portrait mode e landscape mode, ela fica acima do cartão HEC e/ou do rodapé personalizado (ou na parte de baixo do mapa se nenhum deles estiver presente), e os elementos do SDK de navegação, incluindo o botão de recentralização e o logotipo do Google, são movidos para cima para considerar a altura da visualização de controle personalizado. Esse controle é posicionado dentro dos limites visíveis do mapa. Portanto, qualquer padding adicionado às bordas inferior ou inicial do mapa também vai mudar a posição desse controle.
Fim da parte de baixo
Para usar essa posição de controle personalizado, transmita a posição CustomControlPosition.BOTTOM_END_BELOW para setCustomControl.
Essa posição de controle personalizado fica no canto inferior direito do mapa. No portrait mode, ela fica acima do cartão HEC e/ou do rodapé personalizado (ou na parte de baixo do mapa se nenhum deles estiver presente), mas no landscape mode, ela é alinhada à parte de baixo do mapa. Todos os elementos do SDK de navegação visíveis na extremidade (lado direito no LTR) são movidos para cima para considerar a altura da visualização de controle personalizado. Esse controle é posicionado dentro dos limites visíveis do mapa. Portanto, qualquer padding adicionado às bordas inferior ou final do mapa também vai mudar a posição desse controle.
Rodapé
Para usar essa posição de controle personalizado, transmita a posição CustomControlPosition.FOOTER para setCustomControl.
Essa posição de controle personalizado foi projetada para uma visualização de rodapé personalizado. Se o cartão HEC do SDK de navegação estiver visível, esse controle ficará acima dele. Caso contrário, o controle será alinhado à parte de baixo do mapa. Ao contrário dos controles personalizados BOTTOM_START_BELOW e BOTTOM_END_BELOW, esse controle é posicionado fora dos limites visíveis do mapa, o que significa que qualquer padding adicionado ao mapa não vai mudar a posição desse controle.
No portrait mode, o rodapé personalizado tem largura total. Os controles personalizados nas posições CustomControlPosition.BOTTOM_START_BELOW e CustomControlPosition.BOTTOM_END_BELOW, bem como os elementos da interface do SDK de navegação, como o botão de recentralização e o logotipo do Google, são posicionados acima do rodapé de controle personalizado. A posição padrão do chevron considera a altura do rodapé personalizado.
No landscape mode, o rodapé personalizado tem metade da largura e é alinhado ao lado inicial (lado esquerdo no LTR), assim como o cartão HEC do SDK de navegação. Os controles personalizados na posição CustomControlPosition.BOTTOM_START_BELOW e os elementos da interface do SDK de navegação, como o botão de recentralização e o logotipo do Google, são posicionados acima do rodapé de controle personalizado. Os controles personalizados na posição CustomControlPosition.BOTTOM_END_BELOW e todos os elementos da interface do SDK de navegação na extremidade (lado direito no LTR) permanecem alinhados à parte de baixo do mapa. A posição padrão do chevron não muda quando um rodapé personalizado está presente, porque o rodapé não se estende até a extremidade do mapa.
Os controles personalizados nas posições CustomControlPosition.BOTTOM_START_BELOW e CustomControlPosition.BOTTOM_END_BELOW, bem como os elementos da interface do SDK de navegação, como o botão de recentralização e o logotipo do Google, são posicionados acima do rodapé de controle personalizado.
Acessórios da interface do mapa
O SDK do Navigation para Android fornece acessórios de interface que aparecem durante a navegação, semelhantes aos encontrados no app Google Maps para Android. É possível ajustar a visibilidade ou a aparência visual desses controles conforme descrito nesta seção. As mudanças feitas aqui são refletidas durante a próxima sessão de navegação.
Consulte a página Políticas para conferir as diretrizes sobre modificações aceitáveis na interface de navegação.
Ver o código
Destaque e entradas de destino
Quando um destino é criado com um
placeID, o prédio de destino
é destacado e um ícone de entrada é mostrado, sempre que
possível. Essas dicas visuais ajudam os usuários a distinguir e navegar até o destino.
Para criar um destino com um placeID, use o
Waypoint.Builder.setPlaceIdString()
método.

Modificar o cabeçalho de navegação

Use
SupportNavigationFragment.setStylingOptions()
ou
NavigationView.setStylingOptions()
para mudar o tema do cabeçalho de navegação e o indicador da próxima curva que
aparece abaixo do cabeçalho quando disponível.
É possível definir os seguintes atributos:
| Tipo de atributo | Atributos |
|---|---|
| Cor do plano de fundo |
|
| Elementos de texto para instruções |
|
| Elementos de texto para próximas etapas |
|
| Ícones de manobra |
|
| Indicação de faixa |
|
O exemplo a seguir mostra como definir opções de estilo:
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));
Desativar a camada de trânsito
Use
GoogleMap.setTrafficEnabled()
para ativar ou desativar a camada de trânsito no mapa. Essa configuração afeta as indicações de densidade de trânsito mostradas no mapa como um todo. No entanto, ela não afeta as indicações de trânsito na rota traçada pelo 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));
Ativar semáforos e placas de pare

É possível ativar a exibição de semáforos e placas de pare no mapa durante a navegação ativa, o que fornece mais contexto para rotas e manobras de viagem.
Por padrão, os semáforos e as placas de pare estão desativados no SDK do Navigation. Para ativar esse recurso, chame
DisplayOptions
para cada recurso de forma independente.
O exemplo a seguir mostra como ocultar semáforos e placas de pare:
DisplayOptions displayOptions =
new DisplayOptions().showTrafficLights(true).showStopSigns(true);
Adicionar marcadores personalizados
O SDK do Navigation para Android agora usa as APIs Google Maps para marcadores. Acesse a documentação da API Maps para mais informações.
Texto flutuante
É possível adicionar texto flutuante em qualquer lugar do app, desde que ele não cubra a atribuição do Google. O SDK do Navigation não oferece suporte à ancoragem do texto a uma latitude/longitude no mapa ou a um rótulo. Acesse Balões de informação para mais informações.
Mostrar o limite de velocidade
É possível mostrar ou ocultar o ícone de limite de velocidade de forma programática. Use
NavigationView.setSpeedLimitIconEnabled()
ou
SupportNavigationFragment.setSpeedLimitIconEnabled()
para mostrar ou ocultar o ícone de limite de velocidade. Quando ativado, o ícone de limite de velocidade aparece em um canto inferior durante a orientação. O ícone mostra o limite de velocidade da via em que o veículo está viajando. O ícone só aparece em locais onde dados confiáveis de limite de velocidade estão disponíveis.
// Display the Speed Limit icon
mNavFragment.setSpeedLimitIconEnabled(true);
O ícone de limite de velocidade fica temporariamente oculto quando o botão de recentralização é mostrado.
Definir modo noturno
É possível controlar o comportamento do modo noturno de forma programática. Use
NavigationView.setForceNightMode()
ou
SupportNavigationFragment.setForceNightMode()
para ativar ou desativar o modo noturno ou permitir que o SDK do Navigation para Android
o controle.
AUTOpermite que o SDK do Navigation determine o modo apropriado de acordo com a localização do dispositivo e a hora local.FORCE_NIGHTforça o modo noturno.FORCE_DAYforça o modo diurno.
O exemplo a seguir mostra como forçar a ativação do modo noturno em um fragmento de navegação:
// Force night mode on.
mNavFragment.setForceNightMode(FORCE_NIGHT);
Mostrar lista de rotas
Primeiro, crie a visualização e adicione-a à sua hierarquia.
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));
}
Encaminhe os eventos de ciclo de vida para DirectionsListView, assim como eles estão com NavigationView. Exemplo:
protected void onResume() {
super.onResume();
directionsListView.onResume();
}
Ocultar rotas alternativas
Quando a interface do usuário fica sobrecarregada com muitas informações, é possível reduzir a confusão mostrando menos rotas alternativas do que o padrão (duas) ou não mostrando nenhuma rota alternativa. É possível configurar essa opção antes de buscar as rotas chamando o método RoutingOptions.alternateRoutesStrategy() com um dos seguintes valores de enumeração:
| Valor de enumeração | Descrição |
|---|---|
| AlternateRoutesStrategy.SHOW_ALL | Padrão. Mostra até duas rotas alternativas. |
| AlternateRoutesStrategy.SHOW_ONE | Mostra uma rota alternativa (se disponível). |
| AlternateRoutesStrategy.SHOW_NONE | Oculta rotas alternativas. |
O exemplo de código a seguir demonstra como ocultar rotas alternativas.
RoutingOptions routingOptions = new RoutingOptions();
routingOptions.alternateRoutesStrategy(AlternateRoutesStrategy.SHOW_NONE);
navigator.setDestinations(destinations, routingOptions, displayOptions);
Barra de progresso da viagem

A barra de progresso da viagem é uma barra vertical que aparece no lado inicial/principal do mapa quando a navegação começa. Quando ativada, ela mostra uma visão geral de toda a viagem, além do destino e da posição atual do usuário.
A barra de progresso da viagem oferece aos usuários a capacidade de antecipar rapidamente problemas futuros, como trânsito, sem precisar aumentar o zoom. Em seguida, eles podem traçar novo trajeto para a viagem, se necessário. Se o usuário mudar a rota da viagem, a barra de progresso será redefinida como se uma nova viagem tivesse começado a partir desse ponto.
A barra de progresso da viagem mostra os seguintes indicadores de status:
Rota decorrida : a parte decorrida da viagem.
Posição atual: a localização atual do usuário na viagem.
Status do trânsito: o status do trânsito futuro.
Destino final : o destino final da viagem.
Ative a barra de progresso da viagem chamando o setTripProgressBarEnabled() método
no
NavigationView
ou
SupportNavigationFragment.
Exemplo:
// Enable the trip progress bar.
mNavFragment.setTripProgressBarEnabled(true);
Posicionamento da barra de progresso da viagem
- O lado esquerdo da barra é alinhado aproximadamente com a esquerda do velocímetro, o logotipo do Google e o botão de recentralização (quando visível). A largura é de 12 dp.
- A barra de progresso da viagem mantém uma altura estática. Para se adaptar às limitações de espaço vertical em dispositivos menores, a visibilidade e a altura da barra de progresso da viagem são adaptadas com base nos pontos de interrupção especificados na altura da tela. Esses pontos de interrupção são independentes da orientação do dispositivo e do espaço que o mapa ocupa na tela:
- Se a barra de progresso da viagem se sobrepuser ao card de curva ou a outros elementos da interface de navegação, ela vai aparecer abaixo desses outros elementos.
| Altura da tela | Visibilidade da barra de progresso da viagem | Altura da barra de progresso da viagem | Posição do eixo y da barra de progresso da viagem |
|---|---|---|---|
| Pequena: 0 dp a 551 dp | Não visível | N/A | N/A |
| Média: 552 dp a 739 dp | Visível | 130 dp | Acima dos controles do lado inicial (velocímetro / logotipo do Google / botão de recentralização) |
| Grande: 740 dp e acima | Visível | 290 dp | Acima dos controles do lado inicial (velocímetro / logotipo do Google / botão de recentralização) |
Bússola
O SDK do Navigation fornece uma imagem de bússola que aparece no canto superior direito do mapa em determinadas circunstâncias e somente quando ativada. Quando o usuário clica na bússola, a câmera volta para uma posição com direção zero (orientação padrão), e a bússola desaparece pouco tempo depois.
Se a navegação estiver ativada e o modo de câmera estiver definido como "seguindo", a bússola permanecerá visível e tocar na bússola alternará entre as perspectivas de câmera inclinada e de visão geral.
Para evitar distrações do motorista, a bússola permanece na mesma posição se o cabeçalho (no modo retrato) se expandir e entrar em conflito com a posição padrão da bússola. Se você adicionar um controle personalizado de cabeçalho secundário ou uma visualização de acessório de cabeçalho, a bússola será ocultada para evitar conflitos de interface.
A bússola oferece suporte aos modos diurno e noturno, bem como ao modo escuro.
A bússola é ativada por padrão. É possível definir se a bússola está ativada
usando o
compassEnabled
método na classe GoogleMapOptions.
Desativar construções em 3D
Para dispositivos com restrições de desempenho, é possível desativar a exibição de construções em 3D
chamando
GoogleMap.setBuildingsEnabled(false).
API Prompt Visibility (experimental)
A API Prompt Visibility permite evitar conflitos entre elementos da interface gerados pelo SDK do Navigation e seus próprios elementos personalizados da interface, adicionando um listener para receber um callback antes que um elemento da interface do SDK do Navigation esteja prestes a aparecer e assim que o elemento for removido. Para mais informações, incluindo exemplos de código, consulte a seção Prompt Visibility API da página Configurar interrupções em tempo real.