30

GoogleMap domyślnie nie udostępnia zdarzenia dla rozpoczęcia przeciągania mapy i zatrzymywania przeciągania. I have already reported that problem here.Jak obsługiwać zdarzenie onTouch dla mapy w Google Map API v2?

Chcę, aby zwyczajhandler że będzie używać zwykłego onTouch zdarzenie i połączyć je z setOnCameraChangeListener.

Jednak nie udało mi się znaleźć sposobu uzyskania dostępu do obiektu onTouch obiektu GoogleMap. Nie zapewnia takiego wywołania oddzwonić.

Zastanawiam się, jak mogę obsłużyć zdarzenie onTouch na mapie w Google Map API v2?

+0

co z nakładkami? Czy nadal mają wywołania zwrotne onTouchEvent() w API v2? –

+0

nie ma już nakładki. dla obiektu markerowego i geometrycznego wprowadzili oddzielne metody. –

+0

dlaczego nie używasz CameraChangeListener? –

Odpowiedz

40

Oto możliwe obejście dla ustalania rozpoczęcia i zakończenia drag drag zdarzenia:

Trzeba rozszerzyć SupportMapFragment lub MapFragment. W onCreateView() musisz zawinąć swój MapView w niestandardowym FrameLayout (w przykładzie poniżej jest to klasa TouchableWrapper), w którym przechwytujesz zdarzenia dotykowe i rozpoznaje, czy mapa jest tapnięty, czy nie. Jeśli Twój telefon zadzwoni onCameraChange, po prostu sprawdź, czy widok mapy jest wciśnięty, czy nie (w przykładzie poniżej jest to zmienna mMapIsTouched).

Przykład Kod:

UPDATE 1:

  • powrotu oryginalny utworzony w widoku getView()
  • zastosowanie dispatchTouchEvent() zamiast onInterceptTouchEvent()

Dostosowane FrameLayout:

private class TouchableWrapper extends FrameLayout { 
    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     mMapIsTouched = true; 
     break; 

    case MotionEvent.ACTION_UP: 
     mMapIsTouched = false; 
     break; 
     } 

     return super.dispatchTouchEvent(ev); 
    } 
    } 

W dostosowanego MapFragment:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
    mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState); 

    mTouchView = new TouchableWrapper(getActivity()); 
    mTouchView.addView(mOriginalContentView); 

    return mTouchView; 
} 

@Override 
public View getView() { 
    return mOriginalContentView; 
} 

w aparacie metody zmiana callback:

private final OnCameraChangeListener mOnCameraChangeListener = new OnCameraChangeListener() { 
    @Override 
    public void onCameraChange(CameraPosition cameraPosition) { 
     if (!mMapIsTouched) { 
      refreshClustering(false); 
     } 
    } 
}; 
+1

Hej @Alexey Zakharov, zapoznaj się również z tematem śledzenia wątku w Google Maps: http://code.google.com/p/gmaps-api-issues/issues/detail?id=4636&q=apitype%3DAndroid2&sort= -modified & colspec = ID% 20Type% 20Status% 20Produkt% 20Poprawiono% 20Podsumowanie% 20Stars% 20ApiType% 20Internal% 20Modified – AZ13

+0

@Alexey Zakharov próbowałem, ale dostaję błędy: pierwszy błąd dotyczy getActivity. czy możesz opublikować niestandardową deklarację klasy MapFragment? (lub cały kod) – Gaucho

+0

Witam przy AZ13, czy mógłbyś przeczytać mój poprzedni komentarz? – Gaucho

0

istnieje prostszy sposób to zrobić, obsługiwać przypadki na onCameraMoveStarted słuchacza jak ten

Poniżej fragmentu kodu

@Override 
public void onCameraMoveStarted(int reason) { 
    if (reason == OnCameraMoveStartedListener.REASON_GESTURE) { 
     Toast.makeText(this, "The user gestured on the map.", 
         Toast.LENGTH_SHORT).show(); 
    } else if (reason == OnCameraMoveStartedListener 
          .REASON_API_ANIMATION) { 
     Toast.makeText(this, "The user tapped something on the map.", 
         Toast.LENGTH_SHORT).show(); 
    } else if (reason == OnCameraMoveStartedListener 
          .REASON_DEVELOPER_ANIMATION) { 
     Toast.makeText(this, "The app moved the camera.", 
         Toast.LENGTH_SHORT).show(); 
    } 
}