2010-09-08 20 views
6

Próbuję zaimplementować funkcję podwójnego dotknięcia zoomu w moim widoku mapy. Wydarzenie zawsze odpala za pierwszym razem, ale nigdy później. Poniżej znajduje się mój kod. Mam wrażenie, że ma to coś wspólnego z utratą kontroli nad mapą po pierwszym uruchomieniu zdarzenia.OnTouch w MapView uruchamia się tylko po raz pierwszy

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; 
    } 

    } 

Próbowałem również edycję metody OnTouch do oddania przychodzącego View do MapView, coraz kontroler gdy zdarzenie jest zwolniony. Jednak otrzymuję te same wyniki, gdy pierwsze zdarzenie jest uruchamiane, ale nie kolejne.

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; 
    } 

Będąc tak podstawowego, jak to możliwe, ja wyciąć cały kod w metodzie OnTouch i zaprogramować go po prostu wyświetla małą wiadomość toast.

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

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

     }  

     return true; 
} 

Działa to zgodnie z oczekiwaniami, wyświetlając tost za każdym razem, gdy dotykany jest MapView.

Nie rozumiem, dlaczego wydarzenie zostanie prawidłowo uruchomione w tym przypadku, ale nie we wcześniejszej implementacji.

Odpowiedz

0

Jak korzystać z GestureDetector.OnDoubleTapListener zamiast OnTouchListener?

+0

Dzięki za sugestię. Spróbuję zaimplementować OnDoubleTapListener do obsługi tej funkcji. Nadal jestem zdezorientowany. Rozumiem, że OnDoubleTapListener jest prawdopodobnie najlepszym sposobem na poradzenie sobie z tym, ale kod, który napisałem w teorii, powinien działać, prawda? – amandion

0

należy przynajmniej umieścić

lasttime=event.getEventTime(); 

pod

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

podczas onTouch wykryć ACTION_UP imprezę swojego kliknięcia. Za każdym razem, gdy klikniesz, jest to 2 razy

1

Miałem ten sam problem - nie mogłem przeciągać i przewijać mapy, ponieważ otrzymywałem tylko zdarzenia ACTION_DOWN. Można go rozwiązać, dodając android:clickable="true" do MapView lub dzwoniąc pod numer mapView.setClickable(true).

+0

nie, OnTouchListener + OnClickListener nie działa :( – djdance

15

Jeśli używasz tej metody "mapView.setBuiltInZoomControls(true);", Twój touch działa od razu.

Proszę wyjąć że linia i sprawdzić Jestem pewien, że zadziała ..

W niektórych przypadkach, jeśli chcesz BuiltInZoomControls wtedy możesz OnTouch metoda mapowania jak poniżej ..

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

To prawda, ale dlaczego zdarzenie dotykowe jest raz wywoływane? – Nik

+0

Nie marnowałem na to czasu, więc o tym nie wiem Nie sądzę, żebym potrzebował wbudowanego przyciskuZatowa przycisk mapa bcz już obsługuje multi-touch zoom i można również dodać niestandardowy przycisk do powiększania/pomniejszania .. –

+0

Jak w klasie nakładki związane z tym problemem - mapView i kontroli zoom? – Ixx

-1

Zamiast tego zaimplementuj zdarzenie dotykowe w widoku mapy. To zadziała!!

// 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

robi koleś pracy – Nezam

1

Podklasa MapView i zastąpić dispatchTouchEvent jak poniżej i używać zamiast podklasy.

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; 
    } 
} 

zarejestrować słuchacza jak każdy inny!

Powiązane problemy