为基于 Android 视图的现有应用构建空间界面

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

使用 Android Jetpack Compose 框架是充分利用 Android 界面开发最新进展并验证应用是否符合行业最佳实践的最佳方式。

不过,如果您尚未迁移,并且正在努力对基于 Android 视图的应用进行空间化处理,则可以采取以下几种方法。

在 SpatialPanel 中重复使用现有视图

虽然 SpatialPanel 是 Jetpack Compose for XR 库的一部分,但它也接受 View。在 MainActivity 中使用 Subspace 时,请将现有视图放入 SpatialPanel 中,如以下示例所示。

setContent {
    Subspace {
        SpatialPanel(
            modifier = SubspaceModifier.height(500.dp).width(500.dp).depth(25.dp)
        ) { MyCustomView(this@ActivityWithSubspaceContent) }
    }
}

使用 Android View 和 Compose 互操作性 API

请参阅关于 View 与 Compose 之间互操作性的指南。本文档介绍了如何结合使用这些框架,并提供了可供您使用的代码示例的链接。

使用 ComposeView 向现有 fragment 添加空间面板和轨道器

在 XML 布局中使用 ComposeView 添加可组合项并创建新的 XR 内容。使用视图绑定或 findViewById 在 onCreateView() 函数中查找 ComposeView。

详细了解 ComposeView 指南。

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    val view = inflater.inflate(R.layout.example_fragment, container, false)
    view.findViewById<ComposeView>(R.id.compose_view).apply {
        // Dispose of the Composition when the view's LifecycleOwner
        // is destroyed
        setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
        setContent {
            // In Compose world
            SpatialPanel(SubspaceModifier.height(500.dp).width(500.dp)) {
                Text("Spatial Panel with Orbiter")
            }
        }
    }
    return view
}

直接使用 Jetpack SceneCore 库

Compose for XR 基于 Jetpack SceneCore 构建。如果您要对基于 View 的应用进行空间化处理,可以继续在 Compose for XR 中使用现有的界面代码,也可以选择直接使用 Jetpack SceneCore 的 Session。

您可以使用 PanelEntity 直接从 SceneCore 构建面板。使用 dimensions 设置面板的大小(以米为单位),或使用 pixelDimensions 设置面板的大小(以像素为单位)。您可以使用相应的组件,让面板可移动或可调整大小。如需了解详情,请参阅向实体添加常见行为。

val panelContent = MyCustomView(this)
val panelEntity = PanelEntity.create(
    session = xrSession,
    view = panelContent,
    pixelDimensions = IntSize2d(500, 500),
    name = "panel entity"
)