Debería usar la CameraUpdate
clase para hacer (probablemente) todos los movimientos programáticos del mapa.
Para hacer esto, primero calcule los límites de todos los marcadores así:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Luego obtenga un objeto de descripción de movimiento utilizando la fábrica CameraUpdateFactory
:
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Finalmente mueve el mapa:
googleMap.moveCamera(cu);
O si quieres una animación:
googleMap.animateCamera(cu);
Eso es todo :)
Aclaracion 1
Casi todos los métodos de movimiento requieren que el Map
objeto haya pasado el proceso de diseño. Puedes esperar a que esto suceda usando la addOnGlobalLayoutListener
construcción. Se pueden encontrar detalles en los comentarios a esta respuesta y en las respuestas restantes. También puede encontrar un código completo para configurar la extensión del mapa addOnGlobalLayoutListener
aquí .
Aclaracion 2
Un comentario señala que el uso de este método solo para un marcador da como resultado un zoom de mapa establecido en un nivel de zoom "extraño" (que creo que es el nivel de zoom máximo disponible para una ubicación determinada). Creo que esto se espera porque:
- La
LatLngBounds bounds
instancia tendrá una northeast
propiedad igual a southwest
, lo que significa que la porción del área de la tierra cubierta por esto bounds
es exactamente cero. (Esto es lógico ya que un solo marcador no tiene área).
- Al hacer pasar
bounds
a CameraUpdateFactory.newLatLngBounds
usted solicita esencialmente un cálculo de tal nivel que un zoom bounds
(que tiene un área de cero) cubrirá toda la vista del mapa.
- Realmente puede realizar este cálculo en una hoja de papel. El nivel de zoom teórico que es la respuesta es + ∞ (infinito positivo). En la práctica, el
Map
objeto no admite este valor, por lo que está sujeto a un nivel máximo más razonable permitido para una ubicación determinada.
Otra forma de decirlo: ¿cómo puede Map
saber el objeto qué nivel de zoom debería elegir para una sola ubicación ? Quizás el valor óptimo debería ser 20 (si representa una dirección específica). O tal vez 11 (si representa una ciudad). O tal vez 6 (si representa un país). API no es tan inteligente y la decisión depende de usted.
Por lo tanto, simplemente debe verificar si markers
solo tiene una ubicación y, de ser así, usar uno de:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- ir a la posición del marcador, dejar intacto el nivel de zoom actual.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- ir a la posición del marcador, establecer el nivel de zoom al valor 12 elegido arbitrariamente.