2010-09-08 10 views
6

Sto tentando di implementare una funzione di zoom con doppio tocco nel mio MapView. L'evento si attiva sempre la prima volta, ma mai in momenti successivi. Di seguito è il mio codice. Ho la sensazione che abbia qualcosa a che fare con il controller della mappa che si perde dopo la prima volta che l'evento viene sparato.OnTouch in MapView scatta solo la prima volta

import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 

public class mainmap extends MapActivity implements OnTouchListener{ 

    long lasttime = -1; 
    MapController mapc; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     MapView mapView = (MapView) findViewById(R.id.mapview); 
     mapView.setBuiltInZoomControls(true); 
     mapc = mapView.getController(); 
     mapView.setOnTouchListener(this);  
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 

      if(event.getEventTime()-lasttime<2000){ 
       mapc.zoomInFixing((int)event.getX(),(int)event.getY());    
      } 
     }  
     lasttime=event.getEventTime(); 
     return true; 
    } 

    } 

Ho anche provato la modifica del metodo di OnTouch per lanciare la visualizzazione in entrata a un MapView, ottenendo il controller mentre l'evento viene generato. Tuttavia, ottengo gli stessi risultati in cui viene sparato il primo evento ma non quelli successivi.

public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 

      if(event.getEventTime()-lasttime<2000){ 
       ((MapView)v).getController().zoomInFixing((int)event.getX(), (int)event.getY());     
      } 
     }  
     lasttime=event.getEventTime(); 
     return true; 
    } 

Essere come base, come possibile, ho tagliato fuori tutto il codice nel metodo OnTouch e programmato per visualizzare semplicemente un piccolo messaggio brindisi.

public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 

       Toast.makeText(this,"Down!",Toast.LENGTH_SHORT).show(); 

     }  

     return true; 
} 

Questo funziona come previsto, visualizzando il Toast ogni volta che si tocca MapView.

Non capisco perché l'evento verrà attivato correttamente in questo caso ma non nella mia precedente implementazione.

risposta

0

Come utilizzare un GestureDetector.OnDoubleTapListener anziché OnTouchListener?

+0

Grazie per il suggerimento. Cercherò di implementare un OnDoubleTapListener per gestire invece questa funzionalità. Sono ancora confuso però. Capisco che OnDoubleTapListener è probabilmente il modo migliore per gestirlo, ma il codice che ho postato in teoria dovrebbe funzionare, giusto? – amandion

0

si dovrebbe almeno mettere

lasttime=event.getEventTime(); 

sotto la

if (event.getAction() == MotionEvent.ACTION_DOWN) brakes 

mentre onTouch rilevare ACTION_UP caso di vostro scatto. Quindi ogni volta che fai un clic viene chiamato 2 volte

1

Stavo avendo lo stesso problema: non potevo trascinare e scorrere la mappa perché riceveva solo eventi ACTION_DOWN. Può essere risolto aggiungendo android:clickable="true" allo MapView o chiamando mapView.setClickable(true).

+0

no, OnTouchListener + OnClickListener non funziona :( – djdance

15

Se si utilizza questo metodo "mapView.setBuiltInZoomControls(true);" allora il vostro touch funziona in una volta.

Si prega di rimuovere che quella linea e verificare io sono sicuro che funzionerà ..

In alcuni casi, se si desidera BuiltInZoomControls allora si può si metodo OnTouch di sovrapposizione come come seguente ..

public class MapOverlay extends Overlay { 

    public MapOverlay(Context ctx) {super(ctx);} 

    @Override 
    protected void draw(Canvas c, MapView osmv, boolean shadow) { } 

    @Override 
    public boolean onTouchEvent(MotionEvent e, MapView mapView) { 
     //Write yout touch code here.. 
     return false; 
    } 
} 
+0

È vero, ma perché l'evento tattile viene chiamato una volta? – Nik

+0

Non mi sono perso il mio tempo su di esso, quindi non ne sono a conoscenza.Penso che non sia necessario builtInZoom Button bcz map già supporta lo zoom multi-touch e puoi anche aggiungere il tuo pulsante personalizzato per zoom In/Out .. –

+0

Come nella classe Overlay correlata a questo problema - il mapView ei controlli dello zoom? – Ixx

-1

Implementare l'evento Touch sulla vista mappa. Funzionerà !!

// The onTouch event of the Map itself does not fire! 
    // We must implement it on the mapView!!! 
    mapView.setOnTouchListener(new OnTouchListener() 
    { 
     public boolean onTouch(View v, MotionEvent event) 
     { 
      // Your code and remember to return true!     

      return (true); 
     } 
    }); 
+0

doesnt work dude – Nezam

1

sottoclasse MapView e ignorare dispatchTouchEvent come sottostante e usa la sottoclasse invece.

public class MyMap extends MapView{ 
@Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     if (mOnMovedListener!= null) { 
       mOnMovedListener.onMove(ev); 
      } 
      return super.dispatchTouchEvent(ev); 
     } 
    private OnMovedListener mOnMovedListener; 

    public void setOnMovedListener(OnMovedListener mOnMovedListener) { 
     this.mOnMovedListener= mOnMovedListener; 
    } 
} 

registrati per ascoltatori come qualsiasi altro!

Problemi correlati