Intereting Posts
Можно ли предлагать маршруты с Google Maps в приложении android2.2? Android-устройство, не получающее многоадресный пакет Проблема с подключением Bluetooth для Android Почему добавление OnClickListener внутри onBindViewHolder из RecyclerView.Adapter считается плохой практикой? Как преобразовать весь контент в scrollview в растровое изображение? Ошибка Eclipse: анализ ошибок … \ android-22 \ android-wear \ armeabi-v7a \ devices.xml Android Google Play Предупреждение: Уязвимость SSL-обработчика ошибок Какой размер должен иметь значок в alertdialog? Как сделать веб-сервис ASP.NET Web API доступным в локальной сети Как определить ориентацию по умолчанию для кадров предварительного просмотра камеры? InflateException: двоичная строка XML-файла # 22: ошибка раздувания класса <unknown> «Не удалось инициализировать SDK App Engine на пути (пути)» на eclipse 4.2.2 с использованием Mac OSX Mountain Lion Android и (миллионы) push-уведомлений Сенсорное обнаружение на полилинии в Google Maps API Android v2 Я не хочу, чтобы Android автоматически менял размер растрового изображения

Установка 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()); } });