默认情况下,您的 2D 移动或大屏 Android 应用可在 Android XR 中运行,并以 3D 空间内的 2D 面板形式显示。您可以添加沉浸式 XR 功能来增强现有的 2D Android 应用,将其从平面屏幕体验过渡到动态 3D 环境。
在将 Android 应用引入 XR 时,请考虑以下重要原则。
- 空间功能:Android XR 为您的应用提供了各种空间功能,但您无需实现每项功能。有策略地实现那些与应用的视觉层次结构、布局和用户体验历程相辅相成的动画。考虑加入自定义环境和多个面板,打造真正身临其境的体验。请参阅空间界面设计指南,确定空间元素的最佳集成方式。
- 自适应界面:XR 让您能够灵活设计宽敞的界面,无缝适应无限画布和可自由调整大小的窗口。其中一个最重要的考虑因素是,使用我们的大屏设计指南,针对这种宽敞的环境优化应用布局。即使您的应用目前仅支持移动设备,您仍然可以利用引人入胜的环境来提升用户体验,但针对大屏设备优化的界面是针对 Android XR 优化应用的最佳方式之一。
- 界面框架:我们建议您使用 Jetpack Compose for XR 构建界面。如果您的应用依赖于 View,请参阅在 XR 中使用 View,详细了解如何在处理 View 时利用 Compose 互操作性,或评估直接使用 Jetpack SceneCore 库。
- 在 Play 商店中发布:如需验证您的 XR 增强型应用是否可在 Play 商店中被发现,请执行以下操作:
- 考虑通过移除任何不必要的功能要求来简化应用。
- 请在 Google Play 管理中心内验证您的应用未选择退出 XR 发布,以免您的应用被排除在 Play 商店搜索结果之外。
将 2D 界面组件转换为 3D
遵循这些提示,可以让您的应用感觉像是专为 XR 优化过的。
- 优先考虑大屏兼容性:确保应用的界面遵循大屏设计原则,以帮助确保在广阔的 XR 环境中实现最佳的文本和内容可读性。
- 策略性地使用空间功能:确定应用用户体验历程中的关键时刻,在这些时刻加入空间功能可提升体验,并充分利用平台的独特功能。
- 放置空间面板时,请考虑用户舒适度:使用空间面板设计布局时,请将其放置在与用户保持舒适距离的位置,以免让用户感到不适或距离过近。
- 对空间布局使用自适应界面:利用窗格和渐进式显示等自适应界面概念,将布局有效分解为多个空间面板,从而优化信息呈现。
- 将轨道器用于持久性元素和模式:将轨道器保留用于持久性和上下文用户体验元素,例如导航和控件。限制使用轨道器,以保持清晰并避免杂乱。
- 谨慎使用高度:对保持静止且不随内容滚动的临时组件应用空间高度。避免提升大面积区域,以防止视觉不适并保持平衡的视觉层次结构。
Jetpack Compose for XR 引入了可管理 XR 增强功能的新组件,因此您无需自行管理。例如,您可以使用 SpatialPopup 和 SpatialDialog 替换其 2D 对应项。当空间界面不可用时,这些组件会显示为典型的 2D 界面,并在可以时显示应用的空间界面。使用这些组件非常简单,只需更改一行代码,即可替换相应的 2D 界面元素。
将对话框转换为 SpatialDialog
// Previous approach Dialog( onDismissRequest = onDismissRequest ) { MyDialogContent() } // New XR differentiated approach SpatialDialog( onDismissRequest = onDismissRequest ) { MyDialogContent() }
将弹出式窗口转换为 SpatialPopup
// Previous approach Popup(onDismissRequest = onDismissRequest) { MyPopupContent() } // New XR differentiated approach SpatialPopup(onDismissRequest = onDismissRequest) { MyPopupContent() }
提升 2D 界面元素
如果您想通过更精细的控制来提升界面,我们提供了 SpatialElevation,让您能够将应用中的任何可组合项提升到您使用 SpatialElevationLevel 设置的空间面板上方的 Z 轴级别。
这有助于吸引用户的注意力、创建更好的层次结构并提高易读性,如以下示例所示。
// Elevate an otherwise 2D Composable (signified here by ComposableThatShouldElevateInXr). SpatialElevation(elevation = SpatialElevationLevel.Level4) { ComposableThatShouldElevateInXr() }
代码要点
- 请勿对大面积区域和平面(例如底部动作条和侧边动作条)进行空间化或提升。
- 请勿提升可随内容滚动的界面元素。
将 2D 组件迁移到轨道器
轨道器是浮动元素,通常包含用户可以与之互动的控件。轨道器可以锚定到空间面板或其他实体(例如空间布局)。它们可为内容提供更多空间,让用户能够快速访问功能,而不会遮挡主要内容。

非空间化侧边导航栏

