Внешние 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 не получится.