¿Cómo capturar el mapa de panorámica y zoom están realmente terminado?

Estoy tratando de escribir una aplicación que cargará dinámicamente los datos para asignar mientras que las cacerolas del usuario o las zooms él.

Necesito realizar un seguimiento cuando el mapa está terminado para cambiar su estado de vista (detiene el desplazamiento panorámico o el zoom) y luego carga una nueva porción de datos para crear marcadores. Pero de hecho Google Maps API no tiene ningún evento para manejar esto.

Hay algunos métodos como la creación de una superposición vacía para controlar los eventos onTouch y así sucesivamente, pero el desplazamiento del mapa podría durar mucho tiempo después de que el usuario haya terminado su toque porque los GMaps utilizan algún tipo de inercia para hacer que la bandeja sea más suave.

Intenté subclasificar MapView pero su método draw() es final por lo que no se puede sobreescribir.

¿Alguna idea de cómo hacer un manejo preciso de los acabados de pan y zoom?

Horas de investigación y alguna decisión fue encontrada. Tiene algunos contras y pros que describiré más adelante.

Lo principal que debemos hacer es anular algunos métodos de MapView para manejar su comportamiento de dibujo. En caso de que no podamos anular el método draw (), deberíamos encontrar otro camino. Hay otro derivado de View que puede ser sobreescrito – método computeScroll (). Se llama repetidamente mientras que el mapa continúa acolchando. Todo lo que tenemos que hacer es fijar un cierto umbral del tiempo para coger si el cálculo de computeScroll no se llama más esta vez.
Esto es lo que hice:

 import java.util.Timer; import java.util.TimerTask; 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 EnhancedMapView extends MapView { public interface OnZoomChangeListener { public void onZoomChange(MapView view, int newZoom, int oldZoom); } public interface OnPanChangeListener { public void onPanChange(MapView view, GeoPoint newCenter, GeoPoint oldCenter); } private EnhancedMapView _this; // Set this variable to your preferred timeout private long events_timeout = 500L; private boolean is_touched = false; private GeoPoint last_center_pos; private int last_zoom; private Timer zoom_event_delay_timer = new Timer(); private Timer pan_event_delay_timer = new Timer(); private EnhancedMapView.OnZoomChangeListener zoom_change_listener; private EnhancedMapView.OnPanChangeListener pan_change_listener; public EnhancedMapView(Context context, String apiKey) { super(context, apiKey); _this = this; last_center_pos = this.getMapCenter(); last_zoom = this.getZoomLevel(); } public EnhancedMapView(Context context, AttributeSet attrs) { super(context, attrs); } public EnhancedMapView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setOnZoomChangeListener(EnhancedMapView.OnZoomChangeListener l) { zoom_change_listener = l; } public void setOnPanChangeListener(EnhancedMapView.OnPanChangeListener l) { pan_change_listener = l; } @Override public boolean onTouchEvent(MotionEvent ev) { if (ev.getAction() == 1) { is_touched = false; } else { is_touched = true; } return super.onTouchEvent(ev); } @Override public void computeScroll() { super.computeScroll(); if (getZoomLevel() != last_zoom) { // if computeScroll called before timer counts down we should drop it and start it over again zoom_event_delay_timer.cancel(); zoom_event_delay_timer = new Timer(); zoom_event_delay_timer.schedule(new TimerTask() { @Override public void run() { zoom_change_listener.onZoomChange(_this, getZoomLevel(), last_zoom); last_zoom = getZoomLevel(); } }, events_timeout); } // Send event only when map's center has changed and user stopped touching the screen if (!last_center_pos.equals(getMapCenter()) || !is_touched) { pan_event_delay_timer.cancel(); pan_event_delay_timer = new Timer(); pan_event_delay_timer.schedule(new TimerTask() { @Override public void run() { pan_change_listener.onPanChange(_this, getMapCenter(), last_center_pos); last_center_pos = getMapCenter(); } }, events_timeout); } } } 

Entonces debe registrar manejadores de eventos en su MapActivity como esto:

 public class YourMapActivity extends MapActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mv = new EnhancedMapView(this, "<your Maps API key here>"); mv.setClickable(true); mv.setBuiltInZoomControls(true); mv.setOnZoomChangeListener(new EnhancedMapView.OnZoomChangeListener() { @Override public void onZoomChange(MapView view, int newZoom, int oldZoom) { Log.d("test", "zoom changed from " + oldZoom + " to " + newZoom); } } mv.setOnPanChangeListener(new EnhancedMapView.OnPanChangeListener() { public void onPanChange(MapView view, GeoPoint newCenter, GeoPoint oldCenter) { Log.d("test", "center changed from " + oldCenter.getLatitudeE6() + "," + oldCenter.getLongitudeE6() + " to " + newCenter.getLatitudeE6() + "," + newCenter.getLongitudeE6()); } } } 

Ahora, ¿qué pasa con las ventajas y desventajas de este enfoque?
Ventajas:
– Eventos maneja de cualquier manera el mapa fue panoramizado o ampliado. Evento táctil, claves de hardware utilizadas, incluso los eventos programados se manejan (como los métodos setZoom () o animate ()).
– Capacidad para omitir la carga innecesaria de datos si el usuario hace clic en el botón de zoom varias veces rápidamente. El evento se disparará sólo después de que los clics se detengan.
Desventajas:
– No es posible cancelar el zoom o la acción panorámica (tal vez voy a añadir esta capacidad en el futuro)

Espero que esta pequeña clase te ayude.

El proyecto MapChange , publicado originalmente en una pregunta similar aquí , me ayudó a completar la misma tarea que usted solicitó.

  • Extracción de datos del archivo CSV (tabla de fusión y solución alternativa de kml)
  • Convertir la ubicación en GeoPoint
  • Activación de un evento de mapa (como un clic de marcador) en Google Maps Android V2
  • ¿Cómo obtener la dirección completa desde la latitud y la longitud?
  • ¿Cómo hacer que la altura de MapView tenga en cuenta la barra de estado de Android?
  • Map.setmylocationenabled (true) no funciona
  • La visualización de Android MapView está vacía
  • Google map firmó errores clave de api en Android
  • Ubicación en proyecto jónico para android
  • Resultados de geocodificación sin mostrarlos en un mapa
  • ¿Cómo desarrollar una aplicación de Android con google maps API en varios equipos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.