Вы должны использовать 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.