Jetpack Compose para XR

Crie de forma declarativa layouts de interface espacial que aproveitem os recursos espaciais do Android XR.
Atualização mais recente Versão estável Versão candidata a lançamento Versão Beta Versão Alfa
7 de maio de 2025 - - - 1.0.0-alpha04

Declarar dependências

Para adicionar uma dependência ao XR Compose, adicione o repositório Maven do Google ao seu projeto. Leia Repositório Maven do Google para ver mais informações.

Adicione as dependências dos artefatos necessários ao arquivo build.gradle do seu app ou módulo:

Groovy

dependencies {
    implementation "androidx.xr.compose:compose:1.0.0-alpha04"

    // Use to write unit tests
    testImplementation "androidx.xr.compose:compose-testing:1.0.0-alpha04"
}

Kotlin

dependencies {
    implementation("androidx.xr.compose:compose:1.0.0-alpha04")

    // Use to write unit tests
    testImplementation("androidx.xr.compose:compose-testing:1.0.0-alpha04")
}

Para mais informações sobre dependências, consulte Adicionar dependências de build.

Feedback

Seu feedback ajuda a melhorar o Jetpack. Avise se você descobrir novos problemas ou tiver ideias para melhorar esta biblioteca. Consulte os problemas conhecidos nesta biblioteca antes de criar um novo. Adicione seu voto a um problema clicando no botão de estrela.

Criar novo problema

Consulte a documentação do Issue Tracker para saber mais.

Versão 1.0

Versão 1.0.0-alpha04

7 de maio de 2025

Lançamento de androidx.xr.compose:compose:1.0.0-alpha04 e androidx.xr.compose:compose-testing:1.0.0-alpha04. A versão 1.0.0-alpha04 contém estas confirmações.

Novos recursos

  • Adição da interface CompositionLocalConsumerSubspaceModifierNode para permitir que tipos SubspaceModifier personalizados acessem valores locais de composição.
  • Uma nova API SpatialPanel foi adicionada, que segue o estilo de implementação AndroidView do Compose e descontinua a ViewBased SpatialPanel anterior
  • Foi adicionado o objeto complementar VolumeConstraints.Unbounded, que representa restrições ilimitadas.
  • Foi adicionado SubspaceModifier.onPointSourceParams para permitir uma fonte de áudio espacializada.
  • Um ApplicationSubspace público foi adicionado, oferecendo VolumeConstraints opcional para definir uma área 3D em que o app pode renderizar conteúdo espacial. Por padrão, se nenhuma restrição for especificada, o subespaço será limitado pelo campo de visão atual da SpatialUser em largura e altura. Os usuários podem fornecer restrições para serem usadas caso o campo de visão não possa ser determinado. Caso contrário, os valores de largura e altura padrão do campo de visão serão usados.
  • Foi adicionado SpatialExternalSurface, que pode ser usado para renderizar conteúdo estereoscópico. O SpatialExternalSurface é personalizável com modificadores (exceto Alfa) e um efeito de borda suave.
  • Adicionamos um novo modificador de subespaço pointerHoverIcon que permite aos usuários definir o ícone do ponteiro espacial.

