Modificar a IU de navegação

Com o SDK de navegação para Android, você pode modificar a experiência do usuário com seu mapa, determinando quais controles de interface e elementos integrados aparecem no mapa. Também é possível ajustar a aparência da interface de navegação. Consulte a página de políticas para ver as diretrizes sobre modificações aceitáveis na interface de navegação.

Neste documento, descrevemos como modificar a interface do usuário do mapa de duas maneiras:

Controles de interface do mapa

Para colocar elementos de interface personalizados na visualização de navegação, use os controles de interface do mapa para o posicionamento adequado. Quando o layout integrado muda, o SDK do Navigation para Android reposiciona automaticamente os controles personalizados. É possível definir uma visualização de controle personalizada por vez para cada posição. Se o design exigir vários elementos da interface, coloque-os em um ViewGroup e transmita-os para o método setCustomControl.

O método setCustomControl fornece posições conforme definido no tipo enumerado CustomControlPosition:

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

Adicionar um controle personalizado

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

    O exemplo a seguir 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 escolhida para o controle personalizado.

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 personalizadas

Cabeçalho secundário

Posição de 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 oferecem 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 na orientação de faixa. O app pode usar essa posição de cabeçalho secundário do layout para conteúdo personalizado. Quando você usa esse recurso, seu controle abrange qualquer conteúdo de cabeçalho secundário padrão. Se a visualização de navegação tiver um plano de fundo, ele vai 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ó é aceita em portrait mode. No landscape mode, o cabeçalho secundário não está disponível, e o layout não muda.

Início inferior

Posição de controle personalizado de início inferior para orientação retrato.
Posição do controle personalizado no início da parte de baixo para orientação retrato
Posição de controle personalizado de início inferior para orientação paisagem.
Posição do controle personalizado no 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 inicial do mapa. Em ambos os casos, portrait mode e landscape mode, ele fica acima do cartão de 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 centralização e o logotipo do Google, se movem para cima para acomodar a altura da visualização de controle personalizada. Esse controle fica 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 dele.

Parte de baixo

Posição de controle personalizada na parte de baixo para orientação retrato.
Posição do controle personalizado na parte de baixo para orientação retrato
Posição de controle personalizada na parte de baixo para orientação paisagem.
Posição do controle personalizado na parte de baixo para a 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 do mapa. No portrait mode, ele 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 ele fica alinhado com a parte de baixo do mapa. Todos os elementos do SDK de navegação visíveis na lateral final (lado direito em LTR) se movem para cima para acomodar a altura da visualização de controle personalizada. Esse controle fica 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 do controle personalizado do rodapé para orientação retrato
Posição do controle personalizado do rodapé para orientação paisagem.
Posição do 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é personalizada. Se o cartão HEC do SDK de navegação estiver visível, esse controle vai ficar acima dele. Caso contrário, o controle será alinhado com a parte de baixo do mapa. Ao contrário dos controles personalizados BOTTOM_START_BELOW e BOTTOM_END_BELOW, esse controle fica fora dos limites visíveis do mapa. Isso significa que qualquer padding adicionado ao mapa não muda a posição dele.

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, ficam acima do rodapé do controle personalizado. A posição padrão da divisa considera a altura personalizada do rodapé.

Em landscape mode, o rodapé personalizado tem metade da largura e está alinhado ao lado inicial (lado esquerdo em 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, ficam acima do rodapé do controle personalizado. Os controles personalizados na posição CustomControlPosition.BOTTOM_END_BELOW e todos os elementos da interface do SDK de navegação no lado final (lado direito em LTR) permanecem alinhados com a parte de baixo do mapa. A posição padrão da divisa não muda quando há um rodapé personalizado, já que ele não se estende até o lado final 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, ficam acima do rodapé do controle personalizado.

Acessórios da interface do mapa

O SDK do Navigation para Android oferece 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 serão aplicadas na próxima sessão de navegação.

Consulte a página de políticas para ver as diretrizes sobre modificações aceitáveis na interface de navegação.

Ver o código

Destaque de destino e entradas

Quando um destino é criado com um placeID, o edifício 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 método Waypoint.Builder.setPlaceIdString().

Modificar o cabeçalho de navegação

Use NavigationFragment.setStylingOptions() ou NavigationView.setStylingOptions() para mudar o tema do cabeçalho de navegação e o indicador de 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 as próximas etapas
  • Fonte
  • Cor do texto do valor de distância
  • Tamanho do texto do valor de 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 pequena
Indicação de faixa
  • Cor da faixa ou das faixas recomendadas

O exemplo a seguir mostra como definir as opções de estilo:

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

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, isso não afeta as indicações de trânsito no trajeto traçado 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));

