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