Mudanças na API

  • A restrição RequiresApi(34) foi removida de todos os pacotes do Jetpack XR. Essa restrição era redundante, porque o Jetpack XR só está disponível em dispositivos com nível 34 da API ou mais recente. (Iae0f8)
  • Os projetos lançados com o Kotlin 2.0 exigem o KGP 2.0.0 ou mais recente para serem consumidos. (Idb6b5).
  • O processamento de "Voltar" agora funciona em painéis espaciais sem atividades incorporadas. Para que o processamento de retorno funcione, é necessário especificar android:enableOnBackInvokedCallback="true" no manifesto do Android.
  • O backhandling agora vai funcionar em diálogos espaciais. Para que o backhandling funcione, é necessário especificar android:enableOnBackInvokedCallback="true" no manifesto do Android.
  • Os SpatialPanels baseados no Compose e na visualização agora podem ser dimensionados com base no conteúdo.
  • Agora, os desenvolvedores podem definir os próprios valores SpatialElevationLevel personalizados e não estão limitados aos níveis predefinidos.
  • Agora, o nível de elevação do Orbiter pode ser personalizado pelo parâmetro elevation.
  • O subespaço agora pode ser limitado pelo campo de visão do SpatialUser em largura e altura por padrão. Se não for possível determinar o campo de visão, os valores de largura e altura padrão serão usados.
  • Foram adicionados novos callbacks onMoveStart e onMoveEnd ao modificador Movable. Os callbacks onMoveStart e onMoveEnd são chamados quando o usuário começa e termina de mover um elemento combinável de subespaço com o modificador móvel.
  • O parâmetro name foi removido das APIs espaciais, como SpatialRow e SpatialPanel. Para depurar árvores de composição espacial, use SubspaceModifier.testTag.
  • Remoção de uma sobrecarga de SpatialPopup sem suporte que tem apenas spatialElevationLevel e content. Use a interface que oferece suporte a onDimissRequest.
  • O callback onPoseChange do modificador Movable foi removido. Use onMove.
  • SubspaceModifiers não vai mais aplicar os efeitos se eles estiverem desconectados ou em processo de desconexão.
  • A API SpatialRow foi dividida em SpatialRow e SpatialCurvedRow. Se você usava o parâmetro curveRadius de SpatialRow, use SpatialCurvedRow agora, que oferece o mesmo comportamento.
  • MainPanel e ActivityPanel não têm mais barras de título quando executados em uma imagem do sistema igualmente recente.
  • Os modificadores Alfa e Escala agora podem ser empilhados e vão multiplicar os valores para o valor Alfa ou Escala aplicado.
  • O callback onPoseChange do modificador Movable foi otimizado para realizar movimentos de pose mais suaves.
  • Os modificadores móveis e redimensionáveis agora vão executar os callbacks na linha de execução principal para garantir que as mudanças de estado acionem a recomposição.
  • Adição de observação de estado às fases de layout e medição para garantir que as mudanças de estado em SubspaceLayout acionem o redimensionamento.
  • Atualizações otimizadas da cadeia de modificadores para reutilizar melhor os modificadores atuais.

Correções de bugs

  • O carregamento é interrompido quando um SpatialDialog é mostrado. (Ic4594).
  • As solicitações de redimensionamento feitas enquanto os nós modificadores estão desconectados agora serão ignoradas.
  • As fases de relayout acionadas pelos modificadores Movable e Resizable foram removidas.
  • Corrigimos uma falha no elemento combinável MainPanel() que ocorria quando uma das dimensões era definida como zero, diretamente ou durante um cálculo de layout, por exemplo, um cálculo SpatialRow/SpatialColumn. O painel será ocultado. Essa correção aborda especificamente falhas durante a fase de layout. O redimensionamento do painel para zero pela interação do usuário será processado separadamente. O painel oculto não tem recursos de interface.
  • Correção do problema com maintainAspectRatio do modificador redimensionável. A proporção agora será mantida.
  • Correção de um problema com subespaços aninhados, em que eles eram posicionados incorretamente para um único frame.
  • Correção de um problema em que os cantos arredondados às vezes não eram aplicados quando deveriam.
  • NestedSubspaces não vai mais aparecer em um frame no local errado.

Versão 1.0.0-alpha03

26 de fevereiro de 2025

Lançamento de androidx.xr.compose:compose:1.0.0-alpha03 e androidx.xr.compose:compose-testing:1.0.0-alpha03, sem mudanças significativas desde a última versão Alfa. A versão 1.0.0-alpha03 contém estas confirmações.

Versão 1.0.0-alpha02

12 de fevereiro de 2025

Lançamento de androidx.xr.compose:compose:1.0.0-alpha02 e androidx.xr.compose:compose-testing:1.0.0-alpha02. A versão 1.0.0-alpha02 contém estas confirmações.

Novos recursos

  • O painel de atividades agora pode ocultar o conteúdo quando uma caixa de diálogo espacial é ativada.
  • A API Orbiter agora pode ser usada em contextos SubspaceComposable e vai anexar Orbiters ao elemento combinável pai mais próximo com base em SubspaceLayout.
  • LayoutCoordinatesAwareModifierNode foi introduzido para permitir modificadores personalizados com base no posicionamento.
  • Foram adicionados métodos de ciclo de vida de anexação/remoção a SubspaceModifier.Node.
  • scaleWithDistance foi adicionado ao modificador móvel. Quando scaleWithDistance está ativado, o elemento de subespaço movido aumenta ou diminui. Ele também vai manter qualquer escala explícita que tinha antes do movimento.

Mudanças na API

  • SessionCallbackProvider foi removido em favor de SpatialCapabilities.

Outras mudanças

  • Reduzimos minSDK para 24. Todas as APIs do Jetpack XR continuam exigindo a API 34 no momento da execução.
  • Os construtores Orbiter EdgeOffset.inner, EdgeOffset.outer e EdgeOffset.overlap não são mais métodos @Composable, o que permite que eles sejam usados em contextos não combináveis.
  • Atualizamos os níveis de elevação espacial para corresponder à especificação de UX mais recente.
  • Implementar a interface SubspaceSemanticsInfo em MeasurableLayout.
  • SubspaceModifierElement foi renomeado como SubspaceModifierNodeElement

