向应用添加子空间

适用的 XR 设备
本指南可帮助您为以下类型的 XR 设备打造优质体验。
扩展现实头戴设备
有线扩展现实眼镜

子空间是应用中 3D 空间的一部分,您可以在其中放置 3D 模型、构建 3D 布局,以及为原本的 2D 内容添加深度。只有在启用空间化时,系统才会渲染子空间。在主共享空间或非 XR 设备上,系统会忽略该子空间内的任何代码。

您可以使用子空间可组合项(例如 SpatialPanelSpatialRow、 和 SpatialColumn)来创建布局,并在 3D 空间中放置 2D 内容。如需放置 3D 内容,请使用适当的子空间可组合项,例如 SceneCoreEntity用于 3D 模型的 SpatialExternalSurface 和用于 立体图像。某些 XR 组件(例如 OrbiterSpatialDialog )是标准 2D 可组合项,可在 2D 界面层次结构的任何位置使用, 但必须在应用的子空间中调用 SubspaceComposable。为此,请使用 Subspace 子空间可组合项。

子空间层次结构简介

顶级 Subspace 是由应用调用的最外层子空间。每次调用 Subspace 都会创建一个新的独立空间界面层次结构。它不会继承任何父级 Subspace(它嵌套在其中)的空间位置、方向或缩放比例。

如需在 SpatialPanelOrbiterSpatialPopup 或其他组件中创建嵌入式或嵌套的 Subspace,请使用 PlanarEmbeddedSubspace

PlanarEmbeddedSubspaceSubspace 有两个主要区别:

  • 它们参与调用它们的 2D 布局。这意味着子空间的高度和宽度将受其 2D 父布局的高度和宽度的限制。
  • 它们的行为与调用它们的实体的子项相同。这意味着, 如果您调用嵌套在 SpatialPanel内的子空间可组合项,则该子空间是调用它的 SpatialPanel 的子项。

PlanarEmbeddedSubspace 的这些行为支持以下功能:

  • 随父实体移动子项
  • 使用偏移 SubspaceModifier偏移子项的位置
  • 呈现悬浮在 2D 界面上方并与 2D 布局中相应空间的高度和宽度相匹配的 3D 对象

为子空间调整布局

在 Android XR 上,默认情况下,应用的布局会绑定到 VolumeConstraintsSubspace。因此,您应考虑用户可用的可见空间量,并相应地调整布局。recommendedContentBoxInFullSpaceActivitySpace 内的边界框提供了 具体尺寸,以便将内容放置在用户的视野范围内。

应用的主要内容应适合此框。如果您有必须超出建议边界的内容,请考虑采用鼓励用户通过移动头部来探索空间的布局。您可以通过应用 基于自定义尺寸的修饰符(例如 SubspaceModifier.requiredSizeIn)来替换 recommendedContentBoxInFullSpace 的默认约束。如需使用无界行为,请设置 allowUnboundedSubspace = true

使用当前 会话 调用 recommendedContentBoxInFullSpace,以 根据需要获取这些具体尺寸。请参阅以下示例:

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

向应用添加子空间

以下代码示例展示了如何向应用添加 SubspacePlanarEmbeddedSubspace

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

如需了解详情,请参阅有关 SubspacePlanarEmbeddedSubspace 的完整参考文档。