Configuración del nivel de zoom máximo en google maps android api v2

Actualmente estoy trabajando en el desarrollo de aplicaciones utilizando Google Maps android API v2. Mi código es el siguiente. Supongamos que el mapa tiene varios marcadores y un acercamiento para mostrar todos los marcadores en la pantalla.

LatLngBuilder.Builder builder = LatLngBounds.builder(); for(Marker m : markers){ builder.include(m.getPosition()); } LatLngBounds bounds = builder.build(); map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10); 

Este código está funcionando bien, pero quiero dejar de animar cuando el nivel de zoom alcanzado a 17.0f; Parece mapa API no tiene tal método para controlar el nivel de zoom. ¿Alguien sabe alguna idea para resolver este problema?

No he encontrado ninguna solución directa en la API de Google Maps. Una solución potencial a este problema consiste en escuchar contra el evento OnCameraChange : Siempre que se desencadene este evento y el nivel de zoom esté por encima del nivel de zoom máximo, es posible llamar a animateCamera () . El código resultante sería el siguiente:

 @Override public void onCameraChange(CameraPosition position) { float maxZoom = 17.0f; if (position.zoom > maxZoom) map_.animateCamera(CameraUpdateFactory.zoomTo(maxZoom)); } 

Una actualización reciente de la API de Google Maps presenta las funciones que necesita:

 GoogleMap.setMaxZoomPreference() GoogleMap.setMinZoomPreference() 

Todavía no impide que la animación de jugar, sin embargo.

