Android Get Mapview en Fling dejó de animarse

Necesito limitar el área a la que mis usuarios pueden navegar en la vista de mapa (¡a menos que obtengan una pantalla en blanco!). He creado una clase que amplía la vista de mapa y anuló el evento onTouchEvent. Estoy detectando la acción "ACTION_UP" y comprobando las coordenadas aquí y reposicionando el mapa si es necesario. Todo funciona bien hasta que el usuario "lanza" el mapa. Puedo detectar el "Arriba" y las coordenadas de la pantalla en ese punto, pero el mapa aún se está moviendo, así que las coordenadas que detecto no son las correctas.

¡Necesito saber la posición de la pantalla cuando deja de moverse!

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_UP ) {
//get coords of screen corners and calculate if the map is still in view.
}

He estado buscando una buena cantidad de tiempo para la respuesta a esto, pero muchas personas están haciendo la pregunta, pero no parece haber ninguna solución.

¿Alguien ha logrado hacer esto?

Bex

preguntado el 10 de mayo de 11 a las 13:05

Sí, lamentablemente el estándar GestureDetector proporciona información sobre cuándo comienza una aventura, pero no cuándo termina. Echaré un vistazo y veré si el final de una aventura se puede detectar fácilmente. Podrías anular onFling y solo deshabilita el lanzamiento regresando false desde allí. También sería mejor comprobar la posición del mapa cuando un ACTION_MOVE ocurre el evento, en lugar del evento hacia arriba o el mapa "saltará" de regreso a su posición si se movió demasiado lejos cuando levante el dedo. -

@Joseph ¡Gracias por tu comentario! ¡Si pudieras ver si es posible terminar la aventura, sería genial! ¡En caso contrario, deshabilitar el lanzamiento podría ser la mejor opción! -

He añadido el oyente de gestos ... ¡¿pero el evento on fling no se activa ?! -

Sí, disculpas, después de mirar la fuente, es evidente que MapView usa su propio sistema de gestos y no implementa el GestureDetector desde el SDK. Es posible que esté un poco atascado ... Editar: podría probar el stopAnimation y stopPanning métodos de MapController cuando el usuario levanta el dedo y ve si eso detiene la aventura. -

Me las arreglé para detener la aventura, ¡estaba usando al oyente equivocado! ¡Lo hace parecer bastante torpe! ¡Si pudiera detectar el final de la sartén, las cosas serían mucho más fáciles! :) -

2 Respuestas

utilizo para anular el método computeScroll () de MapView:

/**
 * checks restriction on pan bounds and locks the map. if the map is locked
 * (via mapController.getCenter()) this method returns true
 * 
 * @return TRUE if map has been locked
 */
private boolean restrictPanOnBounds() {
  if (this.minLatitudeE6 == Integer.MIN_VALUE)
    return false;

  GeoPoint center = getMapCenter();
  int cLat = center.getLatitudeE6();
  int cLong = center.getLongitudeE6();

  Integer nLat = null, nLong = null;

  if (cLat < this.minLatitudeE6)
    nLat = this.minLatitudeE6;
  else if (cLat > this.maxLatitudeE6)
    nLat = this.maxLatitudeE6;

  if (cLong < this.minLongitudeE6)
    nLong = this.minLongitudeE6;
  else if (cLong > this.maxLongitudeE6)
    nLong = this.maxLongitudeE6;

  if (nLat != null || nLong != null) {
    getController().setCenter(new GeoPoint(nLat != null ? nLat : cLat, nLong != null ? nLong : cLong));
    return true;
  } else {
    return false;
  }
}

@Override
public void computeScroll() {
  if (restrictPanOnBounds())
    getController().stopPanning();
  else
    super.computeScroll();
}

funciona bastante bien para acciones de movimiento simples (el mapa se detiene no salta hacia atrás) pero aún tiene un efecto de inclinación "divertido" al lanzar ...

Respondido el 10 de enero de 13 a las 01:01

Yo tuve el mismo problema. Tu enfoque es bueno, solo necesitas ver el evento en otro lugar. Puede anular el método "DispatchTouchEvent" de la clase MapView (o adoptar un enfoque similar usando MapFragment), y allí puede omitir el evento MotionEvent.ACTION_UP:

if (ev.getAction() == MotionEvent.ACTION_UP ) {
   return false;
}

Respondido 06 Jul 15, 17:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.