空间功能可能因设备而异,并且会随着用户与应用或系统的互动而发生变化。它们甚至可以由应用本身更改,例如进入主共享空间或全沉浸空间。为避免出现问题,应用需要检查空间功能,以确定当前环境中支持哪些 API。
使用 Jetpack Compose for XR 检查空间功能
Jetpack Compose for XR 会创建一个用于检查空间功能的 Composition Local。使用此属性可检查空间界面、空间音频、环境、透视或 3D 内容是否已启用。
您可以使用 LocalSpatialCapabilities.current 来检查以下空间功能目前是否可用:
isSpatialUiEnabled:表示应用是否可以创建空间界面元素(例如SpatialPanel)。isContent3dEnabled:表示应用是否可以创建 3D 对象。isAppEnvironmentEnabled:指示应用是否可以设置环境。isPassthroughControlEnabled:指示应用是否可以控制透传状态。isSpatialAudioEnabled:指示应用是否可以使用空间音频。
以下示例展示了如何检查空间界面是否已启用:
if (LocalSpatialCapabilities.current.isSpatialUiEnabled) { Subspace { SpatialPanel( modifier = SubspaceModifier .width(1488.dp) .fillMaxHeight() ) { AppContent() } } } else { AppContent() }
使用 SceneCore 检查空间功能
使用 SceneCore 库时,您必须创建会话。创建会话后,使用会话的 scene 中的 spatialCapabilities 查询当前可用的空间功能。
SPATIAL_3D_CONTENT:相应 activity 可以创建 3D 内容。APP_ENVIRONMENT:activity 可以设置自己的环境。EMBED_ACTIVITY:相应 activity 可以在空间上嵌入另一个 activity。PASSTHROUGH_CONTROL:该 activity 可以启用或停用透传。SPATIAL_AUDIO:相应 activity 可以使用空间音频。SPATIAL_UI:activity 可以自行空间化(例如,添加空间面板)。
您还可以选择订阅回调函数 addSpatialCapabilitiesChangedListener,以便在空间功能发生变化时收到通知。
// Example 1: check if enabling passthrough mode is allowed if (xrSession.scene.spatialCapabilities.contains( SpatialCapability.PASSTHROUGH_CONTROL ) ) { xrSession.scene.spatialEnvironment.preferredPassthroughOpacity = 1f } // Example 2: multiple capability flags can be checked simultaneously: if (xrSession.scene.spatialCapabilities.contains(SpatialCapability.PASSTHROUGH_CONTROL) && xrSession.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT) ) { // ... }
使用混合模式检查设备的显示功能
在 Android XR 上,XR 头戴设备和有线 XR 眼镜的硬件功能各不相同,尤其是在显示类型方面。您可能需要调整应用界面和渲染对象的颜色,以最大限度地提高能见度,这可能会受到显示屏类型和设备所用首选混合模式的影响。DisplayBlendMode API 提供设备的混合模式渲染功能。使用此 API 可确定如何将虚拟内容添加到现实世界中。
以下是一些需要注意的混合模式类型:
ADDITIVE:通过添加红色、绿色和蓝色分量的各个像素值,将虚拟内容添加到现实世界中。系统会忽略 Alpha,黑色像素会显示为透明。ALPHA_BLEND:通过根据 Alpha 分量对像素值进行 Alpha 混合,将虚拟内容添加到现实世界中。NO_DISPLAY:设备不支持混合。
使用 Jetpack XR 运行时库中的 XrDevice.getCurrentDevice(session).getPreferredDisplayBlendMode() 检查正在使用的混合模式类型,并根据需要进行调整。