2011-01-26 13 views
11

Ho un MapView in un'attività e funziona perfettamente, la mappa mostra e risponde ai tocchi e posso estrarre facilmente la posizione. Tuttavia, questo gestore risponde anche al pizzico-zoom, quindi se un utente tenta di eseguire lo zoom-pizzico, l'app risponde come se toccassero (ed è molto confuso per loro).Come rispondere a un tocco su Android MapView, ma ignorare lo zoom pizzico?

Come posso rispondere ai tocchi su un MapView e riprendere solo i tocchi singoli, in particolare ignorando lo zoom-pizzico e i doppi tocchi?

Devo utilizzare OnTouchEvent() anziché OnTap()? In tal caso, come faccio a distinguere tra i diversi eventi di tocco e come accedo a GeoPoint?

Ecco il codice da dentro la mia MapActivity:

class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean onTap(GeoPoint p, MapView map) 
    { 
     if (p!=null) 
     { 
      // Do stuff with the geopoint 
      return true;         // We handled the tap 
     } 
     else 
     { 
      return false;        // We didn't handle the tap 
     } 
    } 
} 
+0

Potreste essere in grado di continuare ad usare onTap, che è stato progettato per rispondere solo quando gli elementi di sovrapposizione sono sotto controllo (in contrapposizione a qualsiasi punto della mappa), ed ancora impostato un tocco ascoltatore sulla MapView di ignorare pizzico, come questo: http://stackoverflow.com/questions/4626028/how-to-disable-pinch-in-android-mapview –

+0

È interessante notare come trascinare la mappa. quindi Trascina non attiva onTap() ma tocca fa (come previsto) ma anche pizzica e zoom. Non è quello che mi sarei aspettato. –

+0

Non voglio disabilitare pizzico e zoom, voglio che funzioni, voglio solo che la mia app riprenda anche onTap. –

risposta

27

Dopo tanto testa-graffio e provando diversi approcci, questo sta lavorando bene finora. Il codice segue gli eventi di movimento. Quando riceviamo un evento ACTION_DOWN, contrassegna il flag isPinch come falso (non sappiamo se è un pizzico o non ancora), ma non appena otteniamo un evento touch (cioè ACTION_MOVE) che coinvolge due dita, isPinch è impostato su true, e così quando l'evento onTap() si attiva, può vedere se c'è stato un pizzico o meno.

class MapOverlay extends com.google.android.maps.Overlay 
{ 
private boolean isPinch = false; 

@Override 
public boolean onTap(GeoPoint p, MapView map){ 
    if (isPinch){ 
     return false; 
    }else{ 
     Log.i(TAG,"TAP!"); 
     if (p!=null){ 
      handleGeoPoint(p); 
      return true;   // We handled the tap 
     }else{ 
      return false;   // Null GeoPoint 
     } 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent e, MapView mapView) 
{ 
    int fingers = e.getPointerCount(); 
    if(e.getAction()==MotionEvent.ACTION_DOWN){ 
     isPinch=false; // Touch DOWN, don't know if it's a pinch yet 
    } 
    if(e.getAction()==MotionEvent.ACTION_MOVE && fingers==2){ 
     isPinch=true; // Two fingers, def a pinch 
    } 
    return super.onTouchEvent(e,mapView); 
} 

} 
+0

Meraviglioso! Esattamente quello che stavo cercando. Ti darei +2! :) – Kimi

+0

+1 perfetto, grazie :) – Dori

+0

Grazie, ho trovato questa domanda prima ancora che mi rendessi conto di avere lo stesso identico problema! Bello avere la soluzione subito =) –

Problemi correlati