Um subespaço é uma partição do espaço 3D no seu app em que você pode inserir modelos 3D, criar layouts 3D e adicionar profundidade ao conteúdo 2D. Um subespaço é renderizado apenas quando a espacialização está ativada. No espaço da casa ou em dispositivos não XR, qualquer código dentro desse subespaço é ignorado.
Você pode usar elementos combináveis de subespaço, como SpatialPanel, SpatialRow e SpatialColumn, para criar seu layout e colocar conteúdo 2D em um espaço 3D. Para colocar conteúdo 3D, use o elemento combinável Subspace apropriado, como
SceneCoreEntity para modelos 3D e SpatialExternalSurface para
imagens estéreo. Alguns componentes de RV, como Orbiter ou SpatialDialog,
são elementos combináveis 2D padrão que podem ser usados em qualquer lugar na hierarquia da interface 2D,
mas um SubspaceComposable precisa ser invocado no subespaço do app. Para fazer isso, use o elemento combinável de subespaço Subspace.
Sobre hierarquias de subespaço
O Subspace de nível superior é o subespaço mais externo invocado pelo app.
Cada chamada para um Subspace cria uma hierarquia de interface espacial nova e independente.
Ela não herda a posição espacial, a orientação ou a escala de nenhum Subspace pai em que está aninhada.
Para criar um Subspace incorporado ou aninhado em um SpatialPanel, Orbiter,
SpatialPopup ou outro componente, use PlanarEmbeddedSubspace.
O PlanarEmbeddedSubspace tem duas diferenças principais em relação ao Subspace:
- Eles participam do layout 2D em que são invocados. Isso significa que a altura e a largura do subespaço serão limitadas pela altura e largura do layout pai 2D.
- Eles se comportam como filhos da entidade em que são invocados. Isso significa que, se você chamar um elemento combinável de subespaço aninhado em um
SpatialPanel, esse subespaço será filho doSpatialPanelem que ele é chamado.
Esses comportamentos do PlanarEmbeddedSubspace permitem recursos como:
- Mover a criança com a entidade principal
- Como compensar a posição da criança usando o deslocamento
SubspaceModifier - Apresentar um objeto 3D que fica acima da sua interface 2D e corresponde à altura e à largura do espaço adequado no layout 2D
Adaptar layouts para um subespaço
No Android XR, o layout do seu app é vinculado ao VolumeConstraints de Subspace
no Modo de Espaço Ampliado por padrão. Por isso, considere a quantidade de espaço visível
disponível para o usuário e ajuste o layout de acordo. O
recommendedContentBoxInFullSpace fornece as dimensões específicas para
a caixa delimitadora dentro do ActivitySpace para que o conteúdo possa ser colocado
dentro do campo de visão do usuário.
O conteúdo principal do app precisa caber nessa caixa. Se você tiver conteúdo que precise exceder os limites recomendados, considere um layout que incentive os usuários a explorar o espaço movendo a cabeça. A restrição padrão do
recommendedContentBoxInFullSpace pode ser substituída aplicando um
modificador personalizado com base no tamanho, como SubspaceModifier.requiredSizeIn. Para um comportamento sem limites, defina allowUnboundedSubspace = true.
Chame recommendedContentBoxInFullSpace usando a Session atual para
receber essas dimensões específicas conforme necessário. Confira este exemplo:
val session = LocalSession.current session?.scene?.activitySpace?.recommendedContentBoxInFullSpace
Adicionar um subespaço ao seu app
O exemplo de código a seguir mostra como adicionar Subspace e
PlanarEmbeddedSubspace ao seu app:
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 {} } }
Consulte a documentação de referência completa sobre Subspace e
PlanarEmbeddedSubspace para mais detalhes.