2013-03-13 3 views
12

есть способ установить longClickListsner на маркер на картах Google v2? Я хочу, чтобы пользователь долго нажимал на маркер и показывал диалоговое окно с возможностью удаления или просмотра информации. Это можно сделать?Настройка LongClickListener на карте Маркер

ответ

11

Класс маркера не имеет LongClickListener. Хотя этот подход далеко не идеален, здесь есть идея о том, что вы можете сделать.

Установите длинный клик для вашего объекта GoogleMap. При длительном нажатии проверьте, достаточно ли нажата позиция для любого из ваших маркеров. Чтобы решить этот порог близости, вы можете использовать уровень масштабирования карты.

Вот не очень хороший пример кода. Я не пробовал, но это может удовлетворить ваши потребности.

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

Это будет один способ, но его не дурак доказательство, потому что вы можете выбрать маркер, вы не хотите, и вы не будете знать, пока вы не удалите его – tyczj

+0

@tyczj Да, это не фол доказательство. Тем не менее, даже если маркер имел слушателя, ошибки были бы связаны, когда они были слишком близко. Имо, проверка ближайшего маркера не вызывает дополнительных проблем. В любом случае Misclicks, вы просто должны заставить пользователя подтвердить операцию. – akaya

15

У меня есть другое предложение.

Сначала я сделать маркер перемещаемый:

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

После того, как вы можете сделать слушатель setOnMarkerDragListener так:

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 

      } 
     }); 

И тогда вы можете переопределить, что вы хотите (обычно onMarkerDragStart имитировать длинный нажмите)

Надеюсь, это поможет

+0

Отлично! :))) – whiteLT

+0

Я пробовал это, но мой маркер меняет положение только на кране. Я не начал тащить его, просто коснулся его, и он изменился. Я не хочу этого делать. Можете ли вы предложить мне другой путь. –

+0

Я думаю, это потому, что маркер сосредоточен в точке, к которой вы прикасались. Я не знаю, есть ли решение для этого, извините. – ARP

3

ARP Ответ хорошо, но он страдает от уродливого эффекта: маркер сдвигается, когда вы начинаете перетаскивать, и когда вы заканчиваете маркер, все еще находится в более высоком положении, чем вы указываете пальцем.

Посмотрите на http://www.youtube.com/watch?v=RxAHHJD4nU8

5

По ARP предложил, вы можете использовать OnMarkerDragListener имитировать длинный щелчок. В моем случае, я создаю новые маркеры, когда onMapLongClick() произошло, так что я хотел сделать что-то подобное (но не равно), что

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

таким образом, вы будете удалить маркер, который ранее был в пределах карту и создать другую в том же положении, с тем же содержимым (у вас должна быть карта или пара, чтобы сохранить информацию от создаваемых вами маркеров).

Надеюсь, что это поможет.

1

akaya's answer не плохой подход, но если у вас есть com.google.maps.android:android-maps-utils:0.3+library included с вашим проектом вы можете быть точными о расстоянии:

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

Плохой подход, вы также должны уважать уровень масштабирования карты –

+0

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

0

Только в случае, если кто-то может понадобиться, я настроил логарифмическую функцию для вычисления порога близости @akaya упоминается, которая работает отлично подходит для зумирования между 5,0 и 18. Здесь функция:

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

Эй. Взгляните на этот код. Я только что остановил маркер от перетаскивания и использовал обнаружение длинного щелчка .

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

Вы можете позвонить слушателю вот так!

map.setOnMarkerDragListener(new LinkMarkerLongClickListener(markers) { 
      @Override 
      public void onLongClickListener(Marker marker) { 
       ToastUtils.showToast(Mission1Activity.this, marker.getTitle()); 
      } 
     }); 
Смежные вопросы