Подпространство — это раздел трёхмерного пространства внутри вашего приложения, где вы можете размещать трёхмерные модели, создавать трёхмерные макеты и добавлять глубину к контенту, который в противном случае был бы двухмерным. Подпространство отображается только тогда, когда включена пространственная обработка. В Home Space или на устройствах, не поддерживающих XR, любой код внутри этого подпространства игнорируется.
Для создания макета и размещения 2D-контента в 3D-пространстве можно использовать компоненты подпространства, такие как SpatialPanel , SpatialRow и SpatialColumn . Для размещения 3D-контента используйте соответствующий компонент подпространства, например SceneCoreEntity для 3D-моделей и SpatialExternalSurface для стереоизображений. Некоторые XR-компоненты, такие как Orbiter или SpatialDialog являются стандартными компонентами 2D-пространства, которые можно использовать в любом месте иерархии 2D-интерфейса, но SubspaceComposable необходимо вызывать в подпространстве вашего приложения. Для этого используйте компонент подпространства Subspace .
О подпространственных иерархиях
Subspace верхнего уровня — это самое внешнее подпространство, вызываемое вашим приложением. Каждый вызов Subspace создает новую, независимую иерархию пространственного пользовательского интерфейса. Оно не наследует пространственное положение, ориентацию или масштаб какого-либо родительского Subspace в которое оно вложено.
Для создания встроенного или вложенного Subspace внутри SpatialPanel , Orbiter , SpatialPopup или другого компонента используйте PlanarEmbeddedSubspace .
PlanarEmbeddedSubspace имеет два ключевых отличия от Subspace :
- Они участвуют в двумерной компоновке, в которой используются. Это означает, что высота и ширина подпространства будут ограничены высотой и шириной его двумерной родительской компоновки.
- Они ведут себя как дочерние элементы сущности, в которой они вызываются. Это означает, что если вы вызываете составной подпространство, вложенное в
SpatialPanel, то это подпространство является дочерним элементомSpatialPanelв котором оно вызывается.
Такое поведение PlanarEmbeddedSubspace обеспечивает следующие возможности:
- Перемещение дочернего элемента вместе с родительским элементом.
- Смещение положения дочернего элемента с помощью параметра
SubspaceModifier - Представление трехмерного объекта, который парит над вашим двухмерным пользовательским интерфейсом и соответствует высоте и ширине соответствующего пространства в двухмерном макете.
Адаптируйте планировку для подпространства.
В Android XR макет вашего приложения по умолчанию привязан к параметрам VolumeConstraints Subspace в режиме Full Space. Поэтому следует учитывать количество видимого пространства, доступного пользователю, и соответствующим образом корректировать макет. Параметр recommendedContentBoxInFullSpace задает конкретные размеры ограничивающей рамки внутри ActivitySpace , чтобы контент мог быть размещен в поле зрения пользователя.
Основное содержимое вашего приложения должно помещаться в этот блок. Если у вас есть контент, который должен выходить за рекомендуемые границы, рассмотрите макет, который побуждает пользователей исследовать пространство, двигая головой. Ограничение по умолчанию для recommendedContentBoxInFullSpace можно переопределить, применив пользовательский модификатор размера, например, SubspaceModifier.requiredSizeIn . Для неограниченного поведения установите allowUnboundedSubspace = true .
Вызовите функцию recommendedContentBoxInFullSpace , используя текущую сессию , чтобы получить необходимые параметры. См. следующий пример:
val session = LocalSession.current session?.scene?.activitySpace?.recommendedContentBoxInFullSpace
Добавьте подпространство в ваше приложение.
В следующем примере кода показано, как добавить Subspace и PlanarEmbeddedSubspace в ваше приложение:
setContent { // This is a top-level subspace Subspace { SpatialPanel { MyComposable() } } }
@Composable private fun MyComposable() { Row { PrimaryPane() SecondaryPane() } } @Composable private fun PrimaryPane() { // This is an embedded subspace, because PrimaryPane is in a SpatialPanel // and that SpatialPanel is in the top-level Subspace PlanarEmbeddedSubspace { SpatialPanel {} } }
Для получения более подробной информации см. полную справочную документацию по Subspace и PlanarEmbeddedSubspace .