Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Porting a visionOS App to Android XR

Porting a visionOS App to Android XR

visionOSアプリをAndroid XRに移植してみた話

Google I/O Extended Tokyo 2025
https://gdg-tokyo.connpass.com/event/356777/

Avatar for Akio Itaya

Akio Itaya

July 05, 2025
Tweet

More Decks by Akio Itaya

Other Decks in Programming

Transcript

  1. Zenith for Android Check out the sample Android XR app

    on GitHub! github.com/AkkeyLab/zenith-android 3D Anime Character girl for Blender C1by CGCOOL https://skfb.ly/oyACQ
  2. @SuppressLint("RestrictedApi") @Composable fun MainSpatialContent() { val session = checkNotNull(LocalSession.current) SpatialPanel()

    { LaunchedEffect(key1 = Unit) { val model = GltfModel.create(session, "models/girl.gltf") .await() var modelEntity = GltfModelEntity.create( session = session, model = model ) } } } github.com/AkkeyLab/zenith-android
  3. @SuppressLint("RestrictedApi") @Composable fun MainSpatialContent() { val session = checkNotNull(LocalSession.current) SpatialPanel()

    { LaunchedEffect(key1 = Unit) { val model = GltfModel.create(session, "models/girl.gltf") .await() var modelEntity = GltfModelEntity.create( session = session, model = model ) } } } github.com/AkkeyLab/zenith-android
  4. @SuppressLint("RestrictedApi") @Composable fun MainSpatialContent() { val session = checkNotNull(LocalSession.current) SpatialPanel()

    { LaunchedEffect(key1 = Unit) { val model = GltfModel.create(session, "models/girl.gltf") .await() var modelEntity = GltfModelEntity.create( session = session, model = model ) } } } github.com/AkkeyLab/zenith-android
  5. @SuppressLint("RestrictedApi") @Composable fun MainSpatialContent() { val session = checkNotNull(LocalSession.current) SpatialPanel()

    { LaunchedEffect(key1 = Unit) { val model = GltfModel.create(session, "models/girl.gltf") .await() var modelEntity = GltfModelEntity.create( session = session, model = model ) modelEntity.startAnimation( loop = true, animationName = "rotate" ) } } } ⚠ アニメーションがアプリのコア機能 になる場合は 早い段階での確認 を推奨! github.com/AkkeyLab/zenith-android
  6. @SuppressLint("RestrictedApi") @Composable fun MainSpatialContent() { var selectedTab by remember {

    mutableIntStateOf(0) } SpatialPanel() { Orbiter( position = OrbiterEdge.Start, alignment = Alignment.CenterVertically, offset = EdgeOffset.inner(16.dp), shape = SpatialRoundedCornerShape(CornerSize(percent = 50)) ) { Surface() { Column() { CustomButton(...) { selectedTab = 0 } } } } } } github.com/AkkeyLab/zenith-android
  7. @SuppressLint("RestrictedApi") @Composable fun MainSpatialContent() { var selectedTab by remember {

    mutableIntStateOf(0) } SpatialPanel() { Orbiter( position = OrbiterEdge.Start, alignment = Alignment.CenterVertically, offset = EdgeOffset.inner(16.dp), shape = SpatialRoundedCornerShape(CornerSize(percent = 50)) ) { Surface() { Column() { CustomButton(...) { selectedTab = 0 } } } } } } github.com/AkkeyLab/zenith-android
  8. @SuppressLint("RestrictedApi") @Composable fun MainSpatialContent() { var selectedTab by remember {

    mutableIntStateOf(0) } SpatialPanel() { Orbiter( position = OrbiterEdge.Start, alignment = Alignment.CenterVertically, offset = EdgeOffset.inner(16.dp), shape = SpatialRoundedCornerShape(CornerSize(percent = 50)) ) { Surface() { Column() { CustomButton(...) { selectedTab = 0 } } } } } } github.com/AkkeyLab/zenith-android