Карты в Maps SDK для Android можно наклонять и поворачивать с помощью простых жестов, что дает пользователям возможность настраивать карту в удобном для них направлении. При любом уровне масштабирования вы можете перемещать карту или изменять ее перспективу с очень небольшой задержкой благодаря меньшему размеру фрагментов векторной карты.
Примеры кода
Репозиторий ApiDemos на GitHub включает образец, демонстрирующий возможности камеры:
- CameraDemoActivity — Java : изменение положения камеры
- CameraDemoActivity — Kotlin : изменение положения камеры
Введение
Как и Google Maps в Интернете, Maps SDK для Android представляет поверхность мира (сферу) на экране вашего устройства (плоскую плоскость) с помощью проекции Меркатора . В восточном и западном направлении карта бесконечно повторяется, поскольку мир плавно закручивается сам по себе. В северном и южном направлениях карта ограничена примерно 85 градусами северной широты и 85 градусами южной широты.
Примечание. Проекция Меркатора имеет конечную ширину в продольном направлении, но бесконечную высоту в широтном направлении. Мы «обрезаем» изображения базовой карты, используя проекцию Меркатора, примерно на +/- 85 градусов, чтобы сделать результирующую форму карты квадратной, что упрощает логику выбора фрагментов.
Maps SDK для Android позволяет изменить точку зрения пользователя на карту, изменив камеру карты.
Изменения в камере не повлияют на маркеры, наложения или другую графику, которую вы добавили, хотя вы можете изменить свои добавления, чтобы они лучше соответствовали новому виду.
Поскольку вы можете прослушивать жесты пользователя на карте, вы можете изменять карту в ответ на запросы пользователей. Например, метод обратного вызова OnMapClickListener.onMapClick()
реагирует на одно касание карты. Поскольку метод получает широту и долготу места касания, вы можете отреагировать, перемещаясь или приближаясь к этой точке. Аналогичные методы доступны для реагирования на нажатия на всплывающее окно маркера или на жест перетаскивания маркера.
Вы также можете прослушивать движения камеры, чтобы ваше приложение получало уведомление, когда камера начинает двигаться, движется в данный момент или прекращает движение. Подробнее см. в руководстве по событиям смены камеры .
Положение камеры
Вид карты моделируется как камера , смотрящая вниз на плоскую плоскость. Положение камеры (и, следовательно, рендеринг карты) определяется следующими свойствами: target (широта/долгота местоположения) , азимут , наклон и масштабирование .

