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
Adicionar um controle personalizado
- Crie uma visualização Android com o elemento de interface personalizado ou o ViewGroup.
- Infle o XML ou instancie a visualização personalizada para receber uma instância da visualização.
Use
NavigationView.setCustomControl
ouSupportNavigationFragment.setCustomControl
com a posição de controle personalizada escolhida no tipo enumeradoCustomControlPosition
(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
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
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
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.
Footer
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 atributo | Atributos |
---|---|
Cor do plano de fundo |
|
Elementos de texto para instruções |
|
Elementos de texto para as próximas etapas |
|
Ícones de manobra |
|
Indicação de faixa |
|
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ção | Descriçã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 é 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);