30

GoogleMap bietet standardmäßig kein Ereignis für das Ziehen und Anhalten der Karte. I have already reported that problem here.Wie behandelt man das onTouch-Event für die Karte in Google Map API v2?

Ich möchte benutzerdefiniertehandler machen, die Ebene onTouch Ereignis verwenden und es mit setOnCameraChangeListener kombinieren.

Allerdings konnte ich nicht finden, wie ich auf onTouch Ereignis von GoogleMap Objekt zugreifen kann. Es bietet keine Rückruf.

Ich frage mich, wie kann ich onTouch Ereignis für Karte in Google Map API v2 behandeln? Hier

+0

was ist mit Overlays? Haben sie noch den onTouchEvent() Callback in API v2? –

+0

gibt es keine Überlagerung mehr. für marker und geometry objekt haben sie separate methoden eingeführt. –

+0

Warum verwenden Sie CameraChangeListener nicht? –

Antwort

40

ist eine mögliche Abhilfe für die Bestimmung Drag Start- und Reibungs Endereignisse:

Sie haben SupportMapFragment oder MapFragment zu verlängern. In onCreateView() müssen Sie Ihre in einem benutzerdefinierten FrameLayout (in Beispiel ist es die Klasse TouchableWrapper), in denen Sie Touch-Ereignisse abfangen und erkennen, ob die Karte abgegriffen wird oder nicht, wickeln. Wenn Ihr onCameraChange aufgerufen wird, überprüfen Sie einfach, ob die Kartenansicht gedrückt ist oder nicht (im Beispiel ist dies die Variable mMapIsTouched).

Beispielcode:

UPDATE 1:

  • return ursprüngliche erzeugte Ansicht in getView()
  • Verwendung dispatchTouchEvent() anstelle von onInterceptTouchEvent()

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

In Ihrem individuellen 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; 
} 

In Ihrer Kamera ändern Callback-Methode:

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

Hey @Alexey Zakharov, bitte auch einen Blick in den Thread bei Google Maps Issue Tracker: http://code.google.com/p/gmaps-api-issues/issues/detail?id=4636&q=apitype%3DAndroid2&sort= -modified & colspec = ID% 20Typ% 20Status% 20Eingeführt% 20Fixed% 20Zusammenfassung% 20Stars% 20ApiType% 20Internal% 20Modifiziert – AZ13

+0

@Alexey Zakharov Ich habe es versucht, aber ich bekomme Fehler: Der erste Fehler ist auf getActivity. könnten Sie Ihre angepasste MapFragment-Klassendeklaration posten? (oder ganzer Code) – Gaucho

+0

Hallo @ AZ13, könntest du meinen vorherigen Kommentar lesen? – Gaucho

0

Es ist ein einfacher Weg, dies zu tun, behandelt Ihre Fälle auf onCameraMoveStarted Zuhörern wie diese

Unter dem Code-Schnipsel

@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(); 
    } 
} 
Verwandte Themen