在應用程式中新增子區

適用 XR 裝置
這份指南可協助您為這類 XR 裝置打造體驗。
XR 頭戴式裝置
有線 XR 眼鏡

子空間是應用程式內 3D 空間的分區,可在其中放置 3D 模型、建構 3D 版面配置,以及為其他 2D 內容加上深度。只有在啟用空間化功能時,系統才會算繪子空間。在住家空間或非 XR 裝置上,系統會忽略該子空間中的任何程式碼。

您可以使用 SpatialPanelSpatialRowSpatialColumn 等子空間可組合函式建立版面配置,並在 3D 空間中放置 2D 內容。如要放置 3D 內容,請使用適當的 Subspace Composable,例如 3D 模型的 SceneCoreEntity 和立體圖像的 SpatialExternalSurface。部分 XR 元件 (例如 OrbiterSpatialDialog) 是標準的 2D 可組合函式,可在 2D UI 階層中的任何位置使用,但 SubspaceComposable 必須在應用程式的子空間中叫用。如要執行這項操作,請使用 Subspace 子空間可組合函式。

關於子空間階層

最上層的 Subspace 是應用程式叫用的最外層子空間。每次呼叫 Subspace 都會建立新的獨立空間 UI 層級。不會沿用任何父項的空間位置、方向或比例。Subspace

如要在 SpatialPanelOrbiterSpatialPopup 或其他元件中建立內嵌或巢狀 Subspace,請使用 PlanarEmbeddedSubspace

PlanarEmbeddedSubspaceSubspace 的主要差異有兩點:

  • 這些檢視區塊會參與叫用它們的 2D 版面配置。也就是說,子空間的高度和寬度會受到 2D 父項版面配置的高度和寬度限制。
  • 這些函式會以所叫用實體的子項身分運作。也就是說,如果您呼叫巢狀內嵌於 SpatialPanel 內部的子空間可組合項,該子空間就是呼叫該子空間的 SpatialPanel 的子項。

PlanarEmbeddedSubspace 的這些行為可啟用下列功能:

  • 將子項與父項實體一起移動
  • 使用偏移量 SubspaceModifier 偏移子項的位置
  • 呈現懸浮在 2D UI 上方的 3D 物件,並符合 2D 版面配置中適當空間的高度和寬度

調整子空間的版面配置

在 Android XR 上,應用程式的版面配置預設會繫結至完整空間模式的 VolumeConstraints Subspace。因此,您應考量使用者可見的空間大小,並據此調整版面配置。recommendedContentBoxInFullSpace 提供 ActivitySpace 內定界框的特定尺寸,以便將內容放置在使用者視野內。

應用程式的主要內容應位於這個方塊內。如果內容必須超出建議範圍,請考慮採用可鼓勵使用者移動頭部探索空間的版面配置。您可以套用自訂大小的修飾符 (例如 SubspaceModifier.requiredSizeIn),覆寫 recommendedContentBoxInFullSpace 的預設限制。如為無界限行為,請設定 allowUnboundedSubspace = true

使用目前的 Session 呼叫 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 的完整參考說明文件。