Android 뷰 기반 앱의 UI 개발

Compose 방식으로 시도
Jetpack XR SDK를 사용하는 Jetpack Compose는 Android XR에 권장되는 UI 도구 키트입니다.

Android Jetpack Compose 프레임워크를 사용하면 Android UI 개발의 최신 발전을 활용하고 애플리케이션이 업계 권장사항을 준수하는지 확인할 수 있습니다.

하지만 아직 이전하지 않았고 Android 뷰 기반 앱을 공간화하려는 경우 몇 가지 접근 방식을 취할 수 있습니다.

SpatialPanels 내에서 기존 뷰 재사용

SpatialPanel는 XR용 Jetpack Compose 라이브러리의 일부이지만 뷰도 허용합니다. MainActivity에서 Subspace를 사용하는 경우 다음 예와 같이 기존 뷰를 SpatialPanel에 배치합니다.

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

Android 뷰 및 Compose 상호 운용성 API 사용

뷰와 Compose 간의 상호 운용성에 관한 가이드를 참고하세요. 이 문서에서는 이러한 프레임워크를 함께 사용하는 방법을 다루며 사용할 수 있는 코드 샘플 링크를 제공합니다.

ComposeView를 사용하여 기존 프래그먼트에 공간 패널과 오비터 추가

XML 레이아웃에서 ComposeView를 사용하여 컴포저블을 추가하고 새로운 XR 콘텐츠를 만드세요. 뷰 결합 또는 findViewById을 사용하여 onCreateView() 함수에서 ComposeView을 찾습니다.

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 XRJetpack SceneCore를 기반으로 빌드됩니다. 뷰 기반 앱을 공간화하는 경우 Compose for XR 내에서 기존 UI 코드를 계속 사용하거나 Jetpack SceneCore의 Session를 직접 사용할 수 있습니다.

PanelEntity를 사용하여 SceneCore에서 직접 패널을 빌드할 수 있습니다. dimensions를 사용하여 패널의 크기를 미터 단위로 설정하거나 pixelDimensions를 사용하여 픽셀 단위로 설정합니다. 해당 구성요소를 사용하여 패널을 이동 가능하거나 크기 조절 가능하도록 선택할 수 있습니다. 자세한 내용은 엔티티에 일반적인 동작 추가를 참고하세요.

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