Você deve usar a CameraUpdate
classe para realizar (provavelmente) todos os movimentos programáticos do mapa.
Para fazer isso, primeiro calcule os limites de todos os marcadores da seguinte maneira:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Em seguida, obtenha um objeto de descrição de movimento usando a fábrica CameraUpdateFactory
:
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Por fim, mova o mapa:
googleMap.moveCamera(cu);
Ou se você quiser uma animação:
googleMap.animateCamera(cu);
Isso é tudo :)
Esclarecimento 1
Quase todos os métodos de movimento exigem que o Map
objeto tenha passado no processo de layout. Você pode esperar que isso aconteça usando a addOnGlobalLayoutListener
construção. Detalhes podem ser encontrados nos comentários a esta resposta e nas respostas restantes. Você também pode encontrar um código completo para definir a extensão do mapa usando addOnGlobalLayoutListener
aqui .
Esclarecimento 2
Um comentário observa que o uso desse método para apenas um marcador resulta no zoom do mapa definido para um nível de zoom "bizarro" (que eu acredito ser o nível máximo de zoom disponível para um determinado local). Eu acho que isso é esperado porque:
- A
LatLngBounds bounds
instância terá northeast
propriedade igual a southwest
, significando que a parte da área da terra coberta por isso bounds
é exatamente zero. (Isso é lógico, pois um único marcador não tem área.)
- Ao passar
bounds
para CameraUpdateFactory.newLatLngBounds
você, solicite essencialmente um cálculo desse nível de zoom que bounds
(com área zero) cubra toda a visualização do mapa.
- Você pode realmente executar esse cálculo em um pedaço de papel. O nível de zoom teórico que é a resposta é + ∞ (infinito positivo). Na prática, o
Map
objeto não suporta esse valor, portanto ele é fixado em um nível máximo mais razoável permitido para um determinado local.
Outra maneira de colocá-lo: como o Map
objeto pode saber qual nível de zoom deve escolher para um único local ? Talvez o valor ideal deva ser 20 (se representar um endereço específico). Ou talvez 11 (se representa uma cidade). Ou talvez 6 (se representa um país). A API não é tão inteligente e a decisão é sua.
Portanto, você deve simplesmente verificar se markers
possui apenas um local e, se houver, usar um dos seguintes:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- vá para a posição do marcador, deixe o nível de zoom atual intacto.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- vá para a posição do marcador, defina o nível de zoom para o valor escolhido arbitrariamente 12.