空间化(XR 适配)侧边导航栏
以下示例代码展示了如何将 2D 界面组件迁移到 Orbiter。
// Previous approach NavigationRail() // New XR differentiated approach Orbiter( position = OrbiterPosition.TopStart( horizontalEdgeAlignment = OrbiterPosition.EdgeAlignment.Outside, offset = DpVolumeOffset(x = dimensionResource(R.dimen.start_orbiter_padding)) ) ) { NavigationRail() }
关于轨道飞行器的要点
- 轨道器是旨在将现有界面元素附加到空间面板的组件
- 请参阅我们的 Android XR 应用设计指南,了解要为轨道器迁移哪些元素,以及要避免哪些模式。
- 我们建议仅调整少数导航组件,例如侧边导航栏、顶部应用栏或底部应用栏。
- 如果未启用空间界面,则不会显示 Orbiter。例如,它们不会显示在 Home Space 中,也不会显示在手机、平板电脑和可折叠设备等设备上。
将 2D 组件迁移到空间面板
空间面板是 Android XR 应用界面的基本构建块。
面板用作界面元素、互动组件和沉浸式内容的容器。在设计时,您可以添加轨道器等组件,以便用户进行控制,并从空间上提升界面元素,以引起用户对特定互动的注意。
代码要点
- 请参阅 Android XR 应用设计指南,验证哪些元素应迁移到面板,以及应避免哪些模式。
- 遵循空间面板放置的最佳实践:
- 面板应在距离用户眼睛 1.5 米的中心位置生成。
- 内容应显示在用户视野范围的中心 41° 区域。
- 面板会随着用户的移动而移动。锚定仅适用于透视。
- 请坚持使用系统推荐的 32 dp 圆角面板。
- 触摸目标应为 56 dp,且不小于 48 dp。
- 保持对比度以确保可读性,尤其是在使用任何透明背景时。
- 遵循 Android 设计颜色原则,并使用 Material Design 颜色系统为应用实现深色和浅色主题。
- 将空间面板 API 与现有界面元素搭配使用。
将 2D 界面迁移到单个空间面板
默认情况下,您的应用会在主共享空间中显示单个面板。了解如何在主共享空间和全沉浸空间之间切换。如需将该内容引入全沉浸空间,您可以使用 SpatialPanel。
以下示例说明了如何实现此功能。
if (LocalSpatialCapabilities.current.isSpatialUiEnabled) { Subspace { SpatialPanel( modifier = SubspaceModifier.movable().resizable(), ) { AppContent() } } } else { AppContent() }
将 2D 界面迁移到多个空间面板
您可以为应用界面使用单个空间面板,也可以将 2D 界面迁移到多个空间面板。如果您选择为应用界面使用多个面板,则可以定位和旋转面板(类似于在 2D 模式下布局界面)。首先,您需要明确设计愿景,确定要实现的目标,然后可以使用空间界面布局 API(SpatialBox、SpatialRow、SpatialColumn、SpatialSpacer、SpatialAlignment)和子空间修饰符来定位和旋转面板。
在实现多个面板时,您需要避免一些关键模式。
- 避免面板重叠,以免遮挡用户查看关键信息。
- 避免使用过多面板让用户产生负担。
- 避免将面板放置在不舒适或不显眼的位置。例如:放置在用户身后的面板很难被注意到。
- 如需详细了解如何开发空间界面,请参阅我们的完整指南。

非空间化内容

Orbiter 中经过空间化(XR 适配)的媒体控件,以及拆分为多个空间面板的内容
SpatialRow { SpatialPanel( SubspaceModifier .width(384.dp) .height(592.dp) ) { StartSupportingPanelContent() } SpatialPanel( SubspaceModifier .height(824.dp) .width(1400.dp) ) { App() } SpatialPanel( SubspaceModifier .width(288.dp) .height(480.dp) ) { EndSupportingPanelContent() } }
添加空间功能
在您构思并开始将 2D 界面组件转换为 3D 之后,您还可以开始研究可以添加到应用中的其他空间功能,以便为 Android XR 打造更具差异化的体验。
检查空间功能
在决定是否显示特定界面元素时,请避免检查特定 XR 设备或模式。如果检查的是设备或模式,而不是 capability,则当给定设备上的 capability 随时间发生变化时,可能会导致问题。请改用 LocalSpatialCapabilities.current.isSpatialUiEnabled 直接检查必要的空间化功能,如以下示例所示。这种方法可确保您的应用正确适应各种 XR 体验,而无需在每次出现新设备或功能发生变化时进行更新。
if (LocalSpatialCapabilities.current.isSpatialUiEnabled) { SupportingInfoPanel() } else { ButtonToPresentInfoModal() } // Similar check for audio val spatialAudioEnabled = LocalSpatialCapabilities.current.isSpatialAudioEnabled
使用环境功能改变用户周围的环境
如果您想通过改变用户周围的环境在应用中营造沉浸感,可以使用环境来实现。在代码中添加环境是一项简单的更改,您可以在不显著影响应用现有界面的情况下进行。如需详细了解如何设置环境,请务必查看我们的完整指南。
添加 3D 内容
3D 内容(例如 3D 模型和空间视频)有助于打造更具沉浸感的体验,并增加空间理解。只有在空间功能可用时,您的应用才能显示 3D 内容,因此您需要先检查空间功能是否可用。
请参阅相应指南,了解如何添加 3D 模型、空间视频或空间音频。