Doble clic / toque zoom mapa (Android)

Posible duplicado:
Doble toque -> Zoom en Android MapView?

Tengo una Activity que extiende MapActivity . Uso Google Maps.
Necesito hacer zoom con un doble clic o doble toque.

¿Puede alguien ayudarme con esto?

Ya he mirado el siguiente, pero no son lo que estoy buscando.

Doble toque -> Zoom en Android MapView?

Detección de gestos fling en el diseño de la cuadrícula

Me di cuenta de que onTouchListener se está llamando sólo una vez, ¿por qué es así?

 // set Gesture detector = new GestureDetector(new GestureReactor()); mapView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { System.out.println("Inside onTouch"); return detector.onTouchEvent(event); } }); 

Tengo clases privadas:

 private class GestureReactor extends SimpleOnGestureListener { @Override public boolean onDoubleTap(MotionEvent e) { System.out.println("inside onDouble"); controller.zoomInFixing((int) e.getX(), (int) e.getY()); return super.onDoubleTap(e); } } 

y

 private GestureDetector detector; 

6 Solutions collect form web for “Doble clic / toque zoom mapa (Android)”

Puesto que desea una respuesta de copia-pega, mire aquí .

EDITAR:

En mi public class MainMap extends MapActivity Tengo un campo llamado private MyMapView mv;

Entonces hice una clase que extiende MapView como esto: public class MyMapView extends MapView .

Así que acaba de hacer una nueva clase que extends MapView , copiar y pegar el código que encontró en el enlace de allí, y utilizar su nueva class en su actividad que se extends MapActivity .

Me encanta esta solución de ampliar el MapView con una vista personalizada y usarla en toda la aplicación. MapView tiene una función para interceptar gestos táctiles que puede utilizar para hacer un doble clic en voodoo. Si tiene más de un mapa en su aplicación, esta es una gran manera de permanecer seco.

 import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ViewConfiguration; import com.google.android.maps.MapView; public class MyMapView extends MapView { private long lastTouchTime = -1; public MyMapView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { long thisTime = System.currentTimeMillis(); if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) { // Double tap this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY()); lastTouchTime = -1; } else { // Too slow :) lastTouchTime = thisTime; } } return super.onInterceptTouchEvent(ev); } } 

De este tipo

Tuve el mismo problema que bbodenmiller donde todo funcionó bien hasta que tuve que echar a la clase recién hecha. MapView = (MyMapView) findViewById (R.id.mapview); Siempre lanzaría una excepción.

La solución es cambiar el diseño XML donde estamos mostrando el MapView personalizado. Cuando utiliza un MapView de vainilla su diseño XML es algo como esto:

 <?xml version="1.0" encoding="utf-8"?> <com.google.android.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:apiKey="Hidden for obvious reasons" /> 

El problema radica en que "com.google.android.maps.MapView" define la vista como específicamente un MapView. Deberá definirlo con su MapView personalizado. Termina pareciendo más así.

 <?xml version="1.0" encoding="utf-8"?> <jocquej.PackageName.MyMapView ... /> 

También he estado buscando una respuesta / ejemplo, pero no encontré ningún código de trabajo.

Por último, aquí está el código que está funcionando para mí:

MyMapActivity.java

 public class MyMapActivity extends MapActivity implements OnGestureListener, OnDoubleTapListener{ private MapView mapView; @Override public void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.main); mapView = (MapView)findViewById(R.id.mapView); } @Override public boolean onDoubleTap(MotionEvent e) { int x = (int)e.getX(), y = (int)e.getY();; Projection p = mapView.getProjection(); mapView.getController().animateTo(p.fromPixels(x, y)); mapView.getController().zoomIn(); return true; } //Here will be some autogenerated methods too 

OnDoubleTap.java

 public class OnDoubleTap extends MapView { private long lastTouchTime = -1; public OnDoubleTap(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { long thisTime = System.currentTimeMillis(); if (thisTime - lastTouchTime < 250) { // Double tap this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY()); lastTouchTime = -1; } else { // Too slow lastTouchTime = thisTime; } } return super.onInterceptTouchEvent(ev); } } 

Main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <azizbekyan.andranik.map.OnDoubleTap android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:enabled="true" android:clickable="true" android:apiKey="YOUR_API_KEY" /> </LinearLayout> 

No te olvides de reemplazar aquí el android:apiKey valor con tu apiKey .

No pude obtener http://nocivus.posterous.com/double-clicktap-detection-on-a para trabajar como muchos otros lo hicieron, ya que no me permitiría convertir mapView = (MyMapView) findViewById(R.id.mapview); Diciendo que la mejor solución que obtuve se basó en la respuesta en Double Tap Zoom en GoogleMaps Actividad :

 myLocationOverlay = new MyLocationOverlay(this, mapView); MyItemizedOverlay itemizedOverlay = new MyItemizedOverlay() { private long systemTime = System.currentTimeMillis(); @Override public boolean onTouchEvent(MotionEvent event, MapView mapView) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if ((System.currentTimeMillis() - systemTime) < ViewConfiguration.getDoubleTapTimeout()) { mapController.zoomInFixing((int) event.getX(), (int) event.getY()); } break; case MotionEvent.ACTION_UP: systemTime = System.currentTimeMillis(); break; } return false; } }; 
  • Google Maps CameraUpdateFactory no se ha inicializado
  • Error de compilación en Android Studio Al realizar un simple proyecto Google API de Google Maps API v2
  • Cómo encontrar la distancia (por carretera) entre 2 puntos geo en la aplicación de Android sin utilizar google map direction api?
  • Google Map V2 Android y iOS colocan decimales latlng
  • Com.tools.fd.runtime.BootstrapApplication no se ejecutará a menos que actualice los servicios de Google Play
  • Ocultar infoWindow cuando se hace clic en el marcador por segunda vez (Google Map Android API V2)
  • MyLocation botón oculto tras la barra de acción transparente, cómo reposicionar?
  • ROTATE Google-Map para mostrar mi DIRECCIÓN en tiempo real
  • Google Maps V2 mostrando una pantalla en blanco
  • Cómo deshabilitar la función de rotación de mapas en el fragmento de mapa de Android
  • Cambio entre la API de Google Maps para Android v2 DEBUG y la clave de API de RELEASE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.