Modificar a IU de navegação

Com o SDK do Navigation para Android, você pode modificar a experiência do usuário com seu mapa determinando quais elementos e controles integrados da interface aparecem no mapa. Também é possível ajustar a aparência visual da interface de navegação. Consulte a página de políticas para orientações 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:

Mapear controles da interface

Os controles da interface do mapa são a maneira recomendada de posicionar elementos personalizados na visualização de navegação para garantir o posicionamento correto. Quando o layout integrado é alterado, o SDK de navegação para Android reposiciona automaticamente seus controles personalizados. É possível definir uma visualização de controle personalizada por vez para cada posição. Se o design exigir vários elementos de interface, coloque-os em uma ViewGroup e transmita-a para o método setCustomControl.

O método setCustomControl fornece posições conforme definido no enumeração 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 Android com o elemento de interface personalizado ou o 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 personalizada escolhida no tipo enumerado CustomControlPosition (link em inglês).

    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 do 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 personalizadas

Cabeçalho secundário

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

Para usar essa posição de controle personalizada, 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 na orientação de faixa. Seu app pode usar essa posição de cabeçalho secundária do layout para conteúdo personalizado. Quando você usa esse recurso, seu controle cobre 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 personalizada alinha a borda de cima à borda de baixo do cabeçalho principal. Essa posição só é aceita em portrait mode. Em landscape mode, o cabeçalho secundário fica indisponível, e o layout não muda.

Começar de baixo

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

Para usar essa posição de controle personalizada, transmita a posição CustomControlPosition.BOTTOM_START_BELOW para setCustomControl.

Essa posição de controle personalizado fica no canto inferior esquerdo do mapa. Em portrait mode e landscape mode, ele fica acima do card de ETA e/ou do rodapé personalizado (ou na parte de baixo do mapa se nenhum deles estiver presente), e os elementos do Nav SDK, 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 personalizada. Esse controle é posicionado dentro dos limites visíveis do mapa. Portanto, qualquer preenchimento adicionado às bordas inferior ou inicial do mapa também muda a posição desse controle.

Parte de baixo

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

Para usar essa posição de controle personalizada, transmita a posição CustomControlPosition.BOTTOM_END_BELOW para setCustomControl.

Essa posição de controle personalizado fica no canto inferior do mapa. Em portrait mode, ela fica acima do card de HEC e/ou do rodapé personalizado (ou na parte de baixo do mapa se nenhum deles estiver presente), mas em landscape mode, ela fica alinhada com a parte de baixo do mapa. Todos os elementos do SDK de navegação que aparecem ao longo do lado final (lado direito em LTR) são movidos para cima para considerar a altura da visualização de controle personalizada. Esse controle é posicionado dentro dos limites visíveis do mapa. Portanto, qualquer preenchimento adicionado às bordas inferior ou final do mapa também muda 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 personalizada, transmita a posição CustomControlPosition.FOOTER para setCustomControl.

Essa posição de controle personalizada é projetada para uma visualização de rodapé personalizada. Se o card de HEC do SDK do Nav estiver visível, esse controle vai ficar acima dele. Caso contrário, o controle é alinhado com a parte inferior do mapa. Diferente 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 dele.

Em 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 IU do SDK de navegação, como o botão de restauração e o logotipo do Google, são posicionados acima do rodapé do controle personalizado. A posição padrão da seta leva em consideração 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 card de ETA do SDK do Nav. 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 restauração e o logotipo do Google, são posicionados 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 ao longo do lado final (lado direito em LTR) permanecem alinhados com a parte de baixo do mapa. A posição padrão do chevron não muda quando um rodapé personalizado está presente, porque ele não se estende até o final do mapa.

Os controles personalizados nas posições CustomControlPosition.BOTTOM_START_BELOW e CustomControlPosition.BOTTOM_END_BELOW, bem como os elementos da IU do SDK de navegação, como o botão de restauração e o logotipo do Google, são posicionados 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 aplicativo Google Maps para Android. É possível ajustar a visibilidade ou a aparência desses controles, conforme descrito nesta seção. As mudanças feitas aqui são refletidas na próxima sessão de navegação.

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

Ver o código

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 do dia do indicador da próxima jogada
  • 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 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 da manobra grande
  • Cor do ícone de manobra pequena
Indicação de faixa
  • Cor da faixa recomendada

O exemplo abaixo 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áfego no mapa. Ela afeta as indicações da densidade de tráfego 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));

Ativar semáforos e sinais de pare

É possível ativar semáforos e sinais de parada na interface do mapa. Com esse recurso, o usuário pode ativar a exibição de ícones de semáforos ou sinais de parada ao longo do percurso, fornecendo um contexto melhor para viagens mais eficientes e precisas.

Por padrão, semáforos e sinais de parada ficam desativados no SDK do Navigation. Para ativar esse recurso, chame DisplayOptions para cada recurso de forma independente.

DisplayOptions displayOptions =
  new DisplayOptions().showTrafficLights(true).showStopSigns(true);

Adicionar marcadores personalizados

O SDK do Navigation para Android agora usa as APIs do 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 em uma latitude/longitude no mapa ou em um rótulo. Acesse Janelas de informações para mais informações.

Mostrar o limite de velocidade

Você pode mostrar ou ocultar programaticamente o ícone de limite de velocidade. Use NavigationView.setSpeedLimitIconEnabled() ou SupportNavigationFragment.setSpeedLimitIconEnabled() para mostrar ou ocultar o ícone do limite de velocidade. Quando ativado, o ícone de limite de velocidade é mostrado em um canto de baixo durante a orientação. O ícone mostra o limite de velocidade da via em que o veículo está trafegando. O ícone só aparece em locais em que 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 "Recentralizar" é exibido.

Definir o modo noturno

É possível controlar o comportamento do modo noturno de maneira programática. Use NavigationView.setForceNightMode() ou SupportNavigationFragment.setForceNightMode() para ativar ou desativar o modo noturno ou deixe que o SDK do Navigation para Android controle.

  • AUTO Permite que o SDK de navegação determine o modo apropriado de acordo com a localização do dispositivo e o horário local.
  • FORCE_NIGHT ativa o Modo noturno.
  • FORCE_DAY ativa o modo dia.

O exemplo a seguir mostra como forçar o modo noturno a ser ativado em um fragmento de navegação:

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

Exibir 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 com NavigationView. Exemplo:

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

Como ocultar rotas alternativas

Quando a interface do usuário fica sobrecarregada com muitas informações, é possível reduzir a desordem 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 um trajeto alternativo (se houver).
AlternateRoutesStrategy.SHOW_NONE Oculta as rotas alternativas.

O exemplo de código abaixo 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 na borda direita final do mapa quando a navegação é iniciada. Quando ativada, ela mostra uma visão geral de uma viagem inteira, com o destino e a posição atual do usuário.

Isso permite que os usuários antecipem rapidamente qualquer problema futuro, como o tráfego, sem precisar dar zoom. Eles podem redirecionar a viagem, se necessário. Se o usuário redirecionar a viagem, a barra de progresso será redefinida como se uma nova viagem tivesse começado desse ponto.

A barra de progresso da viagem mostra os seguintes indicadores de status:

  • Tempo da rota: o tempo da viagem.

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

  • Status do trânsito: o status do trânsito que está por vir.

  • Destino final: o destino final da viagem.

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

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