Вы должны использовать 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.
addOnGlobalLayoutListener()
илиpost()
с соответствующимRunnable
. Именно поэтому невозможно получить координаты экрана маркераonCreate
- см. Stackoverflow.com/q/14429877/1820695 Однако вы можете использовать некоторые методы даже до того, как разметка произошла - например.CameraUpdateFactory.newLatLngBounds()
с 4 парам .Google Map V2
Следующее решение работает для Android Marshmallow 6 (API 23, API 24, API 25, API 26, API 27, API 28). Это также работает в Xamarin.
источник
Так
например, ваша карта Google находится внутри RelativeLayout:
источник
Я не мог использовать onGlobalLayoutlistener, поэтому вот еще одно решение для предотвращения
"Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions."
ошибки:источник
Из этого кода я отображаю несколько маркеров с определенным увеличением на экране карты.
// Объявленные переменные
// Метод добавления нескольких точек маркера с помощью нарисованного значка
// Для добавления нескольких маркеров, видимых на карте
источник
Примечание. Это не решение исходного вопроса. Это решение одной из подзадач, обсужденных выше .
Решение для @andr Clarification 2 -
Это действительно проблематично, когда в границах есть только один маркер, и из-за этого уровень масштабирования установлен на очень высокий уровень ( уровень 21 ). И Google не предоставляет никакого способа установить максимальный уровень масштабирования в этой точке. Это также может произойти, когда есть более 1 маркера, но все они довольно близко друг к другу. Тогда также возникнет та же проблема.
Решение - Предположим, вы хотите, чтобы ваша Карта никогда не превышала 16-кратный уровень масштабирования. Затем после выполнения -
Проверьте, не превысил ли ваш уровень масштабирования уровень 16 (или что вы хотите) -
И если этот уровень больше 16, что будет только в том случае, если маркеров очень мало или все маркеры расположены очень близко друг к другу, просто уменьшите масштаб карты в этой конкретной позиции, установив уровень масштабирования 16.
Таким образом, у вас никогда не возникнет проблема «странного» уровня масштабирования, который также очень хорошо объясняется @andr.
источник
это поможет .. из демо Google Apis
для ясной информации посмотрите на этот URL. https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java
источник
У меня была похожая проблема, с помощью следующего кода решена проблема:
CameraUpdateFactory.newLatLngBounds(bounds, 200, 200, 5)
как правило, различия в расположении в моем случае не более двух соседних городов.увеличить, чтобы уместить все маркеры на карте google maps v2
источник
Показать все маркеры на карте Google
В этих методах хранить все маркеры и автоматически масштабировать, чтобы показать все маркеры на карте Google.
источник
Используйте метод "getCenterCoordinate", чтобы получить координату центра и использовать в CameraPosition.
источник
У меня есть еще один способ сделать то же самое, что работает отлично. так что идея показать все маркеры на экране, нам нужен центр по длине и уровень масштабирования. вот функция, которая даст вам оба и потребует в качестве входных данных все объекты Latlng маркера.
Эта функция возвращает объект Pair, который вы можете использовать как
Вы можете вместо того, чтобы использовать отступы, чтобы убрать маркеры от границ экрана, вы можете настроить масштабирование на -1.
источник
http://i64.tinypic.com/2qjybh4.png
http://i63.tinypic.com/flzwus.png
http://i63.tinypic.com/112g5fm.png
источник