Modificar a IU de navegação

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_BELOW
  • BOTTOM_END_BELOW
  • FOOTER
Posições de controle personalizadas para orientação retrato.
Posições de controle personalizado para orientação retrato
Posições de controle personalizadas para orientação paisagem.
Posições de controle personalizado para orientação paisagem

Adicionar um controle personalizado

  1. Crie uma visualização do Android com o elemento da interface personalizado ou ViewGroup.
  2. Infle o XML ou instancie a visualização personalizada para receber uma instância da visualização.
  3. Use NavigationView.setCustomControl ou SupportNavigationFragment.setCustomControl com a posição de controle personalizado escolhida na CustomControlPosition enum.

    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

Posição do controle personalizado do cabeçalho secundário para orientação retrato.
Posição de controle personalizado do cabeçalho secundário para orientação retrato

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

Posição do controle personalizado de início na parte de baixo para orientação retrato.
Posição de controle personalizado do início da parte de baixo para orientação retrato
Posição do controle personalizado de início na parte de baixo para orientação paisagem.
Posição de controle personalizado do início da parte de baixo para orientação paisagem

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

Posição do controle personalizado na extremidade inferior para orientação retrato.
Posição de controle personalizado do fim da parte de baixo para orientação retrato
Posição do controle personalizado na extremidade inferior para orientação paisagem.
Posição de controle personalizado do fim da parte de baixo para orientação paisagem

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.

Posição do controle personalizado do rodapé para orientação retrato.
Posição de controle personalizado do rodapé para orientação retrato
Posição do controle personalizado do rodapé para orientação paisagem.
Posição de controle personalizado do rodapé para orientação paisagem

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 atributoAtributos
Cor do plano de fundo
  • Modo diurno principal: a cor diurna do cabeçalho de navegação
  • Modo diurno secundário: a cor diurna do indicador da próxima curva
  • Modo noturno principal: a cor noturna do cabeçalho de navegação
  • Modo noturno secundário: a cor noturna do indicador da próxima curva
Elementos de texto para instruções
  • Cor do texto
  • Fonte
  • Tamanho do texto da primeira linha
  • Tamanho do texto da segunda linha
Elementos de texto para próximas etapas
  • Fonte
  • Cor do texto do valor da distância
  • Tamanho do texto do valor da distância
  • Cor do texto das unidades de distância
  • Tamanho do texto das unidades de distância
Ícones de manobra
  • Cor do ícone de manobra grande
  • Cor do ícone de manobra pequeno
Indicação de faixa
  • Cor da faixa ou faixas recomendadas

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.

  • AUTO permite que o SDK do Navigation determine o modo apropriado de acordo com a localização do dispositivo e a hora local.
  • FORCE_NIGHT força o modo noturno.
  • FORCE_DAY forç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çãoDescriçã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 foi adicionada à navegação.

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:
  • 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)
  • 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.

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.