Aggiungere un sottospazio all'app

Dispositivi XR applicabili
Queste indicazioni ti aiutano a creare esperienze per questi tipi di dispositivi XR.
Visori XR
Occhiali XR con cavo

Un sottospazio è una partizione dello spazio 3D all'interno dell'app in cui puoi inserire modelli 3D, creare layout 3D e aggiungere profondità ai contenuti 2D. Un sottospazio viene sottoposto a rendering solo quando la spazializzazione è abilitata. In Spazio Home o sui dispositivi non XR, qualsiasi codice all'interno di quel sottospazio viene ignorato.

Puoi utilizzare i componibili dei sottospazi come SpatialPanel, SpatialRow, e SpatialColumn per creare il layout e inserire contenuti 2D nello spazio 3D. Per inserire contenuti 3D, utilizza il componibile del sottospazio appropriato, ad esempio SceneCoreEntity per i modelli 3D e SpatialExternalSurface per le immagini stereo. Alcuni componenti XR come Orbiter o SpatialDialog sono componibili 2D standard che possono essere utilizzati ovunque nella gerarchia dell'interfaccia utente 2D, ma un SubspaceComposable deve essere richiamato nel sottospazio dell'app. Per farlo, utilizza il Subspace componibile del sottospazio.

Informazioni sulle gerarchie dei sottospazi

Subspace di primo livello è il sottospazio più esterno richiamato dall'app. Ogni chiamata a un Subspace crea una nuova gerarchia dell'interfaccia utente spaziale indipendente. Non eredita la posizione spaziale, l'orientamento o la scala di qualsiasi Subspace padre in cui è nidificato.

Per creare un Subspace incorporato o nidificato all'interno di un SpatialPanel, Orbiter, SpatialPopup, o un altro componente, utilizza PlanarEmbeddedSubspace.

PlanarEmbeddedSubspace presenta due differenze principali rispetto a Subspace:

  • Partecipano al layout 2D in cui vengono richiamati. Ciò significa che l'altezza e la larghezza del sottospazio saranno vincolate dall'altezza e dalla larghezza del layout principale 2D.
  • Si comportano come figli dell'entità in cui vengono richiamati. Ciò significa che, se chiami un componibile del sottospazio nidificato all'interno di un SpatialPanel, quel sottospazio è un figlio del SpatialPanel in cui viene chiamato.

Questi comportamenti di PlanarEmbeddedSubspace consentono funzionalità come:

  • Spostare il figlio con l'entità padre
  • Compensare la posizione del figlio utilizzando l'offset SubspaceModifier
  • Presentare un oggetto 3D che si sposta sopra l'interfaccia utente 2D e corrisponde all'altezza e alla larghezza dello spazio appropriato nel layout 2D

Adattare i layout a un sottospazio

Su Android XR, il layout dell'app è associato per impostazione predefinita a VolumeConstraints di Subspace in modalità spazio intero. Per questo motivo, devi considerare la quantità di spazio visibile a disposizione dell'utente e regolare il layout di conseguenza. recommendedContentBoxInFullSpace fornisce le dimensioni specifiche per il riquadro di delimitazione all'interno di ActivitySpace in modo che i contenuti possano essere inseriti nel campo visivo dell'utente.

I contenuti principali dell'app devono rientrare in questo riquadro. Se hai contenuti che devono superare i limiti consigliati, valuta la possibilità di utilizzare un layout che incoraggi gli utenti a esplorare lo spazio muovendo la testa. Il vincolo predefinito di recommendedContentBoxInFullSpace può essere sostituito applicando un modificatore personalizzato basato sulle dimensioni, ad esempio SubspaceModifier.requiredSizeIn. Per un comportamento senza limiti, imposta allowUnboundedSubspace = true.

Chiama recommendedContentBoxInFullSpace utilizzando la sessione corrente per ottenere queste dimensioni specifiche, se necessario. Vedi l'esempio che segue:

val session = LocalSession.current
session?.scene?.activitySpace?.recommendedContentBoxInFullSpace

Aggiungere un sottospazio all'app

L'esempio di codice seguente mostra come aggiungere Subspace e PlanarEmbeddedSubspace all'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 {}
    }
}

Per ulteriori dettagli, consulta la documentazione di riferimento completa su Subspace e PlanarEmbeddedSubspace.