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
}
Другие вопросы по тегам