Google Maps Android, detecta la interacción del usuario en un mapa de la ubicación

Tengo una aplicación para Android que muestra un mapa. El mapa se centra por defecto en la posición del usuario tras sus movimientos (el centro se actualiza de acuerdo con las actualizaciones de posición).

Sin embargo, quiero que el usuario pueda utilizar gestos para navegar a tirar el mapa. Cuando el usuario inicia la navegación, quiero que se detenga el "siguiente" y se muestre un botón para que pueda empezar de nuevo.

¿Cómo puedo saber cuando el usuario ha movido el centro del mapa? En GoogleMap.OnCameraChangeListener, no sé si el cambio se debe a una ubicación cambiada oa una interacción del usuario. Tengo un tipo de solución de trabajo utilizando el OnCameraChangeListener, pero es un poco "sucia" y no me parece muy agradable:

map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition position) { // gpsPosition contains the last position obtained if(isFollowing && gpsPosition!=null && (Math.abs(position.target.latitude - gpsPosition.latitude)>0.000001 || Math.abs(position.target.longitude - gpsPosition.longitude)>0.000001) ){ isFollowing = false; map.getUiSettings().setMyLocationButtonEnabled(true); } } }); 

¿Hay una buena solución al problema?

Si desea detectar el usuario interactuar con el mapa OnCameraChangeListener es, sin duda, demasiado tarde para hacer eso. Puede ser llamado segundos después de que el usuario comenzó a interactuar con el mapa.

Qué usted necesita hacer, es agregar 2 otros oyentes:

  • OnMyLocationButtonClickListener – para saber cuándo iniciar el seguimiento (defina su isFollowing a true )
  • OnMyLocationChangeListener – cuando su isFollowing es true , llame a GoogleMap.animateCamera a la nueva posición

Así que lo único que queda es cuando se establece isFollowing a false :

Cree una superposición invisible en su diseño ( como aquí , pero con la View normal en lugar de personalizada) y asigne esta superposición (la View ) a OnTouchListener (ok, es la tercera, mentí que sólo necesita 2).

En este oyente siempre devuelve false , pero también establece isFollowing to false . Esto cuando el usuario comienza a interactuar con el mapa y debe detener los movimientos automáticos de la cámara.

También veo que está mostrando y ocultando mi botón de ubicación, así que haga esto donde cambia el valor de isFollowing . Btw .: buena idea para hacer eso. Lo intentaré también.

Nunca he intentado esto, pero aquí hay algunas ideas de la parte superior de mi cabeza (balding):

Si se produce un evento de cambio de cámara que no parece estar vinculado al cambio de ubicación (por ejemplo, 5+ milisegundos después) Que era presumiblemente un usuario que modificaba el mapa a través de gestos.

Opción # 2: Subclase los Mapas V2 MapView y MapView los métodos relacionados con el tacto como onTouchEvent() . Además de encadenar a la superclase, usted sabría que un cambio de cámara que sucede muy pronto a partir de ahora probablemente es del usuario que modifica el mapa vía gestos.

Opción # 3: Hacer ambos de los anteriores. De esta manera, todos los cambios en el mapa deben tocar su código, lo que debería aumentar la fiabilidad de su determinación de la fuente de cambio de la cámara.

BTW, presenté una solicitud de característica para una solución mejor .

La forma más sencilla debería ser guardar el centro Longitud y latitud de su mapa. Ahora crea un EventListener y compruébalo en una sentencia if:

 if(oldLongLat != newLongLat){ //Something has moved }else { //Nothing has moved } 
  • Cambio entre la API de Google Maps para Android v2 DEBUG y la clave de API de RELEASE
  • ¿Cómo pueden las aplicaciones usar Google Offline Maps de Android 4+?
  • ¿Cómo obtener la ubicación actual en Google Maps Android API v2?
  • Android maps: No se pudo encontrar el estilo 'mapViewStyle' en el tema actual
  • Usar la API de Google Maps de Google para mostrar una capa de Mapa de Calor
  • Animación de marcadores en Google Maps V2
  • GoogleMap V2 carga mapa aleatoriamente android
  • Lado del servidor Routeboxer
  • Obtener latitud y longitud utilizando código postal
  • Detección del final de la navegación en Waze o Google Maps para móviles
  • ¿Cómo configurar el color de las cargas de carga de Google Maps?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.