Intereting Posts
Android-анимация и аппаратные слои Как играть в icmp ping на android ListView с CHOICE_MODE_MULTIPLE с использованием CheckedText в пользовательском представлении SYSTEM_ALERT_WINDOW – как получить это разрешение автоматически на Android 6.0 и targetSdkVersion 23 Веб-просмотр Android и локальная хранилище Как установить минимальную дату DatePicker на текущую дату Ошибка FileProvider Проект ссылается на атрибуты RTL, но явно не включает и не отключает поддержку RTL RecyclerView и java.lang.IndexOutOfBoundsException: обнаружена несогласованность. Недопустимое положение держателя держателя виджетаViewHolder в устройствах Samsung LockCanvas () возвращает различные холсты Как удалить задачу из ScheduledExecutorService? EventBus, регистр и registerSticky метод Android: Как я могу сделать текстовые представления float слева? Кастинг и получение значений из набора даты и выбора времени в android Разницу и когда использовать getApplication (), getApplicationContext (), getBaseContext () и someClass.this

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

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

Solutions Collecting From Web of "Установка LongClickListener на карте Маркер"

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

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

 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 имитирует длинный клик)

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

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

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

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

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

Надеюсь, что мой обход помогает.

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

Взгляните на http://www.youtube.com/watch?v=RxAHHJD4nU8

Ответ 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.. } 

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

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

Эй Взгляните на этот код. Я просто остановил маркер от перетаскивания и использовал onMarkerDragStart длинного клика 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()); } });