Criar uma interface espacial para apps baseados em visualizações do Android

Dispositivos XR relevantes
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos XR.
Headsets XR
Óculos XR com fio

Usar o framework do Android Jetpack Compose é a melhor maneira de aproveitar os avanços mais recentes no desenvolvimento de interfaces do Android e verificar se o aplicativo continua atualizado com as práticas recomendadas do setor.

No entanto, se você ainda não migrou e está trabalhando para espacializar um app baseado em Android Views, há algumas abordagens que podem ser usadas.

Reutilizar as visualizações atuais em SpatialPanels

Embora um SpatialPanel faça parte da biblioteca Jetpack Compose para XR, ele também aceita visualizações. Ao usar Subspace na MainActivity, coloque uma visualização atual em um SpatialPanel, conforme mostrado no exemplo abaixo.

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

Usar as APIs de interoperabilidade do Compose e das visualizações do Android

Consulte as orientações sobre interoperabilidade entre visualizações e o Compose. Esta documentação aborda o uso desses frameworks juntos e contém links para exemplos de código que você pode usar.

Usar uma ComposeView para adicionar painéis espaciais e orbitadores a um fragmento atual

Use um ComposeView no layout XML para adicionar elementos combináveis e criar conteúdo de XR. Use a vinculação de visualizações ou findViewById para encontrar o ComposeView na função onCreateView().

Leia mais sobre as orientações do 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
}

Trabalhar diretamente com a biblioteca SceneCore do Jetpack

O Compose para XR é baseado no Jetpack SceneCore. Se você estiver espacializando um app baseado em visualizações, poderá continuar usando o código de interface no Compose para XR ou trabalhar diretamente com o Session do Jetpack SceneCore.

Você pode criar painéis diretamente do SceneCore usando PanelEntity. Defina o tamanho do painel em metros usando dimensions ou em pixels usando pixelDimensions. É possível tornar os painéis móveis ou redimensionáveis usando os componentes correspondentes. Para mais informações, consulte Adicionar comportamento comum a entidades.

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