Jetpack Compose für XR

Deklarativ räumliche UI-Layouts erstellen, die die räumlichen Funktionen von Android XR nutzen
Letzte Aktualisierung Stabile Version Releasekandidat Beta-Ausgabe Alphaversion
7. Mai 2025 - - 1.0.0-alpha04

Abhängigkeiten deklarieren

Wenn Sie eine Abhängigkeit von XR Compose hinzufügen möchten, müssen Sie Ihrem Projekt das Google Maven-Repository hinzufügen. Weitere Informationen finden Sie im Maven-Repository von Google.

Fügen Sie der Datei build.gradle für Ihre App oder Ihr Modul die Abhängigkeiten für die erforderlichen Artefakte hinzu:

Cool

dependencies {
    implementation "androidx.xr.compose:compose:1.0.0-alpha04"

    // Use to write unit tests
    testImplementation "androidx.xr.compose:compose-testing:1.0.0-alpha04"
}

Kotlin

dependencies {
    implementation("androidx.xr.compose:compose:1.0.0-alpha04")

    // Use to write unit tests
    testImplementation("androidx.xr.compose:compose-testing:1.0.0-alpha04")
}

Weitere Informationen zu Abhängigkeiten finden Sie unter Build-Abhängigkeiten hinzufügen.

Feedback

Ihr Feedback hilft uns, Jetpack zu verbessern. Bitte teilen Sie uns mit, wenn Sie neue Probleme feststellen oder Ideen zur Verbesserung dieser Bibliothek haben. Sehen Sie sich die vorhandenen Probleme in dieser Bibliothek an, bevor Sie ein neues erstellen. Sie können einem vorhandenen Problem Ihre Stimme geben, indem Sie auf die Schaltfläche mit dem Stern klicken.

Neues Problem erstellen

Weitere Informationen finden Sie in der Dokumentation zum Issue Tracker.

Version 1.0

Version 1.0.0-alpha04

7. Mai 2025

androidx.xr.compose:compose:1.0.0-alpha04 und androidx.xr.compose:compose-testing:1.0.0-alpha04 werden freigegeben. Version 1.0.0-alpha04 enthält diese Commits.

Neue Funktionen

  • Die CompositionLocalConsumerSubspaceModifierNode-Schnittstelle wurde hinzugefügt, damit benutzerdefinierte SubspaceModifier-Typen auf lokale Werte der Komposition zugreifen können.
  • Es wurde eine neue SpatialPanel API hinzugefügt, die dem Implementierungsstil von Compose AndroidView folgt. Die vorherige ViewBased SpatialPanel wird eingestellt.
  • Es wurde ein VolumeConstraints.Unbounded-Begleiterobjekt hinzugefügt, das unbegrenzte Einschränkungen darstellt.
  • SubspaceModifier.onPointSourceParams wurde hinzugefügt, um eine lokalisierte Audioquelle zu ermöglichen.
  • Es wurde eine öffentliche ApplicationSubspace hinzugefügt, die optionale VolumeConstraints bietet, um einen 3D-Bereich zu definieren, in dem die App räumliche Inhalte rendern kann. Wenn keine Einschränkungen angegeben sind, ist der Unterraum standardmäßig in der Breite und Höhe durch das aktuelle Sichtfeld von SpatialUser begrenzt. Nutzer können Einschränkungen angeben, die verwendet werden sollen, wenn das Sichtfeld nicht ermittelt werden kann. Andernfalls werden die Standardwerte für Breite und Höhe des Sichtfelds verwendet.
  • Es wurde SpatialExternalSurface hinzugefügt, mit dem sich stereoskopische Inhalte rendern lassen. SpatialExternalSurface kann mit Modifikatoren (außer Alpha) und einem Weichzeichnereffekt angepasst werden.
  • Es wurde ein neuer pointerHoverIcon-Unterraum-Modifikator hinzugefügt, mit dem Nutzer das Symbol für den räumlichen Zeiger festlegen können.

