2013-03-13 13 views
12

Gibt es eine Möglichkeit, eine longClickListsner auf einem Marker auf Google Maps v2 zu setzen? Ich möchte den Benutzer lange auf den Marker drücken und eine Dialog-Show mit Optionen zum Löschen oder Anzeigen von Informationen haben. Kann das gemacht werden?Einstellen eines LongClickListener auf einer Karte Marker

Antwort

11

Markerklasse verfügt nicht über LongClickListener. Obwohl dieser Ansatz bei weitem nicht perfekt ist, ist hier eine Vorstellung davon, was Sie tun können.

Legen Sie einen Lang-Klick-Listener für Ihr GoogleMap-Objekt fest. Prüfen Sie bei einem langen Klick, ob die Position, auf die geklickt wurde, nah genug an einem Ihrer Marker ist. Um diese Annäherungsschwelle festzulegen, können Sie die Zoomstufe der Karte verwenden.

Hier ist der nicht so gute Beispielcode. Ich habe es nicht versucht, aber es kann Ihren Bedürfnissen entsprechen.

map.setOnMapLongClickListener(new OnMapLongClickListener() { 

      @Override 
      public void onMapLongClick(LatLng latLng) { 
       for(Marker marker : yourMarkerList) { 
        if(Math.abs(marker.getPosition().latitude - latLng.latitude) < 0.05 && Math.abs(marker.getPosition().longitude - latLng.longitude) < 0.05) { 
         Toast.makeText(MapActivity.this, "got clicked", Toast.LENGTH_SHORT).show(); //do some stuff 
         break; 
        } 
       } 

      } 
     }); 
+0

Das wäre ein Weg sein, aber es ist nicht narrensicher, weil Sie einen Marker auswählen könnten Sie nicht wollen, und Sie werden nicht wissen, bis Sie es @tyczj Ja löschen – tyczj

+0

, es Beweis nicht übel ist. Selbst wenn der Marker einen Listener hätte, wären Fehlschläge aufgetreten, wenn sie zu nahe beieinander liegen. Imo, die Suche nach dem nächsten Marker bringt keine zusätzlichen Probleme. Misclicks treten trotzdem auf, Sie müssen lediglich den Benutzer die Operation bestätigen lassen. – akaya

15

Ich habe einen anderen Vorschlag.

Zuerst stelle ich die Marker ziehbar:

mapa.addMarker(new MarkerOptions() ...  
     .setDraggable(true); 

Nachdem Sie einen Zuhörer setOnMarkerDragListener wie diese machen kann:

mapa.setOnMarkerDragListener(new OnMarkerDragListener() { 

      @Override 
      public void onMarkerDragStart(Marker marker) { 
       // TODO Auto-generated method stub 
       //Here your code 
      } 

      @Override 
      public void onMarkerDragEnd(Marker marker) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onMarkerDrag(Marker marker) { 
       // TODO Auto-generated method stub 

      } 
     }); 

Und dann können Sie außer Kraft setzen, dass Sie möchten (in der Regel onMarkerDragStart eine lange zu simulieren klick)

Hoffe es hilft

+0

Ausgezeichnet! :))) – whiteLT

+0

Ich habe das versucht, aber mein Marker ändert die Position nur am Tippen. Ich habe nicht begonnen, es zu ziehen, klopfe einfach darauf und es hat sich geändert. Ich möchte das nicht tun. Kannst du mir einen anderen Weg vorschlagen? –

+0

Ich denke, weil der Marker in dem Punkt zentriert ist, den Sie berührt haben. Ich weiß nicht, ob es dafür eine Lösung gibt, sorry. – ARP

3

ARP Die Antwort ist in Ordnung, aber es hat einen hässlichen Effekt: Der Marker verschiebt sich, wenn Sie anfangen zu ziehen und wenn Sie fertig sind, ist der Marker immer noch höher als Sie mit dem Finger zeigen.

Werfen Sie einen Blick auf http://www.youtube.com/watch?v=RxAHHJD4nU8

