Подтвердить что ты не робот

Установка LongClickListener на карте Маркер

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

4b9b3361

Ответ 1

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

Сначала я делаю маркер перетаскиваемым:

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

После того, как вы можете сделать listener 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 имитирует длительный клик)

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

Ответ 2

Класс маркера не имеет 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;
                    }
                }

            }
        });

Ответ 3

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

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

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

Надеюсь, что мое обходное решение поможет.

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

На всякий случай кому-то это может понадобиться, я скорректировал логарифмическую функцию, чтобы вычислить порог близости @akaya, который отлично подходит для масштабирования между 5.0 и 18. Вот функция:

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