Adicionar um subespaço ao app

Dispositivos XR relevantes
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos XR.
Headsets XR
Óculos XR com fio

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 do SpatialPanel em 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.