En evento de zoom para google maps en android

Estamos construyendo una aplicación que está usando el google maps api para android.

Tengo mi MapController y MapView, y habilito los controles de zoom incorporados usando:

mapView.setBuiltInZoomControls(true); 

Ahora me gustaría obtener un evento cuando el usuario realice zoom en el mapa, ¿cómo puedo ir sobre eso? No puedo encontrar ningún evento de este tipo ni ningún evento general donde pueda detectar un cambio en el nivel de zoom.

Actualizar

MapView.getZoomControls () está obsoleto . Y la documentación sugiere usar mapView.setBuiltInZoomControls (bool) en su lugar. Esto está bien, pero simplemente no puedo averiguar cómo actuar en los eventos de los controles de zoom incorporados.

Con Google Maps Android API v2 puedes usar GoogleMap.OnCameraChangeListener de la siguiente manera:

 mMap.setOnCameraChangeListener(new OnCameraChangeListener() { private float currentZoom = -1; @Override public void onCameraChange(CameraPosition pos) { if (pos.zoom != currentZoom){ currentZoom = pos.zoom; // do you action here } } }); 

Puede implementar su propia "encuesta" básica del valor de zoom para detectar cuándo se ha cambiado el zoom con el controlador androide.

Uso del siguiente código para su evento ejecutable . Aquí es donde su procesamiento debe hacerse.

 private Handler handler = new Handler(); public static final int zoomCheckingDelay = 500; // in ms private Runnable zoomChecker = new Runnable() { public void run() { checkMapIcons(); handler.removeCallbacks(zoomChecker); // remove the old callback handler.postDelayed(zoomChecker, zoomCheckingDelay); // register a new one } }; 

Iniciar un evento de devolución de llamada utilizando

 protected void onResume() { super.onResume(); handler.postDelayed(zoomChecker, zoomCheckingDelay); } 

Y detenerlo cuando deje la actividad usando

 protected void onPause() { super.onPause(); handler.removeCallbacks(zoomChecker); // stop the map from updating } 

El artículo se basa en se puede encontrar aquí si desea una escritura más larga.

Yo uso esta biblioteca que tiene un oyente de función onZoom. http://code.google.com/p/mapview-overlay-manager/ . Funciona bien.

Como dijo el OP, utilice el onUserInteractionEvent y realice la prueba usted mismo.

La API de Android sugiere que utilice ZoomControls que tiene un setOnZoomInClickListener ()

Para agregar estos controles de zoom:

 ZoomControls mZoom = (ZoomControls) mapView.getZoomControls(); 

Y luego agregue mZoom a su diseño.

Aquí hay una solución limpia. Simplemente agregue esta clase privada TouchOverlay a su actividad y un método llamado onZoom (que es llamado por esta clase interna).

Ten en cuenta que tendrás que añadir este TouchOverlay a tu mapa.

 mapView.getOverlays().add(new TouchOverlay()); 

Controla el nivel de zoom cada vez que el usuario toca el mapa, por ejemplo, para hacer doble toque o pellizcar el zoom y luego dispara el método onZoom (con el nivel de zoom) si cambia el nivel de zoom.

  private class TouchOverlay extends com.google.android.maps.Overlay { int lastZoomLevel = -1; @Override public boolean onTouchEvent(MotionEvent event, MapView mapview) { if (event.getAction() == 1) { if (lastZoomLevel == -1) lastZoomLevel = mapView.getZoomLevel(); if (mapView.getZoomLevel() != lastZoomLevel) { onZoom(mapView.getZoomLevel()); lastZoomLevel = mapView.getZoomLevel(); } } return false; } } public void onZoom(int level) { reloadMapData(); //act on zoom level change event here } 

Puedes usar

 ZoomButtonsController zoomButton = mapView.getZoomButtonsController(); zoomButton.setOnZoomListener(listener); 

Espero eso ayude

Creo que podría haber otra respuesta a esta pregunta. El método de dibujo de clase Overlay se llama después de cualquier zoom y creo que se llama después de que cambie el nivel de zoom. ¿No podría arquitecto su aplicación para aprovechar esto? Incluso podría usar una superposición ficticia para detectar esto si quería. ¿No sería esto más eficiente que usar un runnable con un retraso?

 @Override public boolean draw (Canvas canvas, MapView mapView, boolean shadow, long when) { int zoomLevel = mapView.getZoomLevel(); // do what you want with the zoom level return super.draw(canvas, mapView, shadow, when); } 

U puede tener Zoom CControl como este.

Aquí estoy adjuntando código cómo u puede implementar zoomcontrol.

1 >> El archivo XML debe ser así.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.google.android.maps.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:enabled="true" android:clickable="true" android:apiKey="0l4sCTTyRmXTNo7k8DREHvEaLar2UmHGwnhZVHQ" /> <LinearLayout android:id="@+id/zoom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" /> </RelativeLayout> 

2 >> Sobre su actividad principal en el método de creatividad hacer las cosas siguientes. Aquí se está inflando su vista con mapView

 mapView = (MapView) findViewById(R.id.mapView); LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); View zoomView = mapView.getZoomControls(); zoomLayout.addView(zoomView, new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); mapView.displayZoomControls(true); 

Unesdoc.unesco.org unesdoc.unesco.org ……… Esto es cómo se puede utilizar el control de zoom incorporado de API ..

Usted puede tener su propio código personalizado para implementar Zoom In y Zoom out como este …

 public boolean onKeyDown(int keyCode, KeyEvent event) { MapController mc = mapView.getController(); switch (keyCode) { case KeyEvent.KEYCODE_3: mc.zoomIn(); break; case KeyEvent.KEYCODE_1: mc.zoomOut(); break; } return super.onKeyDown(keyCode, event); } 

.. Así es como he implementado …

Gracias … Rakesh

Para pre-V2.0, hice una clase que extiende MapView que alerta a un oyente con eventos cuando la región del mapa comienza a cambiar (onRegionBeginChange) y deja de cambiar (onRegionEndChange).

 import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; public class ExMapView extends MapView { private static final String TAG = ExMapView.class.getSimpleName(); private static final int DURATION_DEFAULT = 700; private OnRegionChangedListener onRegionChangedListener; private GeoPoint previousMapCenter; private int previousZoomLevel; private int changeDuration; // This is the duration between when the user stops moving the map around and when the onRegionEndChange event fires. private boolean isTouched = false; private boolean regionChanging = false; private Runnable onRegionEndChangeTask = new Runnable() { public void run() { regionChanging = false; previousMapCenter = getMapCenter(); previousZoomLevel = getZoomLevel(); if (onRegionChangedListener != null) { onRegionChangedListener.onRegionEndChange(ExMapView.this, previousMapCenter, previousZoomLevel); } } }; public ExMapView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ExMapView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public ExMapView(Context context, String apiKey) { super(context, apiKey); init(); } @Override public boolean onTouchEvent(MotionEvent event) { isTouched = event.getAction() != MotionEvent.ACTION_UP; return super.onTouchEvent(event); } @Override public void computeScroll() { super.computeScroll(); // If the map region is still changing (user is still scrolling or zooming), reset timer for onRegionEndChange. if ((!isTouched && !getMapCenter().equals(previousMapCenter)) || (previousZoomLevel != getZoomLevel())) { // If the region has just begun changing, fire off onRegionBeginChange event. if (!regionChanging) { regionChanging = true; if (onRegionChangedListener != null) { onRegionChangedListener.onRegionBeginChange(this, previousMapCenter, previousZoomLevel); } } // Reset timer for onRegionEndChange. removeCallbacks(onRegionEndChangeTask); postDelayed(onRegionEndChangeTask, changeDuration); } } private void init() { changeDuration = DURATION_DEFAULT; previousMapCenter = getMapCenter(); previousZoomLevel = getZoomLevel(); } public void setOnRegionChangedListener(OnRegionChangedListener listener) { onRegionChangedListener = listener; } public void setChangeDuration(int duration) { changeDuration = duration; } public interface OnRegionChangedListener { public abstract void onRegionBeginChange(ExMapView exMapView, GeoPoint geoPoint, int zoomLevel); public abstract void onRegionEndChange(ExMapView exMapView, GeoPoint geoPoint, int zoomLevel); } } 

He utilizado una mezcla de lo anterior. Encontré que usar el timmer para iniciar un hilo cada medio segundo causa que el mapa sea realmente jenky. Probablemente porque estaba usando un par de afirmaciones cada vez. Así que empecé el hilo de un post demora de 500ms de la onUserInteraction. Esto da suficiente tiempo para que el zoomLevel se actualice antes de que el subproceso empiece a ejecutarse, obteniendo así el nivel de zoom correcto sin ejecutar un subproceso cada 500 ms.

 public void onUserInteraction() { handler.postDelayed(zoomChecker, zoomCheckingDelay); } 
  • Android google maps no se puede ampliar con compás activo
  • ¿La mejor manera de tener una superposición de zoom y pan en Android?
  • Android GridView pinch zoom
  • ¿Cómo puedo implementar zoom en la Biblioteca Fresco?
  • Marcadores de mapa de escala por Zoom, Android
  • Código de Android para ampliar y desplazar un diseño relativo que contiene cuadros de texto, botones, hilanderos, etc.
  • zoom androidplot no funciona correctamente en todos los dispositivos
  • Android ViewGroup.setScaleX () hace que la vista se recorte
  • Dibujar y hacer zoom sobre ImageView y lienzo en Android
  • ¿Cómo puedo hacer que un SurfaceView sea más grande que la pantalla?
  • Galería de Android: reemplaza el mapa de bits en ImageView después de que el desplazamiento se detuvo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.