Aquí está el código Java correspondiente para la solución de Arvis que funcionó bien para mí:

 private LatLngBounds adjustBoundsForMaxZoomLevel(LatLngBounds bounds) { LatLng sw = bounds.southwest; LatLng ne = bounds.northeast; double deltaLat = Math.abs(sw.latitude - ne.latitude); double deltaLon = Math.abs(sw.longitude - ne.longitude); final double zoomN = 0.005; // minimum zoom coefficient if (deltaLat < zoomN) { sw = new LatLng(sw.latitude - (zoomN - deltaLat / 2), sw.longitude); ne = new LatLng(ne.latitude + (zoomN - deltaLat / 2), ne.longitude); bounds = new LatLngBounds(sw, ne); } else if (deltaLon < zoomN) { sw = new LatLng(sw.latitude, sw.longitude - (zoomN - deltaLon / 2)); ne = new LatLng(ne.latitude, ne.longitude + (zoomN - deltaLon / 2)); bounds = new LatLngBounds(sw, ne); } return bounds; } 

Desde el documento de Android: https://developers.google.com/maps/documentation/android-api/views

You may find it useful to set a prefered minimum and/or maximum zoom level. For example, this is useful to control the user's experience if your app shows a defined area around a point of interest, or if you're using a custom tile overlay with a limited set of zoom levels.

  private GoogleMap mMap; // Set a preference for minimum and maximum zoom. mMap.setMinZoomPreference(6.0f); mMap.setMaxZoomPreference(14.0f); 

Igual que la solución de Arvis, pero usando la Location [ distanceBetween() ] ( http://developer.android.com/reference/android/location/Location.html#distanceBetween(double , double, double, double, float [])) Método para calcular la distancia entre puntos:

 @Override public void zoomToMarkers(Set<Marker> markers) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (Marker marker : markers) { builder.include(marker.getPosition()); } LatLngBounds bounds = builder.build(); // Calculate distance between northeast and southwest float[] results = new float[1]; android.location.Location.distanceBetween(bounds.northeast.latitude, bounds.northeast.longitude, bounds.southwest.latitude, bounds.southwest.longitude, results); CameraUpdate cu = null; if (results[0] < 1000) { // distance is less than 1 km -> set to zoom level 15 cu = CameraUpdateFactory.newLatLngZoom(bounds.getCenter(), 15); } else { int padding = 50; // offset from edges of the map in pixels cu = CameraUpdateFactory.newLatLngBounds(bounds, padding); } if (cu != null) { mMap.moveCamera(cu); } } 

Antes de animar cámara puede comprobar si SW y NE puntos de los límites no están demasiado cerca y si es necesario ajustar los límites:

  ... LatLngBounds bounds = builder.Build(); var sw = bounds.Southwest; var ne = bounds.Northeast; var deltaLat = Math.Abs(sw.Latitude - ne.Latitude); var deltaLon = Math.Abs(sw.Longitude - ne.Longitude); const double zoomN = 0.005; // set whatever zoom coefficient you need!!! if (deltaLat < zoomN) { sw.Latitude = sw.Latitude - (zoomN - deltaLat / 2); ne.Latitude = ne.Latitude + (zoomN - deltaLat / 2); bounds = new LatLngBounds(sw, ne); } else if (deltaLon < zoomN) { sw.Longitude = sw.Longitude - (zoomN - deltaLon / 2); ne.Longitude = ne.Longitude + (zoomN - deltaLon / 2); bounds = new LatLngBounds(sw, ne); } map.animateCamera(CameraUpdateFactory.NewLatLngBounds(bounds, 10); 

PD. Mi ejemplo está en c # para Xamarin, pero se puede ajustar fácilmente para java

Esto es de la referencia de la API para la include(position) que está utilizando:

"Incluye este punto para la construcción de los límites.Los límites se extenderá de una manera mínima para incluir este punto.Más precisamente, se considerará la extensión de los límites tanto en el este y direcciones hacia el oeste (uno de los cuales puede envolverse en todo el mundo) Y elegir el más pequeño de los dos.En el caso de que ambas direcciones resultan en un LatLngBounds del mismo tamaño, esto lo extenderá en la dirección hacia el este.

El mapa se alejará hasta que pueda mostrar todos los marcadores que está agregando en su bucle for.

Si sólo desea ampliar el zoom a 17 y seguir mostrando marcadores, anime primero el nivel de zoom 17, luego obtenga los límites para él y, a continuación, agregue los marcadores.

 @Override public void onCameraChange(CameraPosition camPos) { if (camPos.zoom < 17 && mCurrentLoc != null) { // set zoom 17 and disable zoom gestures so map can't be zoomed out // all the way mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(position,17)); mMap.getUiSettings().setZoomGesturesEnabled(false); } if (camPos.zoom >= 17) { mMap.getUiSettings().setZoomGesturesEnabled(true); } LatLngBounds visibleBounds = mMap.getProjection().getVisibleRegion().latLngBounds; //add the markers 

@ Kasimir enfoque establece un número mínimo de grados en la latitud o longitud, y se sentía un poco difícil de leer. Así que lo ajusté a sólo establecer un mínimo en la latitud, que me sentí como era un poco más legible:

 private LatLngBounds adjustBoundsForMinimumLatitudeDegrees(LatLngBounds bounds, double minLatitudeDegrees) { LatLng sw = bounds.southwest; LatLng ne = bounds.northeast; double visibleLatitudeDegrees = Math.abs(sw.latitude - ne.latitude); if (visibleLatitudeDegrees < minLatitudeDegrees) { LatLng center = bounds.getCenter(); sw = new LatLng(center.latitude - (minLatitudeDegrees / 2), sw.longitude); ne = new LatLng(center.latitude + (minLatitudeDegrees / 2), ne.longitude); bounds = new LatLngBounds(sw, ne); } return bounds; } 

Im no seguro si esto trabajará pero puede usted intentar esto

 map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); 

Espero eso ayude

Lo que acabé haciendo es crear mis propios botones y desactivar los predeterminados por lo que tendría control total.

Algo así en el diseño para colocar los botones:

 <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="bottom" android:layout_alignParentRight="true" android:layout_alignParentBottom="true"> <Button android:id="@+id/bzoomin" android:layout_width="55dp" android:layout_height="55dp" android:gravity="center" android:textSize="28sp" android:text="+" /> <Button android:id="@+id/bzoomout" android:layout_width="55dp" android:layout_height="55dp" android:gravity="center" android:textSize="23sp" android:text="—" /> </LinearLayout> 

A continuación, en el código para desactivar los botones predeterminados y configurar nuestros nuevos:

 map.getUiSettings().setZoomControlsEnabled(false); // setup zoom control buttons Button zoomout = (Button) findViewById(R.id.bzoomout); zoomout.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { if(map.getCameraPosition().zoom >= 8.0f){ // Zoom like normal map.animateCamera(CameraUpdateFactory.zoomOut()); }else{ // Do whatever you want if user went too far Messages.toast_short(MapsActivity.this, "Maximum zoom out level reached"); } } }); Button zoomin = (Button) findViewById(R.id.bzoomin); zoomin.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (map.getCameraPosition().zoom <= 14.0f) { // Zoom like normal map.animateCamera(CameraUpdateFactory.zoomIn()); } else { // Do whatever you want if user went too far Messages.toast_short(MapsActivity.this, "Maximum zoom in level reached"); } } }); 

Con com.google.android.gms:play-services-maps:9.4.0 puedes establecer fácilmente el zoom mínimo / máximo. Con GoogleMap.setMinZoomPreference() y GoogleMap.setMaxZoomPreference() puede establecer un nivel de zoom mínimo y / o máximo preferido. Más ver aquí .

No podemos restringir la función de mapa zoomin directamente, pero podemos intentar obtener la misma función como ésta.

Add map.setOnCameraChangeListener

 final float maxZoom = 10.0f; @Override public void onCameraChange(CameraPosition position) { if (position.zoom > maxZoom) map.animateCamera(CameraUpdateFactory.zoomTo(maxZoom)); } 

En el nuevo Google Maps 9.8

com.google.android.gms:play-services-maps:9.8.0

Así es como lo hice y trabajé

  googleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() { @Override public void onCameraMove() { Log.d(App.TAG, "onCameraMove"); CameraPosition position = googleMap.getCameraPosition(); float maxZoom = 9.0f; if (position.zoom > maxZoom) { googleMap.setMinZoomPreference(maxZoom); } Log.d(App.TAG, "position.zoom = " + position.zoom); } }); 

Puede obtener el nivel máximo de zoom llamándolo getMaxZoomLevel() y luego establecer ese valor:

 mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(fromPosition, getMaxZoomLevel())); 

El mapa tiene una propiedad llamada maxZoom. Simplemente establezca esto con su valor cuando cree su mapa

  • Pinch Zoom ListView Android
  • Los eventos de zoom que funcionan en un androide Mapview
  • Android GridView pinch zoom
  • Ampliar la animación
  • MapController, OSMdroid, zoomToSpan () congela la aplicación
  • Osmdroid y Pinch
  • Cómo establecer el nivel de zoom MapView en onCreate ()?
  • Cómo poblar webview en android con texto sin formato de base de datos y ser capaz de manejar caracteres de nueva línea
  • Aplicación existente explotando con Android 3.0 XOOM. ¿Fugas de ZoomButtonsController?
  • Cómo ajustar el tamaño de los iconos de marcadores según el nivel de zoom en Android
  • Cámara android cámara2 manejar zoom
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.