Android Получить маркеры, которые не кластеризованы
Я занимаюсь разработкой приложения для Android и использую библиотеку Google Maps Android API Utility.
Чтобы быть более конкретным, я использую кластерную часть этой библиотеки. Теперь на мой вопрос:
Меня интересуют маркеры, которые отображаются на карте, но в настоящее время не сгруппированы. Я пробовал разные вещи, но не могу обернуть голову вокруг этого. Идея такого рода работы заключается в том, чтобы сохранить все визуализированные элементы маркеров в массиве списков, а затем сравнить позиции маркеров с границами LatLng карты на экране. Если маркеры находятся внутри границ экрана, то информация о маркерах будет добавлена в другой массив. позже будет показан в виде списка. Проблема заключается в том, что при уменьшении масштаба маркеры все еще находятся в массиве renderedPersonItems и будут отображаться в виде списка, даже если эти маркеры теперь кластеризованы. Я не могу очистить массив RenderedPersonItems, потому что маркеры отображаются только один раз в жизненном цикле. Поэтому я ищу другое решение. Это то, что я получил так далеко:
Код в DefaultClusterRenderer:
@Override
protected void onBeforeClusterItemRendered(PersonItem personItem, MarkerOptions markerOptions){
markerOptions.title(personItem.personName);
if(!renderedPersonItems.contains(personItem)){
renderedPersonItems.add(personItem);
}
}
Код в основной деятельности:
LatLngBounds personOnScreenBounds = googleMap.getProjection().getVisibleRegion().latLngBounds;
for(PersonItem person : clusterPersonRenderer.getRenderedPersonItems()){
if(PersonsOnScreenBounds.contains(person.getPosition())){
personMarksOnScreen.add(getPersonObjectWithId(person.personId));
}
}
Заранее спасибо!
2 ответа
Я могу порекомендовать вам еще одну классную библиотеку android-map. Расширения карт Android https://github.com/mg6maciej/android-maps-extensions
Я использую это в моем приложении, и это выглядит хорошо. Может быть нелегко переопределить его в вашем приложении, но вы можете попробовать.
Чтобы решить вашу проблему, вы можете сделать что-то вроде этого:
List<Marker> markers = mMap.getDisplayedMarkers();
for (Marker marker : markers) {
if(!marker.isCluster()) {
//
}
}
Если вы хотите выполнять разные задачи, вы можете создавать разные события onClick для кластерных и отдельных маркеров:
Этот метод будет обрабатывать клики по кластерным элементам
public boolean onClusterClick(Cluster<Person> cluster) {
// Show a toast with some info when the cluster is clicked.
Toast.makeText(getActivity(), cluster.getSize() + " (including " + itemText + ")", Toast.LENGTH_SHORT).show();
return true;
}
И этот метод будет обрабатывать события onClick, если маркер не кластеризован (имеет один элемент)
public boolean onClusterItemClick(Person item) {
// Handles events for single markers
String text = item.text;
return true
}