Adicionar um subespaço ao app

Dispositivos XR aplicáveis
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos de XR.
Headsets de realidade estendida
Ó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 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 do SpatialPanel em 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.