子空間是應用程式內 3D 空間的分區,可在其中放置 3D 模型、建構 3D 版面配置,以及為其他 2D 內容加上深度。只有在啟用空間化功能時,系統才會算繪子空間。在住家空間或非 XR 裝置上,系統會忽略該子空間中的任何程式碼。
您可以使用 SpatialPanel、SpatialRow 和 SpatialColumn 等子空間可組合函式建立版面配置,並在 3D 空間中放置 2D 內容。如要放置 3D 內容,請使用適當的 Subspace Composable,例如 3D 模型的 SceneCoreEntity 和立體圖像的 SpatialExternalSurface。部分 XR 元件 (例如 Orbiter 或 SpatialDialog) 是標準的 2D 可組合函式,可在 2D UI 階層中的任何位置使用,但 SubspaceComposable 必須在應用程式的子空間中叫用。如要執行這項操作,請使用 Subspace 子空間可組合函式。
關於子空間階層
最上層的 Subspace 是應用程式叫用的最外層子空間。每次呼叫 Subspace 都會建立新的獨立空間 UI 層級。不會沿用任何父項的空間位置、方向或比例。Subspace
如要在 SpatialPanel、Orbiter、SpatialPopup 或其他元件中建立內嵌或巢狀 Subspace,請使用 PlanarEmbeddedSubspace。
PlanarEmbeddedSubspace 與 Subspace 的主要差異有兩點:
- 這些檢視區塊會參與叫用它們的 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
為應用程式新增子空間
以下程式碼範例說明如何在應用程式中新增 Subspace 和 PlanarEmbeddedSubspace:
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 {} } }
詳情請參閱 Subspace 和 PlanarEmbeddedSubspace 的完整參考說明文件。