API-Änderungen

  • Die Einschränkung für RequiresApi(34) wurde für alle Jetpack XR-Pakete aufgehoben. Diese Einschränkung war redundant, da Jetpack XR derzeit nur auf Geräten mit API-Level 34 und höher verfügbar ist. (Iae0f8)
  • Für Projekte, die mit Kotlin 2.0 veröffentlicht wurden, ist KGP 2.0.0 oder höher erforderlich. (Idb6b5)
  • Die Rückwärtsfunktion funktioniert jetzt auch in Infofeldern für Orte ohne eingebettete Aktivitäten. Damit die Rückwärtsfunktion funktioniert, müssen Sie android:enableOnBackInvokedCallback="true" im Android-Manifest angeben.
  • Die Weiterleitung funktioniert jetzt auch bei standortbezogenen Dialogen. Damit die Back-Handling-Funktion funktioniert, müssen Sie android:enableOnBackInvokedCallback="true" im Android-Manifest angeben.
  • SpatialPanel-Elemente, die auf der Zusammenstellung oder Ansicht basieren, können jetzt anhand ihres Inhalts skaliert werden.
  • Entwickler können jetzt eigene benutzerdefinierte SpatialElevationLevel-Werte festlegen und sind nicht auf die vordefinierten Stufen beschränkt.
  • Die Höhe des Orbiters kann jetzt über den Parameter elevation angepasst werden.
  • Der Unterraum kann jetzt standardmäßig durch das Sichtfeld der SpatialUser in Breite und Höhe begrenzt werden. Wenn das Sichtfeld nicht ermittelt werden kann, werden die Standardwerte für Breite und Höhe des Sichtfelds verwendet.
  • Dem Modifikator Movable wurden die neuen Rückrufe onMoveStart und onMoveEnd hinzugefügt. Die Callbacks onMoveStart und onMoveEnd werden aufgerufen, wenn der Nutzer beginnt und beendet, einen untergeordneten Raum zu bewegen, der mit dem Modifikator „beweglich“ zusammengesetzt werden kann.
  • Der Parameter name wurde aus geografischen APIs wie SpatialRow und SpatialPanel entfernt. Verwenden Sie für die Fehlerbehebung bei räumlichen Kompositionen stattdessen SubspaceModifier.testTag.
  • Eine nicht unterstützte Überladung von SpatialPopup wurde entfernt, die nur spatialElevationLevel und content enthält. Verwenden Sie die Oberfläche, die onDimissRequest unterstützt.
  • Der onPoseChange-Callback für den beweglichen Modus wurde entfernt. Verwenden Sie stattdessen onMove.
  • SubspaceModifiers wendet ihre Effekte nicht mehr an, wenn sie getrennt sind oder sich gerade trennen.
  • Die vorhandene SpatialRow API wurde in SpatialRow und SpatialCurvedRow aufgeteilt. Wenn Sie bisher den Parameter curveRadius von SpatialRow verwendet haben, verwenden Sie jetzt stattdessen SpatialCurvedRow. Dieser bietet dasselbe Verhalten.
  • MainPanel und ActivityPanel haben keine Titelleisten mehr, wenn sie auf einem ähnlich aktuellen System-Image ausgeführt werden.
  • Alpha- und Skalierungsmodifikatoren können jetzt gestapelt werden und ihre Werte werden für den endgültig angewendeten Alpha- oder Skalierungswert multipliziert.
  • Der onPoseChange-Callback des Movable-Modifikators wurde optimiert, um eine flüssigere Körperbewegung zu ermöglichen.
  • Die Callbacks für die verschiebbaren und skalierbaren Modifikatoren werden jetzt im Hauptthread ausgeführt, damit Statusänderungen eine Neuzusammensetzung auslösen.
  • In den Layout- und Messphasen wurde die Statusbeobachtung hinzugefügt, damit Statusänderungen in SubspaceLayout ein Neulayout auslösen.
  • Optimierte Aktualisierungen von Modifikatorketten, um vorhandene Modifikatoren besser wiederverwenden zu können.

Fehlerkorrekturen

  • Das Scrollen wird beendet, wenn ein SpatialDialog angezeigt wird. (Ic4594)
  • Anfragen zum Neuanlegen des Layouts, die gesendet werden, während Modifizierknoten getrennt sind, werden jetzt ignoriert.
  • Phasen für das Neulayout, die durch die Modifikatoren „Beweglich“ und „Verschiebbar“ ausgelöst wurden, wurden entfernt.
  • Ein Absturz im MainPanel()-Kompositelement wurde behoben, der auftrat, wenn eine Dimension direkt oder während einer Layoutberechnung (z.B. einer SpatialRow/SpatialColumn-Berechnung) auf null gesetzt wurde. Stattdessen wird das Steuerfeld jetzt ausgeblendet. Diese Korrektur behebt speziell Abstürze während der Layoutphase. Das Ändern der Größe des Steuerfelds auf null durch Nutzerinteraktion wird separat behandelt. Der ausgeblendete Bereich bietet keine UI-Affordances.
  • Problem mit maintainAspectRatio vom Modifikator „Resizable“ behoben Das Seitenverhältnis sollte jetzt beibehalten werden.
  • Ein Problem mit verschachtelten Unterbereichen, bei dem sie für einen einzelnen Frame falsch positioniert wurden, wurde behoben.
  • Ein Problem wurde behoben, durch das abgerundete Ecken manchmal nicht angewendet wurden, obwohl sie es hätten tun sollen.
  • NestedSubspaces wird in einem Frame nicht mehr am falschen Ort angezeigt.

