Внешние surface

MapKit SDK позволяет отрисовывать карту на несколько Android Surface. Рендеринг одной карты в несколько Surface вместо отрисовки нескольких MapView позволяет снизить нагрузку на CPU, GPU, а также снизить расход памяти устройства.

Важно

Рендеринг в Surface позволяет дублировать участок карты, а не рисовать отдельную карту на каждый Surface. Это значит, что отображаемая карта в Surface соответствует стилям, тайлам и прочим характеристикам MapWindow. При этом, управлять картой через Surface невозможно.

Обертка над Surface

В MapKit SDK Android Surface передается в обернутом в Surface.

Такой Surface создается с помощью SurfaceFactory.from(android.view.Surface).

val androidSurface = layout.surfaceView.holder.surface
val surface = SurfaceFactory.from(androidSurface)

Работа с Surface

Добавление Surface к MapView

Важно

Установите app:movable="true" для MapView в XML Layout, чтобы включить возможность подключения android.view.Surface к соответствующему MapWindow.
Например:

<FrameLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android" >

    <com.yandex.mapkit.map.MapView
        android:id="@+id/map_view"
        app:movable="true" />

</FrameLayout>

Для добавления Surface к MapView используйте метод MapWindow.addSurface(Surface), для удаления - MapWindow.removeSurface(Surface).

Добавление Surface к OffscreenMapWindow

Иногда для отображения карты на Surface нет необходимости отображать MapView, или же отображение на все Surface могут потребовать слишком большой MapView, который не влезет ни на один экран. Для таких случаев используйте OffscreenMapWindow.

Как и MapView, OffscreenMapWindow содержит в себе MapWindow, что позволяет работать с Surface. Но при этом OffscreenMapWindow не является View-элементом, из-за чего отрисовывается только на Surface.

Для создания OffscreenMapWindow используйте метод MapKit.createOffscreenMapWindow.

Расположение карты на Surface

Для изменения положения фокуса карты внутри Surface используйте метод Surface.setAnchorPoint(android.graphics.PointF). Область которая будет отображена берется минимумом из размера карты и размера самого Surface. По умолчанию якорь совпадает с фокусом карты, поэтому он находится в центре Surface.

Якорь задается в пределах [0, 1] по каждой оси и означает точку на Surface, в которую попадет фокус карты. Фокус карты всегда будет виден на Surface, а диапазон якоря смещается так, чтобы пересечение Surface с картой никогда не выходило за нее. Так, например, якорь равный {0, 0} сместит точку фокуса карты в левый нижний угол Surface, а якорь равный {1, 1} сместит точку фокуса карты в правый верхний угол Surface.
Пример работы якорей на двух Surface:

Сама карта:

Пример карты

Два равноразмерных Surface с указанными якорями для них (якори приписаны рядом с соответстующим Surface):

Пример якоря

Примечание

Отрисовка на Surface, который больше или равен размером самой карте, всегда будет рисовать всю карту, и растягивать ее на весь Surface. Изменить положение карты на этом Surface не получится.

Предыдущая
Следующая