Ihrer App einen Unterbereich hinzufügen

Anwendbare XR‑Geräte
Dieser Leitfaden hilft Ihnen dabei, Erlebnisse für diese Arten von XR-Geräten zu entwickeln.
XR-Headsets
XR-Datenbrille mit Kabel

Ein Unterbereich ist eine Partition des 3D-Raums in Ihrer App, in der Sie 3D-Modelle platzieren, 3D-Layouts erstellen und 2D-Inhalten Tiefe verleihen können. Ein Subspace wird nur gerendert, wenn die Räumlichkeit aktiviert ist. Im Home Space oder auf Nicht-XR-Geräten wird jeglicher Code in diesem Unterbereich ignoriert.

Sie können Subspace-Composables wie SpatialPanel, SpatialRow und SpatialColumn verwenden, um Ihr Layout zu erstellen und 2D-Inhalte im 3D-Raum zu platzieren. Verwenden Sie zum Platzieren von 3D-Inhalten die entsprechende Subspace-Composable, z. B. SceneCoreEntity für 3D-Modelle und SpatialExternalSurface für Stereobilder. Einige XR-Komponenten wie Orbiter oder SpatialDialog sind standardmäßige 2D-Composables, die überall in der 2D-UI-Hierarchie verwendet werden können. Ein SubspaceComposable muss jedoch im Unterraum Ihrer App aufgerufen werden. Verwenden Sie dazu die zusammensetzbare Funktion Subspace.

Unterraumhierarchien

Die oberste Ebene Subspace ist der äußerste Unterbereich, der von Ihrer App aufgerufen wird. Bei jedem Aufruf von Subspace wird eine neue, unabhängige räumliche UI-Hierarchie erstellt. Sie übernimmt nicht die räumliche Position, Ausrichtung oder Skalierung eines übergeordneten Subspace, in das sie eingebettet ist.

Wenn Sie ein eingebettetes oder verschachteltes Subspace in einem SpatialPanel, Orbiter, SpatialPopup oder einer anderen Komponente erstellen möchten, verwenden Sie PlanarEmbeddedSubspace.

PlanarEmbeddedSubspace unterscheidet sich in zwei wesentlichen Punkten von Subspace:

  • Sie sind Teil des 2D-Layouts, in dem sie aufgerufen werden. Das bedeutet, dass die Höhe und Breite des Unterbereichs durch die Höhe und Breite des zugehörigen 2D-Layouts begrenzt werden.
  • Sie verhalten sich wie untergeordnete Elemente der Entität, in der sie aufgerufen werden. Wenn Sie einen untergeordneten Subspace aufrufen, der in einem SpatialPanel verschachtelt ist, ist dieser Subspace ein untergeordnetes Element des SpatialPanel, in dem er aufgerufen wird.

Diese Verhaltensweisen von PlanarEmbeddedSubspace ermöglichen Funktionen wie:

  • Kind mit der übergeordneten Einheit verschieben
  • Standort des Kindes mit dem Offset SubspaceModifier verschieben
  • Ein 3D-Objekt, das über der 2D-Benutzeroberfläche schwebt und der Höhe und Breite des entsprechenden Bereichs im 2D-Layout entspricht

Layouts für einen untergeordneten Space anpassen

Unter Android XR ist das Layout Ihrer App im Full Space-Modus standardmäßig an die VolumeConstraints von Subspace gebunden. Berücksichtigen Sie daher den für den Nutzer sichtbaren Bereich und passen Sie das Layout entsprechend an. Die recommendedContentBoxInFullSpace enthält die spezifischen Abmessungen für den Begrenzungsrahmen innerhalb der ActivitySpace, damit Inhalte im Sichtfeld des Nutzers platziert werden können.

Der primäre Inhalt Ihrer App sollte in dieses Feld passen. Wenn Sie Inhalte haben, die die empfohlenen Grenzen überschreiten müssen, sollten Sie ein Layout in Betracht ziehen, das Nutzer dazu anregt, den Raum durch Kopfbewegungen zu erkunden. Die Standardeinschränkung von recommendedContentBoxInFullSpace kann durch Anwenden eines benutzerdefinierten größenbasierten Modifikators wie SubspaceModifier.requiredSizeIn überschrieben werden. Legen Sie für ein unbegrenztes Verhalten allowUnboundedSubspace = true fest.

Rufen Sie recommendedContentBoxInFullSpace mit der aktuellen Session auf, um diese spezifischen Dimensionen nach Bedarf abzurufen. Sehen Sie sich folgendes Beispiel an:

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

Unterbereich zu Ihrer App hinzufügen

Das folgende Codebeispiel zeigt, wie Sie Subspace und PlanarEmbeddedSubspace in Ihre App einfügen:

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 {}
    }
}

Weitere Informationen finden Sie in der vollständigen Referenzdokumentation zu Subspace und PlanarEmbeddedSubspace.