Version 1.0.0-alpha03

26. Februar 2025

androidx.xr.compose:compose:1.0.0-alpha03 und androidx.xr.compose:compose-testing:1.0.0-alpha03 wurden ohne nennenswerte Änderungen seit der letzten Alphaversion veröffentlicht. Version 1.0.0-alpha03 enthält diese Commits

Version 1.0.0-alpha02

12. Februar 2025

androidx.xr.compose:compose:1.0.0-alpha02 und androidx.xr.compose:compose-testing:1.0.0-alpha02 werden freigegeben. Version 1.0.0-alpha02 enthält diese Commits.

Neue Funktionen

  • Der Inhalt des Infofelds kann jetzt ausgeblendet werden, wenn ein räumlicher Dialog aktiviert ist.
  • Die Orbiter API kann jetzt in SubspaceComposable-Kontexten verwendet werden und fügt Orbiter dem nächstgelegenen SubspaceLayout-basierten übergeordneten Element hinzu.
  • Einführung von LayoutCoordinatesAwareModifierNode für benutzerdefinierte positionierungsbasierte Modifikatoren.
  • SubspaceModifier.Node-Methoden zum An- und Trennen wurden hinzugefügt.
  • Dem beweglichen Modifikator wurde scaleWithDistance hinzugefügt. Wenn scaleWithDistance aktiviert ist, wird das verschobene Unterraumelement vergrößert oder verkleinert. Außerdem bleibt die explizite Skalierung erhalten, die vor der Bewegung festgelegt wurde.

API-Änderungen

  • SessionCallbackProvider wurde durch SpatialCapabilities ersetzt.

Sonstige Änderungen

  • minSDK auf 24 reduziert Für alle Jetpack XR APIs ist weiterhin API 34 in der Laufzeit erforderlich.
  • Die Konstruktoren Orbiter, EdgeOffset.inner, EdgeOffset.outer und EdgeOffset.overlap sind keine @Composable-Methoden mehr, sodass sie auch in nicht kombinierbaren Kontexten verwendet werden können.
  • Aktualisieren Sie die Höhenstufen so, dass sie der aktuellen UX-Spezifikation entsprechen.
  • Implementieren Sie die SubspaceSemanticsInfo-Schnittstelle in MeasurableLayout.
  • SubspaceModifierElement wurde in SubspaceModifierNodeElement umbenannt.

Fehlerkorrekturen

  • Fehlerbehebungen zur Stabilisierung der SubspaceModifier-Bestellungen. SubspaceModifier sollte jetzt zuverlässiger funktionieren. Die Modifikatoren „Abstand“, „Drehen“, „Skalieren“, „Verschiebbar“ und „Weitgehend skalierbar“ sollten jetzt in beliebiger Reihenfolge verwendet werden können.

Version 1.0.0-alpha01

12. Dezember 2024

androidx.xr.compose:compose-*1.0.0-alpha01 wird veröffentlicht.