5

Als ARP vorgeschlagen, können Sie die OnMarkerDragListener den langen Klick simulieren können. In meinem Fall bin die Schaffung ich neuen Markers, wenn der onMapLongClick() aufgetreten ist, also wollte ich etwas ähnliches (aber nicht gleich), dass die

@Override 
public void onMarkerDragStart(Marker marker) { 
    marker.remove(); 
    MarkerOptions options = createBasedOnMarker(marker); 
    this.googleMap.addMarker(options); 
} 

diese Art und Weise tun, werden Sie die Markierung entfernen, die zuvor innerhalb dem war map and create an der gleichen Position, mit dem gleichen Inhalt (Sie müssen eine Karte oder ein Paar haben, um die Informationen von den Markierungen, die Sie erstellen, zu behalten).

Hope meine Abhilfe hilft.

1

akaya's answer ist kein schlechter Ansatz, aber wenn man die com.google.maps.android:android-maps-utils:0.3+library included mit Ihrem Projekt haben Sie können über die Entfernung genau sein:

double distance = SphericalUtil.computeDistanceBetween( 
    marker.getPosition(), 
    latLng 
); 
if(distance < 50) { // closer than 50 meters? 
    //..do stuff.. 
} 
+0

Es ist schlechte Ansatz, müssen Sie auch Karte Zoomstufe –

+0

Zoom-Independent respektieren. http://googlemaps.github.io/android-maps-utils/javadoc/com/google/maps/android/SphericalUtil.html#computeDistanceBetween-LatLng-LatLng- – flowtron

0

Nur falls jemand es brauchen kann, habe ich eine logarithmische Funktion eingestellt, um die Nähe Schwelle zu berechnen @akaya genannt, die für zoomt zwischen 5,0 und 18. Hier funktioniert gut ist die Funktion:

float zoom = mMap.getCameraPosition().zoom; 
double maxDistance = 2000000 * Math.exp(-0.644*zoom); 
2

Hey, schau dir diesen Code an Ich habe gerade den Marker gestoppt, als er gezogen wurde, und habe die's long click detection benutzt.

public abstract class LinkMarkerLongClickListener implements GoogleMap.OnMarkerDragListener { 

    private int previousIndex = -1; 

    private Marker cachedMarker = null; 
    private LatLng cachedDefaultPostion = null; 

    private List<Marker> markerList; 
    private List<LatLng> defaultPostions; 

    public LinkMarkerLongClickListener(List<Marker> markerList){ 
     this.markerList = new ArrayList<>(markerList); 
     defaultPostions = new ArrayList<>(markerList.size()); 
     for (Marker marker : markerList) { 
      defaultPostions.add(marker.getPosition()); 
      marker.setDraggable(true); 
     } 
    } 

    public abstract void onLongClickListener(Marker marker); 

    @Override 
    public void onMarkerDragStart(Marker marker) { 
     onLongClickListener(marker); 
     setDefaultPostion(markerList.indexOf(marker)); 
    } 

    @Override 
    public void onMarkerDrag(Marker marker) { 
     setDefaultPostion(markerList.indexOf(marker)); 
    } 

    @Override 
    public void onMarkerDragEnd(Marker marker) { 
     setDefaultPostion(markerList.indexOf(marker)); 
    } 


    private void setDefaultPostion(int markerIndex) { 
     if(previousIndex == -1 || previousIndex != markerIndex){ 
      cachedMarker = markerList.get(markerIndex); 
      cachedDefaultPostion = defaultPostions.get(markerIndex); 
      previousIndex = markerIndex; 
     } 
     cachedMarker.setPosition(cachedDefaultPostion); 
    } 
} 

Sie können den Hörer so nennen!

map.setOnMarkerDragListener(new LinkMarkerLongClickListener(markers) { 
      @Override 
      public void onLongClickListener(Marker marker) { 
       ToastUtils.showToast(Mission1Activity.this, marker.getTitle()); 
      } 
     }); 
Verwandte Themen