Как «увеличить» размер VisibleRegion на Google Maps Android - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь установить видимые маркеры, когда они находятся внутри видимой области экрана. На данный момент я могу достичь:

this.googleMap.setOnCameraIdleListener {
    val bounds = this.googleMap.projection.visibleRegion.latLngBounds
    for (marker in this.markersUpForList) {
        if (bounds.contains(marker.position)) {
          marker.isVisible = true
        //... do more stuff
        } else {
          marker.isVisible = false
        }
    }
}

Но мне нужно загрузить маркеры немного «далеко» от этой видимой области, чтобы «предотвратить», когда пользователь делает некоторую прокрутку. Мы предполагаем, что если пользователь прокручивает страницу далеко, маркеры «появятся позже».

Так что мой вопрос в том, как рассчитать это «лишнее» пространство. Я не знаю, например, добавить ли десятичные дроби к латинской юго-западной / северо-восточной точке или мне нужна какая-то конкретная математика

enter image description here

1 Ответ

1 голос
/ 16 мая 2019

Для увеличения размера bounds вы можете использовать Аффинное преобразование (масштаб), например. как в этом методе:

private static LatLngBounds scaleBounds(LatLngBounds bounds, float scale, Projection projection) {
    LatLng center = bounds.getCenter();
    Point centerPoint = projection.toScreenLocation(center);

    Point screenPositionNortheast = projection.toScreenLocation(bounds.northeast);
    screenPositionNortheast.x = (int) (scale * (screenPositionNortheast.x - centerPoint.x) + centerPoint.x);
    screenPositionNortheast.y = (int) (scale * (screenPositionNortheast.y - centerPoint.y) + centerPoint.y);
    LatLng scaledNortheast = projection.fromScreenLocation(screenPositionNortheast);

    Point screenPositionSouthwest = projection.toScreenLocation(bounds.southwest);
    screenPositionSouthwest.x = (int) (scale * (screenPositionSouthwest.x - centerPoint.x) + centerPoint.x);
    screenPositionSouthwest.y = (int) (scale * (screenPositionSouthwest.y - centerPoint.y) + centerPoint.y);
    LatLng scaledSouthwest = projection.fromScreenLocation(screenPositionSouthwest);

    LatLngBounds scaledBounds = new LatLngBounds(scaledSouthwest, scaledNortheast);

    return scaledBounds;
}

И вы можете использовать его следующим образом:

...
val scaleFactor = 1.5f;  // increase size 1.5 times
val bounds = projection.getVisibleRegion().latLngBounds;
val scaledBounds = scaleBounds(bounds, scaleFactor, projection);

for (marker in this.markersUpForList) {
    if (scaledBounds .contains(marker.position)) {
      marker.isVisible = true
    //... do more stuff
    } else {
      marker.isVisible = false
    }
}
...