Funktionen der Erstversion

  • Erste Entwicklerversion von Jetpack Compose für XR. Verwenden Sie bekannte Compose-Konzepte wie Zeilen und Spalten, um räumliche UI-Layouts in XR zu erstellen, unabhängig davon, ob Sie eine vorhandene 2D-App auf XR umstellen oder eine neue XR-App von Grund auf neu erstellen. Diese Bibliothek bietet untergeordnete und räumliche Composeables, z. B. räumliche Panels und Orbiter, mit denen Sie Ihre vorhandene 2D-Compose- oder datenbankbasierte Benutzeroberfläche in ein räumliches Layout einfügen können. Es wird der zusammensetzbare Volumenunterraum eingeführt, mit dem Sie SceneCore-Entitäten wie 3D-Modelle relativ zu Ihrer Benutzeroberfläche platzieren können. Weitere Informationen finden Sie in diesem Entwicklerleitfaden:

    • Subspace: Dieses Composeable kann überall in der UI-Hierarchie Ihrer App platziert werden. So können Sie Layouts für 2D- und räumliche Benutzeroberflächen beibehalten, ohne den Kontext zwischen Dateien zu verlieren. So können Sie z. B. die vorhandene App-Architektur zwischen XR und anderen Formfaktoren teilen, ohne den Status durch den gesamten UI-Baum hochladen oder Ihre App neu entwerfen zu müssen.

    • SpatialPanel: Ein SpatialPanel ist ein zusammensetzbarer Unterraum, in dem Sie App-Inhalte anzeigen können. So können Sie beispielsweise Videowiedergabe, Standbilder oder andere Inhalte in einem SpatialPanel anzeigen.

    • Orbiter: Ein Orbiter ist eine räumliche UI-Komponente. Es ist für die Anbringung an einem entsprechenden Infofeld konzipiert und enthält Navigations- und Kontextaktionselemente, die sich auf dieses Infofeld beziehen. Wenn Sie beispielsweise ein räumliches Steuerfeld zum Anzeigen von Videoinhalten erstellt haben, können Sie die Steuerelemente für die Videowiedergabe in einem Orbiter hinzufügen.

    • Volume: Hiermit können Sie SceneCore-Entitäten wie 3D-Modelle relativ zur Benutzeroberfläche platzieren.

  • Spatial Layout: Mit SpatialRow, SpatialColumn, SpatialBox und SpatialLayoutSpacer können Sie mehrere räumliche Bereiche erstellen und in einem räumlichen Layout platzieren. Mit SubspaceModifier können Sie das Layout anpassen.

  • Komponenten für die räumliche Benutzeroberfläche: Diese Elemente können in Ihrer 2D-Benutzeroberfläche wiederverwendet werden. Ihre räumlichen Attribute sind nur sichtbar, wenn die räumlichen Funktionen aktiviert sind.

    • SpatialDialog: Der Bereich wird in der Z‑Tiefe etwas nach hinten verschoben, um ein erhöhtes Dialogfeld anzuzeigen.
    • SpatialPopUp: Der Bereich wird in der Z‑Tiefe etwas nach hinten verschoben, um ein erhöhtes Pop-up anzuzeigen.
    • SpatialElevation: Mit SpatialElevationLevel können Sie Höhenunterschiede hinzufügen.
  • SpatialCapabilities: Die standortbezogenen Funktionen können sich ändern, wenn Nutzer mit Ihrer App oder dem System interagieren, oder sogar von Ihrer App selbst geändert werden, z. B. wenn Sie in den Home Space oder Full Space wechseln. Um Probleme zu vermeiden, muss Ihre App nach LocalSpatialCapabilities.current suchen, um zu ermitteln, welche APIs in der aktuellen Umgebung unterstützt werden. isSpatialUiEnabled: Räumliche UI-Elemente (z.B. SpatialPanel) isContent3dEnabled: 3D-Objekte isAppEnvironmentEnabled: Die Umgebung isPassthroughControlEnabled: Ob die Anwendung den Passthrough-Status steuern kann isSpatialAudioEnabled: Raumklang

Bekannte Probleme

  • Derzeit ist ein Mindest-SDK von 30 erforderlich, um Jetpack Compose für XR zu verwenden. Als Workaround können Sie den folgenden Manifesteintrag <uses-sdk tools:overrideLibrary="androidx.xr.scenecore, androidx.xr.compose"/> hinzufügen, um mit einer MinSDK von 23 zu erstellen und auszuführen.
  • Für Jetpack XR-Apps muss derzeit die Berechtigung android.permission.SCENE_UNDERSTANDING im AndroidManifest angefordert werden.
  • Wenn eine App mithilfe der Property PROPERTY_XR_ACTIVITY_START_MODE im Manifest direkt im Vollbildschirm gestartet wird, werden Aktivitäten/Anwendungen zuerst im privaten Bereich geöffnet, bevor sie in den Vollbildschirm wechseln.
  • glTFs in Volume-Composables flackern anfangs möglicherweise an der falschen Stelle.
  • Wenn Sie ein SpatialDialog-Element in einem Bereich verwenden, der stark verschoben wurde, werden die Inhalte in die falsche Richtung verschoben.