Semáforos e placas de pare

Ícones de semáforo e placa de pare ao longo de um trajeto de navegação.

Durante a navegação ativa, o mapa mostra semáforos e placas de "Pare" para dar aos usuários mais contexto sobre o trajeto e as próximas manobras. A partir da versão 8.0.0, não é possível desativar esse recurso.

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

Você pode adicionar texto flutuante em qualquer lugar do app, desde que ele não cubra a atribuição do Google. O SDK de navegação não permite fixar o texto em uma latitude/longitude no mapa ou em um marcador. Acesse Janelas de informações para saber mais.

Mostrar o limite de velocidade

É possível mostrar ou ocultar o ícone de limite de velocidade de forma programática. Use NavigationView.setSpeedLimitIconEnabled() ou NavigationFragment.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 navegação. O ícone mostra o limite de velocidade da via em que o veículo está. O ícone só aparece em locais com dados confiáveis sobre o limite de velocidade.

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

O ícone de limite de velocidade fica temporariamente oculto quando o botão de centralização é mostrado.

Definir o modo noturno

É possível controlar o comportamento do modo noturno de forma programática. Use NavigationView.setForceNightMode() ou NavigationFragment.setForceNightMode() para ativar ou desativar o modo noturno ou deixe que o SDK de navegação para Android o controle.

  • AUTO: permite que o SDK de navegação determine o modo apropriado de acordo com o local do dispositivo e o horário 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 o DirectionsListView, assim como são encaminhados para o NavigationView. Exemplo:

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

Ocultar rotas alternativas

Quando a interface do usuário fica sobrecarregada com muitas informações, você pode 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 os trajetos 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 houver).
AlternateRoutesStrategy.SHOW_NONE Oculta rotas alternativas.

O exemplo de código a seguir demonstra como ocultar totalmente as 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 ativado, ele mostra uma visão geral de uma viagem inteira, além do destino e da posição atual do usuário.

Isso permite que os usuários antecipem problemas futuros, como trânsito, sem precisar aumentar o zoom. Em seguida, eles podem traçar um novo trajeto, se necessário. Se o usuário mudar o trajeto 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:

  • Route elapsed: a parte do trajeto que já foi percorrida.

  • Posição atual: a localização atual do usuário na viagem.

  • Status do trânsito: o status do trânsito à frente.

  • Destino final: o destino final da viagem.

Ative a barra de progresso da viagem chamando o método setTripProgressBarEnabled() em NavigationView ou NavigationFragment. Exemplo:

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

Posicionamento da barra de progresso da viagem

  • O lado esquerdo da barra fica mais ou menos alinhado com o lado esquerdo do velocímetro, o logotipo do Google e o botão "Recentralizar" (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 se adaptam com base em 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 realmente 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
    Pequeno: 0 dp - 551 dp Não visível N/A N/A
    Médio: 552 dp - 739 dp Visível 130 dp Acima dos controles do lado inicial (velocímetro / logotipo do Google / botão "Recentralizar")
    Grande: 740 dp ou mais Visível 290 dp Acima dos controles do lado inicial (velocímetro / logotipo do Google / botão "Recentralizar")
  • Se a barra de progresso da viagem se sobrepuser ao card de conversão ou a outros elementos da interface de navegação, ela vai aparecer abaixo deles.

Bússola

O SDK de navegação fornece uma imagem de bússola que aparece no canto superior direito do mapa em circunstâncias específicas 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 vai permanecer visível, e tocar nela vai alternar entre as perspectivas de câmera inclinada e de visão geral.

Para evitar a distração 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 é compatível com os modos diurno, noturno e escuro.

A bússola é ativada por padrão. É possível definir se a bússola está ativada usando o método compassEnabled na classe GoogleMapOptions.

Desativar construções em 3D

Para dispositivos com desempenho limitado, é 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 de navegação e seus próprios elementos personalizados. Para isso, adicione um listener para receber um callback antes que um elemento da interface do SDK de navegação apareça e assim que o elemento for removido. Para mais informações, incluindo exemplos de código, consulte a seção API Prompt Visibility da página Configurar interrupções em tempo real.