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 Compacto ou em dispositivos não XR, qualquer código nesse subespaço é ignorado.
Você pode usar elementos combináveis de subespaço, como SpatialPanel, SpatialRow,
e SpatialColumn, para criar seu layout e inserir conteúdo 2D no espaço 3D. Para inserir conteúdo 3D, use o elemento combinável de subespaço apropriado, como
SceneCoreEntity para modelos 3D e SpatialExternalSurface para
imagens estéreo. Alguns componentes XR, como Orbiter ou SpatialDialog
são elementos combináveis 2D padrão que podem ser usados em qualquer lugar da hierarquia da interface 2D,
mas um SubspaceComposable precisa ser invocado no subespaço do app. Para fazer
isso, use o Subspace elemento combinável de subespaço.
Sobre hierarquias de subespaço
O Subspace de nível superior é o subespaço mais externo invocado pelo seu app.
Cada chamada para um Subspace cria uma nova hierarquia de interface espacial independente.
Ele não herda a posição espacial, a orientação ou a escala de nenhum Subspace pai em que está aninhado.
Para criar um Subspace incorporado ou aninhado em um SpatialPanel, Orbiter,
SpatialPopup, ou outro componente, use PlanarEmbeddedSubspace.
PlanarEmbeddedSubspace tem duas diferenças principais de Subspace:
- Eles participam do layout 2D em que são invocados. Isso significa que a altura e a largura do subespaço serão restritas 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 dentro de um
SpatialPanel, esse subespaço será um filho doSpatialPanelem que ele é chamado.
Esses comportamentos de PlanarEmbeddedSubspace ativam recursos como:
- Mover o filho com a entidade pai
- Deslocar o local do filho usando o deslocamento
SubspaceModifier - Apresentar um objeto 3D que paira acima da interface 2D e corresponde à altura e largura do espaço apropriado no layout 2D
Adaptar layouts para um subespaço
No Android XR, o layout do 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 da caixa delimitadora dentro do ActivitySpace para
que o conteúdo possa ser colocado no 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 de
recommendedContentBoxInFullSpace pode ser substituída pela aplicação de um
modificador personalizado baseado em tamanho, como SubspaceModifier.requiredSizeIn. Para um comportamento ilimitado, defina allowUnboundedSubspace = true.
Chame recommendedContentBoxInFullSpace usando a sessão 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 app
O exemplo de código a seguir mostra como adicionar Subspace e
PlanarEmbeddedSubspace ao 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.