Как создать пространственный интерфейс для существующих приложений Android на основе View

Поддерживаемые XR-устройства
Это руководство поможет вам создавать продукты для таких XR-устройств.
XR-шлемы
Проводные XR-очки

Использование фреймворка Android Jetpack Compose – лучший способ воспользоваться преимуществами последних достижений в разработке пользовательского интерфейса Android и убедиться, что ваше приложение соответствует лучшим отраслевым практикам.

Однако если вы ещё не перешли на него и хотите добавить пространственные функции в приложение на основе Android Views, вы можете воспользоваться одним из описанных ниже подходов.

Повторное использование существующих представлений в SpatialPanel

Хотя SpatialPanel входит в библиотеку Jetpack Compose for XR, он также принимает представления. При использовании Subspace в MainActivity поместите существующее представление в SpatialPanel, как показано в примере ниже.

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

Как использовать API совместимости Android Views и Compose

Ознакомьтесь с руководством по совместимости Views и Compose. В этой документации рассказывается, как использовать эти фреймворки вместе, и приводятся ссылки на примеры кода.

Как использовать ComposeView, чтобы добавить пространственные панели и орбитеры в существующий фрагмент

Используйте ComposeView в макете XML, чтобы добавлять composable-функции и создавать контент для расширенной реальности. Используйте View binding или findViewById, чтобы найти ComposeView в функции onCreateView().

Подробнее о рекомендациях по работе с 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. Если вы добавляете пространственные функции в приложение на основе представлений, вы можете продолжить использовать существующий код пользовательского интерфейса в Compose for XR или работать напрямую с Session Jetpack SceneCore.

Вы можете создавать панели непосредственно из SceneCore с помощью PanelEntity. Задайте размер панели в метрах с помощью dimensions или в пикселях с помощью pixelDimensions. Вы можете сделать панели перемещаемыми или изменяемыми по размеру, используя соответствующие компоненты. Подробнее о том, как добавить объектам общее поведение…

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