Вам слід використовувати CameraUpdate
клас для виконання (мабуть) усіх рухів програмної карти.
Для цього спочатку обчисліть межі всіх маркерів так:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Потім отримайте об’єкт опису руху за допомогою фабрики CameraUpdateFactory
::
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Нарешті перемістіть карту:
googleMap.moveCamera(cu);
Або якщо ви хочете анімацію:
googleMap.animateCamera(cu);
Це все :)
Роз'яснення 1
Майже всі методи руху вимагають, щоб Map
об’єкт пройшов процес компонування. Ви можете зачекати, коли це станеться за допомогою addOnGlobalLayoutListener
конструкції. Деталі можна знайти в коментарях до цієї відповіді та решти відповідей. Ви також можете знайти повний код для встановлення масштабу карти за допомогою addOnGlobalLayoutListener
тут .
Пояснення 2
В одному коментарі зазначається, що використання цього методу лише для одного маркера призводить до збільшення масштабу карти, встановленого на "химерний" рівень масштабування (який, на мою думку, є максимальним рівнем масштабування для даного місця розташування). Я думаю, що цього очікується тому, що:
LatLngBounds bounds
Примірник матиме northeast
властивість , рівне southwest
, а це означає , що частина площі землі , покритої цим bounds
точно дорівнює нулю. (Це логічно, оскільки один маркер не має площі.)
- Переходячи
bounds
до CameraUpdateFactory.newLatLngBounds
вас, по суті, вимагайте розрахунку такого масштабу, який bounds
(маючи нульову площу) охопить весь вид карти.
- Фактично цей розрахунок можна виконати на аркуші паперу. Теоретичний рівень масштабування, який відповідає, становить + + (позитивна нескінченність). На практиці
Map
об'єкт не підтримує це значення, тому він затиснутий на більш розумному максимальному рівні, дозволеному для даного місця.
Ще один спосіб сказати: як Map
об’єкт може знати, який рівень масштабування він повинен вибрати для одного місця ? Можливо, оптимальне значення має бути 20 (якщо воно представляє конкретну адресу). А може 11 (якщо це місто). А може, 6 (якщо вона представляє країну). API не такий розумний, і ви вирішувати рішення.
Отже, вам слід просто перевірити, чи markers
є лише одне місцезнаходження, і якщо так, скористайтеся одним із:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- перейдіть до положення маркера, залиште поточний рівень масштабування недоторканим.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- перейти до позиції маркера, встановити рівень масштабування довільно вибраного значення 12.