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.
addOnGlobalLayoutListener()
opost()
con un apropiadoRunnable
. Esta es exactamente la razón por la cual no se pueden obtener las coordenadas de la pantalla del marcadoronCreate
; consulte stackoverflow.com/q/14429877/1820695. Sin embargo, puede usar algunos métodos incluso antes de que se haya realizado el diseño, por ejemplo.CameraUpdateFactory.newLatLngBounds()
con 4 params .Google Map V2
La siguiente solución funciona para Android Marshmallow 6 (API 23, API 24, API 25, API 26, API 27, API 28). También funciona en Xamarin.
fuente
Entonces
por ejemplo, su mapa de Google está dentro de RelativeLayout:
fuente
No pude usar onGlobalLayoutlistener, así que aquí hay otra solución para evitar el
"Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions."
error:fuente
A partir de este código, estoy mostrando múltiples marcadores con un zoom particular en la pantalla del mapa.
// Variables declaradas
// Método para agregar múltiples puntos de marcador con icono dibujable
// Para agregar múltiples marcadores visibles en el mapa
fuente
Nota : Esta no es una solución a la pregunta original. Esta es una solución a uno de los subproblemas discutidos anteriormente .
Solución a @andr Clarification 2 -
Es realmente problemático cuando solo hay un marcador en los límites y debido a ello, el nivel de zoom se establece en un nivel muy alto ( nivel 21 ). Y Google no proporciona ninguna forma de establecer el nivel máximo de zoom en este punto. Esto también puede suceder cuando hay más de 1 marcador, pero todos están bastante cerca uno del otro. Entonces también ocurrirá el mismo problema.
Solución : suponga que desea que su mapa nunca supere los 16 niveles de zoom. Luego, después de hacer ...
Comprueba si tu nivel de zoom ha cruzado el nivel 16 (o lo que quieras):
Y si este nivel es mayor que 16, lo que será solo si hay menos marcadores o si todos los marcadores están muy cerca el uno del otro, simplemente aleje el mapa en esa posición en particular solo ajustando el nivel de zoom a 16.
De esta manera, nunca tendrá el problema del nivel de zoom "extraño" explicado muy bien por @andr también.
fuente
esto ayudaría ... de demos de google apis
para obtener información clara mira esta url. https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java
fuente
Tuve un problema similar, el uso del siguiente código resolvió el problema:
CameraUpdateFactory.newLatLngBounds(bounds, 200, 200, 5)
En general, las diferencias de ubicación en mi caso no son más que dos ciudades vecinas.zoom para adaptarse a todos los marcadores en el mapa google maps v2
fuente
Mostrar todos los marcadores con el mapa de Google
En estos métodos, almacene todos los marcadores y haga zoom automáticamente para mostrar todos los marcadores en el mapa de Google.
fuente
Use el método "getCenterCoordinate" para obtener la coordenada central y usar en CameraPosition.
fuente
Tengo otra forma de hacer que esta misma cosa funcione perfectamente. Por lo tanto, la idea detrás de mostrar todos los marcadores en la pantalla es que necesitamos un centro lat largo y un nivel de zoom. Aquí está la función que le dará ambos y necesitará todos los objetos Latlng del marcador como entrada.
Esta función devuelve un objeto Pair que puede usar como
puede, en lugar de usar relleno para mantener sus marcadores alejados de los límites de la pantalla, puede ajustar el zoom en -1.
fuente
http://i64.tinypic.com/2qjybh4.png
http://i63.tinypic.com/flzwus.png
http://i63.tinypic.com/112g5fm.png
fuente