Цель (местоположение)
Целью камеры является местоположение центра карты, указанное в виде координат широты и долготы.
Широта может быть от -85 до 85 градусов включительно. Значения выше или ниже этого диапазона будут привязаны к ближайшему значению в этом диапазоне. Например, при указании широты 100 будет установлено значение 85. Долгота находится в диапазоне от -180 до 180 градусов включительно. Значения выше или ниже этого диапазона будут перенесены таким образом, чтобы они попадали в диапазон (-180, 180). Например, 480, 840 и 1200 будут развернуты на 120 градусов.Подшипник (ориентация)
Азимут камеры указывает направление по компасу, измеренное в градусах от истинного севера, соответствующее верхнему краю карты. Если провести вертикальную линию от центра карты к верхнему краю карты, азимут будет соответствовать направлению камеры (измеряется в градусах) относительно истинного севера.
Азимут 0 означает, что верхняя часть карты указывает на истинный север. Значение азимута 90 означает, что верхняя часть карты указывает строго на восток (90 градусов по компасу). Значение 180 означает, что верхняя часть карты указывает строго на юг.
Maps API позволяет изменить азимут карты. Например, водитель автомобиля часто поворачивает дорожную карту, чтобы совместить ее с направлением движения, в то время как туристы, использующие карту и компас, обычно ориентируют карту так, чтобы вертикальная линия указывала на север.
Наклон (угол обзора)
Наклон определяет положение камеры на дуге непосредственно над положением центра карты, измеренное в градусах от надира (направление, указывающее прямо под камерой). Значение 0 соответствует камере, направленной прямо вниз. Значения больше 0 соответствуют камере, наклоненной к горизонту на указанное число градусов. При изменении угла обзора карта отображается в перспективе, при этом удаленные объекты кажутся меньше, а близлежащие — крупнее. Следующие иллюстрации демонстрируют это.
На изображениях ниже угол обзора равен 0 градусов. На первом изображении показана схема этого; позиция 1 — это позиция камеры, а позиция 2 — текущая позиция на карте. Получившаяся карта показана под ней.
![]() | ![]() |
На изображениях ниже угол обзора составляет 45 градусов. Обратите внимание, что камера перемещается на полпути по дуге между прямо над головой (0 градусов) и землей (90 градусов) в положение 3 . Камера по-прежнему указывает на центральную точку карты, но область, представленная линией в позиции 4 , теперь видна.
![]() | ![]() |
Карта на этом снимке экрана по-прежнему сосредоточена в той же точке, что и на исходной карте, но в верхней части карты появилось больше функций. Когда вы увеличиваете угол свыше 45 градусов, объекты между камерой и положением на карте кажутся пропорционально больше, в то время как объекты за пределами положения карты кажутся пропорционально меньше, создавая трехмерный эффект.
Увеличить
Уровень масштабирования камеры определяет масштаб карты. При больших уровнях масштабирования на экране можно увидеть больше деталей, а при меньших уровнях масштабирования на экране можно увидеть большую часть мира. При уровне масштабирования 0 масштаб карты таков, что весь мир имеет ширину примерно 256 dp ( пикселей, не зависящих от плотности ).
Увеличение уровня масштабирования на 1 удваивает ширину мира на экране. Следовательно, при уровне масштабирования N ширина мира составляет примерно 256 * 2 N dp. Например, при уровне масштабирования 2 весь мир имеет ширину примерно 1024 dp.
Уровень масштабирования не обязательно должен быть целым числом. Диапазон уровней масштабирования, разрешенных картой, зависит от ряда факторов, включая цель, тип карты и размер экрана. Любое число вне диапазона будет преобразовано в ближайшее допустимое значение, которое может быть минимальным или максимальным уровнем масштабирования. В следующем списке показан приблизительный уровень детализации, который вы можете ожидать при каждом уровне масштабирования:
- 1: Мир
- 5: Суша/континент
- 10: Город
- 15: Улицы
- 20: Здания
![]() | ![]() | ![]() |
Перемещение камеры
Maps API позволяет вам изменить, какая часть мира отображается на карте. Это достигается изменением положения камеры (в отличие от перемещения карты).
Когда вы меняете камеру, у вас есть возможность анимировать результирующее движение камеры. Анимация интерполирует текущие атрибуты камеры и новые атрибуты камеры. Вы также можете контролировать продолжительность анимации.
Чтобы изменить положение камеры, вы должны указать, куда вы хотите переместить камеру, используя CameraUpdate
. Maps API позволяет создавать различные типы CameraUpdate
с помощью CameraUpdateFactory
. Доступны следующие варианты:
Изменение уровня масштабирования и установка минимального/максимального масштабирования
CameraUpdateFactory.zoomIn()
и CameraUpdateFactory.zoomOut()
дают вам CameraUpdate
, который изменяет уровень масштабирования на 1,0, сохраняя при этом все остальные свойства прежними.
CameraUpdateFactory.zoomTo(float)
дает вам CameraUpdate
, который изменяет уровень масштабирования на заданное значение, сохраняя при этом все остальные свойства такими же.
CameraUpdateFactory.zoomBy(float)
и CameraUpdateFactory.zoomBy(float, Point)
дают вам CameraUpdate
, который увеличивает (или уменьшает, если значение отрицательное) уровень масштабирования на заданное значение. Последний фиксирует заданную точку на экране таким образом, что она остается в одном и том же месте (широта/долгота), и поэтому он может изменить местоположение камеры для достижения этой цели.
Возможно, вам будет полезно установить предпочтительный минимальный и/или максимальный уровень масштабирования. Например, это полезно для управления взаимодействием с пользователем, если ваше приложение показывает определенную область вокруг точки интереса или если вы используете настраиваемое наложение плитки с ограниченным набором уровней масштабирования.
Джава
private GoogleMap map; map.setMinZoomPreference(6.0f); map.setMaxZoomPreference(14.0f);
Котлин
private lateinit var map: GoogleMap map.setMinZoomPreference(6.0f) map.setMaxZoomPreference(14.0f)
Обратите внимание, что существуют технические соображения, которые могут помешать API разрешить пользователям уменьшать или увеличивать масштаб. Например, спутник или местность могут иметь меньший максимальный масштаб, чем плитки базовой карты.
Изменение положения камеры
Есть два удобных метода для обычных изменений положения. CameraUpdateFactory.newLatLng(LatLng)
предоставляет CameraUpdate
, который изменяет широту и долготу камеры, сохраняя при этом все остальные свойства. CameraUpdateFactory.newLatLngZoom(LatLng, float)
дает вам CameraUpdate
, который изменяет широту, долготу и масштаб камеры, сохраняя при этом все остальные свойства.
Для полной гибкости при изменении положения камеры используйте CameraUpdateFactory.newCameraPosition(CameraPosition)
, который дает вам CameraUpdate
, перемещающий камеру в заданное положение. CameraPosition
можно получить либо напрямую, используя new CameraPosition()
, либо с помощью CameraPosition.Builder
используя new CameraPosition.Builder()
.
Панорамирование (прокрутка)
CameraUpdateFactory.scrollBy(float, float)
дает вам CameraUpdate
, который изменяет широту и долготу камеры таким образом, что карта перемещается на указанное количество пикселей. Положительное значение x заставляет камеру двигаться вправо, так что карта кажется сдвинутой влево. Положительное значение y заставляет камеру двигаться вниз, так что карта кажется сдвинутой вверх. И наоборот, отрицательные значения x заставляют камеру двигаться влево, так что карта кажется сдвинутой вправо, а отрицательные значения y заставляют камеру двигаться вверх. Прокрутка осуществляется относительно текущей ориентации камеры. Например, если камера имеет азимут 90 градусов, то восток находится «вверху».
Установка границ
Установка границ карты
Иногда бывает полезно переместить камеру так, чтобы вся интересующая область была видна при максимально возможном увеличении. Например, если вы показываете все заправочные станции в пределах пяти миль от текущего положения пользователя, вы можете переместить камеру так, чтобы все они были видны на экране. Для этого сначала рассчитайте LatLngBounds
, которые вы хотите видеть на экране. Затем вы можете использовать CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding)
, чтобы получить CameraUpdate
, который изменяет положение камеры таким образом, что заданный LatLngBounds
полностью помещается в пределах карты с учетом указанного заполнения (в пикселях). Возвращаемый объект CameraUpdate
гарантирует, что зазор (в пикселях) между заданными границами и краем карты будет как минимум равен указанному отступу. Обратите внимание, что наклон и азимут карты будут равны 0.
Джава
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0));
Котлин
val australiaBounds = LatLngBounds( LatLng((-44.0), 113.0), // SW bounds LatLng((-10.0), 154.0) // NE bounds ) map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0))
Центрирование карты в пределах области
В некоторых случаях вы можете захотеть центрировать камеру в пределах границ вместо того, чтобы включать крайние границы. Например, чтобы центрировать камеру на стране, сохраняя постоянный зум. В этом случае вы можете использовать аналогичный метод, создав LatLngBounds
и используя CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom)
с LatLngBounds
. Метод getCenter()
. Метод getCenter() возвращает географический центр LatLngBounds
.
Джава
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.getCenter(), 10));
Котлин
val australiaBounds = LatLngBounds( LatLng((-44.0), 113.0), // SW bounds LatLng((-10.0), 154.0) // NE bounds ) map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.center, 10f))
Перегрузка метода newLatLngBounds(boundary, width, height, padding)
позволяет указать ширину и высоту в пикселях для прямоугольника с намерением, чтобы они соответствовали размерам карты. Прямоугольник располагается так, чтобы его центр совпадал с центром вида карты (так что, если заданные размеры совпадают с размерами вида карты, прямоугольник совпадал с видом карты). Возвращенный CameraUpdate
будет перемещать камеру таким образом, чтобы указанные LatLngBounds
были центрированы на экране в пределах заданного прямоугольника при максимально возможном уровне масштабирования с учетом требуемого заполнения.
Примечание. Используйте более простой метод newLatLngBounds(boundary, padding)
для создания CameraUpdate
только в том случае, если он будет использоваться для перемещения камеры после того, как карта подверглась компоновке. Во время компоновки API вычисляет границы отображения карты, необходимые для правильного проецирования ограничивающей рамки. Для сравнения, вы можете использовать CameraUpdate
, возвращаемый более сложным методом newLatLngBounds(boundary, width, height, padding)
в любое время, даже до того, как карта подверглась компоновке, потому что API вычисляет границы отображения на основе переданных вами аргументов.
Ограничение панорамирования пользователя определенной областью
В приведенных выше сценариях вы устанавливаете границы карты, но затем пользователь может прокручивать или перемещаться за пределами этих границ. Вместо этого вы можете захотеть ограничить границы центра широты/долготы фокальной точки карты (цели камеры), чтобы пользователи могли прокручивать и панорамировать только в пределах этих границ. Например, розничное приложение для торгового центра или аэропорта может захотеть ограничить карту определенными границами, позволяя пользователям прокручивать и перемещаться в этих границах.
Джава
// Create a LatLngBounds that includes the city of Adelaide in Australia. LatLngBounds adelaideBounds = new LatLngBounds( new LatLng(-35.0, 138.58), // SW bounds new LatLng(-34.9, 138.61) // NE bounds ); // Constrain the camera target to the Adelaide bounds. map.setLatLngBoundsForCameraTarget(adelaideBounds);
Котлин
// Create a LatLngBounds that includes the city of Adelaide in Australia. val adelaideBounds = LatLngBounds( LatLng(-35.0, 138.58), // SW bounds LatLng(-34.9, 138.61) // NE bounds ) // Constrain the camera target to the Adelaide bounds. map.setLatLngBoundsForCameraTarget(adelaideBounds)
На следующей диаграмме показан сценарий, когда цель камеры ограничена областью, немного превышающей область просмотра. Пользователь может прокручивать и панорамировать при условии, что цель камеры остается в пределах ограниченной области. Крест представляет цель камеры:
Карта всегда заполняет окно просмотра, даже если это приводит к тому, что в окне просмотра отображаются области, выходящие за определенные границы. Например, если вы поместите цель камеры в угол ограниченной области, область за углом будет видна в окне просмотра, но пользователи не смогут прокручивать дальше эту область. Следующая диаграмма иллюстрирует этот сценарий. Крест представляет цель камеры:
На следующей диаграмме цель камеры имеет очень ограниченные границы, что дает пользователю очень мало возможностей для прокрутки или панорамирования карты. Крест представляет цель камеры:
Обновление вида камеры
Чтобы применить CameraUpdate
к карте, вы можете либо мгновенно переместить камеру, либо плавно анимировать камеру. Чтобы мгновенно переместить камеру с заданным CameraUpdate
, вы можете вызвать GoogleMap.moveCamera(CameraUpdate)
.
Вы можете сделать работу пользователя более приятной, особенно для коротких перемещений, анимировав изменение. Для этого вместо вызова GoogleMap.moveCamera
вызовите GoogleMap.animateCamera
. Карта плавно перейдет к новым атрибутам. Наиболее подробная форма этого метода, GoogleMap.animateCamera(cameraUpdate, duration, callback)
, предлагает три аргумента:
-
cameraUpdate
-
CameraUpdate
, описывающий, куда переместить камеру. -
callback
- Объект, реализующий
GoogleMap.CancellableCallback
. Этот обобщенный интерфейс для обработки задач определяет два метода onCancel() и onFinished(). Для анимации методы вызываются в следующих случаях:-
onFinish()
- Вызывается, если анимация завершается без прерывания.
-
onCancel()
Вызывается, если анимация прерывается вызовом
stopAnimation()
или запуском нового движения камеры.Кроме того, это также может произойти, если вы вызываете
GoogleMap.stopAnimation()
.
-
-
duration
- Желаемая продолжительность анимации в миллисекундах в виде
int
.
Следующие фрагменты кода иллюстрируют некоторые распространенные способы перемещения камеры.
Джава
LatLng sydney = new LatLng(-33.88,151.21); LatLng mountainView = new LatLng(37.4, -122.1); // Move the camera instantly to Sydney with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomIn()); // Zoom out to zoom level 10, animating with a duration of 2 seconds. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); // Construct a CameraPosition focusing on Mountain View and animate the camera to that position. CameraPosition cameraPosition = new CameraPosition.Builder() .target(mountainView ) // Sets the center of the map to Mountain View .zoom(17) // Sets the zoom .bearing(90) // Sets the orientation of the camera to east .tilt(30) // Sets the tilt of the camera to 30 degrees .build(); // Creates a CameraPosition from the builder map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
Котлин
val sydney = LatLng(-33.88, 151.21) val mountainView = LatLng(37.4, -122.1) // Move the camera instantly to Sydney with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15f)) // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomIn()) // Zoom out to zoom level 10, animating with a duration of 2 seconds. map.animateCamera(CameraUpdateFactory.zoomTo(10f), 2000, null) // Construct a CameraPosition focusing on Mountain View and animate the camera to that position. val cameraPosition = CameraPosition.Builder() .target(mountainView) // Sets the center of the map to Mountain View .zoom(17f) // Sets the zoom .bearing(90f) // Sets the orientation of the camera to east .tilt(30f) // Sets the tilt of the camera to 30 degrees .build() // Creates a CameraPosition from the builder map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
Карты в Maps SDK для Android можно наклонять и поворачивать с помощью простых жестов, что дает пользователям возможность настраивать карту в удобном для них направлении. При любом уровне масштабирования вы можете перемещать карту или изменять ее перспективу с очень небольшой задержкой благодаря меньшему размеру фрагментов векторной карты.
Примеры кода
Репозиторий ApiDemos на GitHub включает образец, демонстрирующий возможности камеры:
- CameraDemoActivity — Java : изменение положения камеры
- CameraDemoActivity — Kotlin : изменение положения камеры
Введение
Как и Google Maps в Интернете, Maps SDK для Android представляет поверхность мира (сферу) на экране вашего устройства (плоскую плоскость) с помощью проекции Меркатора . В восточном и западном направлении карта бесконечно повторяется, поскольку мир плавно закручивается сам по себе. В северном и южном направлениях карта ограничена примерно 85 градусами северной широты и 85 градусами южной широты.
Примечание. Проекция Меркатора имеет конечную ширину в продольном направлении, но бесконечную высоту в широтном направлении. Мы «обрезаем» изображения базовой карты, используя проекцию Меркатора, примерно на +/- 85 градусов, чтобы сделать результирующую форму карты квадратной, что упрощает логику выбора фрагментов.
Maps SDK для Android позволяет изменить точку зрения пользователя на карту, изменив камеру карты.
Изменения в камере не повлияют на маркеры, наложения или другую графику, которую вы добавили, хотя вы можете изменить свои добавления, чтобы они лучше соответствовали новому виду.
Поскольку вы можете прослушивать жесты пользователя на карте, вы можете изменять карту в ответ на запросы пользователей. Например, метод обратного вызова OnMapClickListener.onMapClick()
реагирует на одно касание карты. Поскольку метод получает широту и долготу места касания, вы можете отреагировать, перемещаясь или приближаясь к этой точке. Аналогичные методы доступны для реагирования на нажатия на всплывающее окно маркера или на жест перетаскивания маркера.
Вы также можете прослушивать движения камеры, чтобы ваше приложение получало уведомление, когда камера начинает двигаться, движется в данный момент или прекращает движение. Подробнее см. в руководстве по событиям смены камеры .
Положение камеры
Вид карты моделируется как камера , смотрящая вниз на плоскую плоскость. Положение камеры (и, следовательно, рендеринг карты) определяется следующими свойствами: target (широта/долгота местоположения) , азимут , наклон и масштабирование .

Цель (местоположение)
Целью камеры является местоположение центра карты, указанное в виде координат широты и долготы.
Широта может быть от -85 до 85 градусов включительно. Значения выше или ниже этого диапазона будут привязаны к ближайшему значению в этом диапазоне. Например, при указании широты 100 будет установлено значение 85. Долгота находится в диапазоне от -180 до 180 градусов включительно. Значения выше или ниже этого диапазона будут перенесены таким образом, чтобы они попадали в диапазон (-180, 180). Например, 480, 840 и 1200 будут развернуты на 120 градусов.Подшипник (ориентация)
Азимут камеры указывает направление по компасу, измеренное в градусах от истинного севера, соответствующее верхнему краю карты. Если провести вертикальную линию от центра карты к верхнему краю карты, азимут будет соответствовать направлению камеры (измеряется в градусах) относительно истинного севера.
Азимут 0 означает, что верхняя часть карты указывает на истинный север. Значение азимута 90 означает, что верхняя часть карты указывает строго на восток (90 градусов по компасу). Значение 180 означает, что верхняя часть карты указывает строго на юг.
Maps API позволяет изменить азимут карты. Например, водитель автомобиля часто поворачивает дорожную карту, чтобы совместить ее с направлением движения, в то время как туристы, использующие карту и компас, обычно ориентируют карту так, чтобы вертикальная линия указывала на север.
Наклон (угол обзора)
Наклон определяет положение камеры на дуге непосредственно над положением центра карты, измеренное в градусах от надира (направление, указывающее прямо под камерой). Значение 0 соответствует камере, направленной прямо вниз. Значения больше 0 соответствуют камере, наклоненной к горизонту на указанное число градусов. При изменении угла обзора карта отображается в перспективе, при этом удаленные объекты кажутся меньше, а близлежащие — крупнее. Следующие иллюстрации демонстрируют это.
На изображениях ниже угол обзора равен 0 градусов. На первом изображении показана схема этого; позиция 1 — это позиция камеры, а позиция 2 — текущая позиция на карте. Получившаяся карта показана под ней.
![]() | ![]() |
На изображениях ниже угол обзора составляет 45 градусов. Обратите внимание, что камера перемещается на полпути по дуге между прямо над головой (0 градусов) и землей (90 градусов) в положение 3 . Камера по-прежнему указывает на центральную точку карты, но область, представленная линией в позиции 4 , теперь видна.
![]() | ![]() |
Карта на этом снимке экрана по-прежнему сосредоточена в той же точке, что и на исходной карте, но в верхней части карты появилось больше функций. Когда вы увеличиваете угол свыше 45 градусов, объекты между камерой и положением на карте кажутся пропорционально больше, в то время как объекты за пределами положения карты кажутся пропорционально меньше, создавая трехмерный эффект.
Увеличить
Уровень масштабирования камеры определяет масштаб карты. При больших уровнях масштабирования на экране можно увидеть больше деталей, а при меньших уровнях масштабирования на экране можно увидеть большую часть мира. При уровне масштабирования 0 масштаб карты таков, что весь мир имеет ширину примерно 256 dp ( пикселей, не зависящих от плотности ).
Увеличение уровня масштабирования на 1 удваивает ширину мира на экране. Следовательно, при уровне масштабирования N ширина мира составляет примерно 256 * 2 N dp. Например, при уровне масштабирования 2 весь мир имеет ширину примерно 1024 dp.
Уровень масштабирования не обязательно должен быть целым числом. Диапазон уровней масштабирования, разрешенных картой, зависит от ряда факторов, включая цель, тип карты и размер экрана. Любое число вне диапазона будет преобразовано в ближайшее допустимое значение, которое может быть минимальным или максимальным уровнем масштабирования. В следующем списке показан приблизительный уровень детализации, который вы можете ожидать при каждом уровне масштабирования:
- 1: Мир
- 5: Суша/континент
- 10: Город
- 15: Улицы
- 20: Здания
![]() | ![]() | ![]() |
Перемещение камеры
Maps API позволяет вам изменить, какая часть мира отображается на карте. Это достигается изменением положения камеры (в отличие от перемещения карты).
Когда вы меняете камеру, у вас есть возможность анимировать результирующее движение камеры. Анимация интерполирует текущие атрибуты камеры и новые атрибуты камеры. Вы также можете контролировать продолжительность анимации.
Чтобы изменить положение камеры, вы должны указать, куда вы хотите переместить камеру, используя CameraUpdate
. Maps API позволяет создавать различные типы CameraUpdate
с помощью CameraUpdateFactory
. Доступны следующие варианты:
Изменение уровня масштабирования и установка минимального/максимального масштабирования
CameraUpdateFactory.zoomIn()
и CameraUpdateFactory.zoomOut()
дают вам CameraUpdate
, который изменяет уровень масштабирования на 1,0, сохраняя при этом все остальные свойства прежними.
CameraUpdateFactory.zoomTo(float)
дает вам CameraUpdate
, который изменяет уровень масштабирования на заданное значение, сохраняя при этом все остальные свойства такими же.
CameraUpdateFactory.zoomBy(float)
и CameraUpdateFactory.zoomBy(float, Point)
дают вам CameraUpdate
, который увеличивает (или уменьшает, если значение отрицательное) уровень масштабирования на заданное значение. Последний фиксирует заданную точку на экране таким образом, что она остается в одном и том же месте (широта/долгота), и поэтому он может изменить местоположение камеры для достижения этой цели.
Возможно, вам будет полезно установить предпочтительный минимальный и/или максимальный уровень масштабирования. Например, это полезно для управления взаимодействием с пользователем, если ваше приложение показывает определенную область вокруг точки интереса или если вы используете настраиваемое наложение плитки с ограниченным набором уровней масштабирования.
Джава
private GoogleMap map; map.setMinZoomPreference(6.0f); map.setMaxZoomPreference(14.0f);
Котлин
private lateinit var map: GoogleMap map.setMinZoomPreference(6.0f) map.setMaxZoomPreference(14.0f)
Обратите внимание, что существуют технические соображения, которые могут помешать API разрешить пользователям уменьшать или увеличивать масштаб. Например, спутник или местность могут иметь меньший максимальный масштаб, чем плитки базовой карты.
Изменение положения камеры
Есть два удобных метода для обычных изменений положения. CameraUpdateFactory.newLatLng(LatLng)
предоставляет CameraUpdate
, который изменяет широту и долготу камеры, сохраняя при этом все остальные свойства. CameraUpdateFactory.newLatLngZoom(LatLng, float)
дает вам CameraUpdate
, который изменяет широту, долготу и масштаб камеры, сохраняя при этом все остальные свойства.
Для полной гибкости при изменении положения камеры используйте CameraUpdateFactory.newCameraPosition(CameraPosition)
, который дает вам CameraUpdate
, перемещающий камеру в заданное положение. CameraPosition
можно получить либо напрямую, используя new CameraPosition()
, либо с помощью CameraPosition.Builder
используя new CameraPosition.Builder()
.
Панорамирование (прокрутка)
CameraUpdateFactory.scrollBy(float, float)
дает вам CameraUpdate
, который изменяет широту и долготу камеры таким образом, что карта перемещается на указанное количество пикселей. Положительное значение x заставляет камеру двигаться вправо, так что карта кажется сдвинутой влево. Положительное значение y заставляет камеру двигаться вниз, так что карта кажется сдвинутой вверх. И наоборот, отрицательные значения x заставляют камеру двигаться влево, так что карта кажется сдвинутой вправо, а отрицательные значения y заставляют камеру двигаться вверх. Прокрутка осуществляется относительно текущей ориентации камеры. Например, если камера имеет азимут 90 градусов, то восток находится «вверху».
Установка границ
Установка границ карты
Иногда бывает полезно переместить камеру так, чтобы вся интересующая область была видна при максимально возможном увеличении. Например, если вы показываете все заправочные станции в пределах пяти миль от текущего положения пользователя, вы можете переместить камеру так, чтобы все они были видны на экране. Для этого сначала рассчитайте LatLngBounds
, которые вы хотите видеть на экране. Затем вы можете использовать CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int padding)
, чтобы получить CameraUpdate
, который изменяет положение камеры таким образом, что заданный LatLngBounds
полностью помещается в пределах карты с учетом указанного заполнения (в пикселях). Возвращаемый объект CameraUpdate
гарантирует, что зазор (в пикселях) между заданными границами и краем карты будет как минимум равен указанному отступу. Обратите внимание, что наклон и азимут карты будут равны 0.
Джава
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0));
Котлин
val australiaBounds = LatLngBounds( LatLng((-44.0), 113.0), // SW bounds LatLng((-10.0), 154.0) // NE bounds ) map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0))
Центрирование карты в пределах области
В некоторых случаях вы можете захотеть центрировать камеру в пределах границ вместо того, чтобы включать крайние границы. Например, чтобы центрировать камеру на стране, сохраняя постоянный зум. В этом случае вы можете использовать аналогичный метод, создав LatLngBounds
и используя CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom)
с LatLngBounds
. Метод getCenter()
. Метод getCenter() возвращает географический центр LatLngBounds
.
Джава
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.getCenter(), 10));
Котлин
val australiaBounds = LatLngBounds( LatLng((-44.0), 113.0), // SW bounds LatLng((-10.0), 154.0) // NE bounds ) map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.center, 10f))
Перегрузка метода newLatLngBounds(boundary, width, height, padding)
позволяет указать ширину и высоту в пикселях для прямоугольника с намерением, чтобы они соответствовали размерам карты. Прямоугольник располагается так, чтобы его центр совпадал с центром вида карты (так что, если заданные размеры совпадают с размерами вида карты, прямоугольник совпадал с видом карты). Возвращенный CameraUpdate
будет перемещать камеру таким образом, чтобы указанные LatLngBounds
были центрированы на экране в пределах заданного прямоугольника при максимально возможном уровне масштабирования с учетом требуемого заполнения.
Примечание. Используйте более простой метод newLatLngBounds(boundary, padding)
для создания CameraUpdate
только в том случае, если он будет использоваться для перемещения камеры после того, как карта подверглась компоновке. Во время компоновки API вычисляет границы отображения карты, необходимые для правильного проецирования ограничивающей рамки. In comparison, you can use the CameraUpdate
returned by the more complex method newLatLngBounds(boundary, width, height, padding)
at any time, even before the map has undergone layout, because the API calculates the display boundaries from the arguments that you pass.
Restricting the user's panning to a given area
In the above scenarios, you set the bounds of the map but the user can then scroll or pan outside of these bounds. Instead, you may want to constrain the lat/lng centre bounds of the focal point of the map (the camera target) so that users can only scroll and pan within these bounds. For example, a retail app for a shopping centre or airport may want to constrain the map to a particular bounds, allowing users to scroll and pan within those bounds.
Джава
// Create a LatLngBounds that includes the city of Adelaide in Australia. LatLngBounds adelaideBounds = new LatLngBounds( new LatLng(-35.0, 138.58), // SW bounds new LatLng(-34.9, 138.61) // NE bounds ); // Constrain the camera target to the Adelaide bounds. map.setLatLngBoundsForCameraTarget(adelaideBounds);
Котлин
// Create a LatLngBounds that includes the city of Adelaide in Australia. val adelaideBounds = LatLngBounds( LatLng(-35.0, 138.58), // SW bounds LatLng(-34.9, 138.61) // NE bounds ) // Constrain the camera target to the Adelaide bounds. map.setLatLngBoundsForCameraTarget(adelaideBounds)
The following diagram illustrates a scenario when the camera target is constrained to an area that is slightly larger than the viewport. The user can scroll and pan, provided the camera target remains within the bounded area. The cross represents the camera target:
The map always fills the viewport, even if that results in the viewport showing areas that are outside the defined bounds. For example, if you position the camera target at a corner of the bounded area, the area beyond the corner is visible in the viewport but users cannot scroll further into that area. The following diagram illustrates this scenario. The cross represents the camera target:
In the following diagram, the camera target has a very restricted bounds, offering the user very little opportunity to scroll or pan the map. The cross represents the camera target:
Updating the camera view
To apply a CameraUpdate
to the map, you can either move the camera instantly or animate the camera smoothly. To move the camera instantly with the given CameraUpdate
, you can call GoogleMap.moveCamera(CameraUpdate)
.
You can make the user experience more pleasing, especially for short moves, by animating the change. To do this instead of calling GoogleMap.moveCamera
call GoogleMap.animateCamera
. The map will move smoothly to the new attributes. The most detailed form of this method, GoogleMap.animateCamera(cameraUpdate, duration, callback)
, offers three arguments:
-
cameraUpdate
- The
CameraUpdate
describing where to move the camera. -
callback
- An object that implements
GoogleMap.CancellableCallback
. This generalized interface for handling tasks defines two methods `onCancel()` and `onFinished()`. For animation, the methods are called in the following circumstances:-
onFinish()
- Invoked if the animation goes to completion without interruption.
-
onCancel()
Invoked if the animation is interrupted by calling
stopAnimation()
or starting a new camera movement.Alternatively, this can also occur if you call
GoogleMap.stopAnimation()
.
-
-
duration
- Desired duration of the animation, in milliseconds, as an
int
.
The following code snippets illustrate some of the common ways to move the camera.
Джава
LatLng sydney = new LatLng(-33.88,151.21); LatLng mountainView = new LatLng(37.4, -122.1); // Move the camera instantly to Sydney with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomIn()); // Zoom out to zoom level 10, animating with a duration of 2 seconds. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); // Construct a CameraPosition focusing on Mountain View and animate the camera to that position. CameraPosition cameraPosition = new CameraPosition.Builder() .target(mountainView ) // Sets the center of the map to Mountain View .zoom(17) // Sets the zoom .bearing(90) // Sets the orientation of the camera to east .tilt(30) // Sets the tilt of the camera to 30 degrees .build(); // Creates a CameraPosition from the builder map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
Котлин
val sydney = LatLng(-33.88, 151.21) val mountainView = LatLng(37.4, -122.1) // Move the camera instantly to Sydney with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15f)) // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomIn()) // Zoom out to zoom level 10, animating with a duration of 2 seconds. map.animateCamera(CameraUpdateFactory.zoomTo(10f), 2000, null) // Construct a CameraPosition focusing on Mountain View and animate the camera to that position. val cameraPosition = CameraPosition.Builder() .target(mountainView) // Sets the center of the map to Mountain View .zoom(17f) // Sets the zoom .bearing(90f) // Sets the orientation of the camera to east .tilt(30f) // Sets the tilt of the camera to 30 degrees .build() // Creates a CameraPosition from the builder map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))