为基于 View 的 Android 应用开发界面

试试 Compose 方式
使用 Jetpack XR SDK 的 Jetpack Compose 是 Android XR 的推荐界面工具包。

使用 Android Jetpack Compose 框架是充分利用 Android 界面开发领域的最新进展并确保应用始终遵循业界最佳实践的最佳方式。

不过,如果您尚未迁移,并且正在致力于将基于 Android View 的应用空间化,则可以采用以下几种方法。

在 SpatialPanel 中重复使用现有 View

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

setSubspaceContent {
   SpatialPanel(
       view = MyCustomView(this),
       modifier = SubspaceModifier.height(500.dp).width(500.dp).depth(25.dp)
   )
}

使用 Android View 和 Compose 互操作性 API

请参阅有关 View 和 Compose 之间互操作性的指南。本文档介绍了如何将这些框架搭配使用,并包含指向可用代码示例的链接。

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

在 XML 布局中使用 ComposeView 添加可组合项并创建新的 XR 内容。使用 [ViewBinding][ViewBinding] 在 onCreateView 函数中调用 ComposeView

详细了解 ComposeView 指南

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

直接使用 Jetpack SceneCore 库

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

您可以使用 PanelEntity 直接从 SceneCore 构建面板。使用组件使面板可移动或可调整大小。如需了解详情,请参阅向实体添加常见行为

val panelContent = MyCustomView(this)
val panelEntity = xrSession.createPanelEntity(
   panelContent,
   surfaceDimensionsPx = Dimensions(500f,500f,500f),
   dimensions = Dimensions(1f,1f,1f),
   name = "panel entity"
)