Correções de bugs

  • Correções para estabilizar a ordenação de SubspaceModifier. O SubspaceModifier precisa funcionar de maneira mais confiável. O deslocamento, a rotação, a escala, a movimentação e o modificador redimensionável agora podem ser usados em qualquer ordem.

Versão 1.0.0-alpha01

12 de dezembro de 2024

Lançamento de androidx.xr.compose:compose-*1.0.0-alpha01.

Recursos da versão inicial

  • Versão inicial para desenvolvedores do Jetpack Compose para XR. Use conceitos familiares do Compose, como linhas e colunas, para criar layouts de interface espacial em XR, seja para portar um app 2D para XR ou criar um novo app XR do zero. Essa biblioteca oferece elementos combináveis espaciais e de subespaço, como painéis e orbitadores espaciais, que permitem colocar a interface 2D do Compose ou baseada em Views em um layout espacial. Ele apresenta o elemento combinável do subespaço de volume, que permite posicionar entidades do SceneCore, como modelos 3D, em relação à sua interface. Saiba mais neste guia para desenvolvedores:

    • Subspace: esse elemento combinável pode ser colocado em qualquer lugar na hierarquia da interface do app, permitindo que você mantenha layouts para interfaces 2D e espaciais sem perder o contexto entre os arquivos. Isso facilita o compartilhamento de elementos como a arquitetura do app entre XR e outros formatos sem precisar elevar o estado por toda a árvore de interface ou reprojetar o app.

    • SpatialPanel: um painel espacial é um elemento combinável que permite exibir o conteúdo do app. Por exemplo, você pode exibir a reprodução de vídeo, imagens estáticas ou qualquer outro conteúdo em um painel espacial.

    • Orbiter: um orbiter é um componente de interface espacial. Ele foi projetado para ser anexado a um painel espacial correspondente e contém itens de navegação e ação contextual relacionados a esse painel. Por exemplo, se você criou um painel espacial para mostrar conteúdo de vídeo, é possível adicionar controles de reprodução de vídeo dentro de um orbitador.

    • Volume: posicione entidades do SceneCore, como modelos 3D, em relação à sua interface.

  • Layout espacial: é possível criar vários painéis espaciais e colocá-los em um layout espacial usando SpatialRow, SpatialColumn, SpatialBox e SpatialLayoutSpacer. Use SubspaceModifiers para personalizar seu layout.

  • Componentes de interface espacial: esses elementos podem ser reutilizados na interface 2D, e os atributos espaciais só ficam visíveis quando os recursos espaciais estão ativados.

    • SpatialDialog: o painel é empurrado ligeiramente para trás na profundidade Z para mostrar uma caixa de diálogo elevada.
    • SpatialPopUp: o painel é empurrado ligeiramente para trás na z-depth para mostrar um pop-up elevado.
    • SpatialElevation: o SpatialElevationLevel pode ser definido para adicionar elevação.
  • SpatialCapabilities: as capacidades espaciais podem mudar à medida que os usuários interagem com o app ou o sistema, ou até mesmo pelo próprio app, por exemplo, ao mudar para o Espaço compacto ou o Espaço total. Para evitar problemas, o app precisa verificar o LocalSpatialCapabilities.current para determinar quais APIs têm suporte no ambiente atual. isSpatialUiEnabled: elementos da IU espacial (por exemplo, SpatialPanel) isContent3dEnabled: objetos 3D isAppEnvironmentEnabled: o ambiente isPassthroughControlEnabled: se o aplicativo pode ou não controlar o estado de passagem isSpatialAudioEnabled: áudio espacial

Problemas conhecidos

  • No momento, um minSDK de 30 é necessário para usar o Jetpack Compose para XR. Como solução alternativa, adicione a seguinte entrada de manifesto <uses-sdk tools:overrideLibrary="androidx.xr.scenecore, androidx.xr.compose"/> para poder criar e executar com um minSDK de 23.
  • Atualmente, os apps do Jetpack XR exigem a solicitação da permissão android.permission.SCENE_UNDERSTANDING no AndroidManifest.
  • Quando um app é iniciado diretamente no Espaço Ampliado usando a propriedade PROPERTY_XR_ACTIVITY_START_MODE no manifesto, as atividades/apps são abertas inicialmente no Espaço da casa antes de fazer a transição para o Espaço Ampliado.
  • Os glTFs em elementos combináveis de volume podem piscar inicialmente no local errado.
  • Usar uma SpatialDialog em um painel que foi movido significativamente vai empurrar o conteúdo na direção errada.