script para new library google java android events google-maps zoom

java - new - En el evento zoom para google maps en android



new google maps (11)

Estamos construyendo una aplicación que está utilizando la API de Google Maps para Android.

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

mapView.setBuiltInZoomControls(true);

Ahora me gustaría obtener un evento cuando el usuario realmente amplía el mapa, ¿cómo lo hago? No puedo encontrar ningún evento o evento general en el que pueda detectar un cambio en el nivel de zoom.

Actualizar

MapView.getZoomControls () está en desuso . Y la documentación sugiere utilizar mapView.setBuiltInZoomControls (bool) en su lugar. Esto está bien, pero simplemente no puedo entender cómo actuar sobre los eventos desde los controles de zoom integrados.


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).

Tenga en cuenta que tendrá que agregar esta TouchOverlay a su mapView, por ejemplo

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

Realiza un seguimiento del nivel de zoom cada vez que el usuario toca el mapa, por ejemplo, para hacer doble toque o acercar el zoom y luego dispara el método onZoom (con el nivel de zoom) si cambia el nivel de acercamiento.

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 }


Como dijo OP, use el onUserInteractionEvent y haga la prueba usted mismo.


Con Google Maps Android API v2 puedes usar un GoogleMap.OnCameraChangeListener así:

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 } } });


Creo que podría haber otra respuesta a esta pregunta. El método de dibujo de la clase de superposición se llama después de cualquier zoom y creo que se llama después de que cambia el nivel de zoom. ¿No podrías diseñar tu aplicación para aprovechar esto? Incluso podrías usar una superposición ficticia solo para detectar esto si quisieras. ¿No sería esto más eficiente que usar un ejecutable 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); }


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

Para agregar estos controles de zoom, usted:

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

Y luego agrega mZoom a tu diseño.


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

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); } }


Puede implementar su propia "encuesta" básica del valor del zoom para detectar cuándo se ha cambiado el zoom utilizando el Handler Android.

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

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 } };

Comience un evento de devolución de llamada usando

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

y detenerlo cuando abandones la actividad usando

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

El artículo en el que se basa se puede encontrar here si desea una redacción más larga.


Puedes usar

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

Espero eso ayude


U puede tener Zoom CControl así.

Aquí adjunto el código de cómo puedes implementar el control de zoom.

1 >> El archivo XML debería 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 >> En tu actividad principal dentro del método oncreate, haz lo siguiente. Aquí 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);

.................................................. ......... Así es como puedes usar el control de zoom incorporado de la API ...

Puede tener su propio código personalizado para implementar Acercar y alejar de esta manera ...

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 lo he implementado ...

Gracias ... Rajas


Usé una mezcla de los anteriores. Descubrí que usar el temporizador para iniciar un hilo cada medio segundo hace que el mapa sea realmente jenky. Probablemente porque estaba usando un par de declaraciones If cada vez. Así que comencé el hilo en una demora de 500ms desde onUserInteraction. Esto da tiempo suficiente para que zoomLevel se actualice antes de que el hilo comience a ejecutarse, obteniendo así el nivel de zoom correcto sin ejecutar un hilo cada 500 ms.

public void onUserInteraction() { handler.postDelayed(zoomChecker, zoomCheckingDelay); }