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; } }; 
  • Aplicación de setRotation a Maps API v2
  • Google Place API para espacios de estacionamiento
  • Botón My-Location de GoogleMaps v2 Android, no se muestra
  • Destacando una calle en Google Maps en android
  • ¿Funciona el reconocimiento de actividad de Google en las versiones anteriores de Android?
  • Google Maps API v2: ¿Cómo hacer que los marcadores se puedan hacer clic?
  • Cómo guardar agregados google mapas superposiciones en una aplicación para Android?
  • Android obtener y analizar Google Directions
  • ¿Cuál es el enfoque correcto para crear una aplicación para Android?
  • API de Google Maps para Android da un NoClassDefFoundError
  • Los mapas de Google de repente no funcionan
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.