Google Maps API v2 newLatLngBounds, использующий процентное заполнение, выдает ошибку в многооконном режиме

#android #google-maps-android-api-2 #multi-window

#Android #google-maps-android-api-2 #многооконное

Вопрос:

Я анимирую камеру до a LatLngBounds с набором отступов, основанным на проценте устройства width , чтобы она работала на небольших устройствах.

Это работает даже на небольших устройствах с 4-дюймовыми дисплеями, однако это приводит к сбою в многооконном режиме в Android 7.0 и устройствах, которые поддерживают многооконный режим до этого, например. Galaxy S7.

Я получаю следующее исключение на устройствах в многооконном режиме:

 Fatal Exception: java.lang.IllegalStateException: Error using newLatLngBounds(LatLngBounds, int, int, int): View size is too small after padding is applied.
  

Вот подозрительный код:

 private void animateCamera() {

    // ...

    // Create bounds from positions
    LatLngBounds bounds = latLngBounds(positions);

    // Setup camera movement
    final int width = getResources().getDisplayMetrics().widthPixels;
    final int height = getResources().getDisplayMetrics().heightPixels;
    final int padding = (int) (width * 0.40); // offset from edges of the map in pixels
    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);

    mMap.animateCamera(cu);
}
  

Как я могу правильно настроить заполнение в newLatLngBounds для работы на всех ширинах устройства и в многооконном режиме?

Ответ №1:

Решение состоит в том, чтобы выбрать минимальный показатель между шириной и высотой, поскольку в многооконном режиме высота может быть меньше ширины:

 private void animateCamera() {

    // ...

    // Create bounds from positions
    LatLngBounds bounds = latLngBounds(positions);

    // Setup camera movement
    final int width = getResources().getDisplayMetrics().widthPixels;
    final int height = getResources().getDisplayMetrics().heightPixels;
    final int minMetric = Math.min(width, height);
    final int padding = (int) (minMetric * 0.40); // offset from edges of the map in pixels
    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);

    mMap.animateCamera(cu);
}