AndroidおよびAndroidXRのお勉強
概要
ネイティブAndroidXRで色々やるためにもまずはAndroidのお勉強をしたいと思った
JetpackCompose本を読了したので、次は簡単なAndroidアプリを作りたい
Google公式のこちらがよさそうだったので、いったんやってみるか
テキトーに、Todoリストアプリとか、三目並べとか作ってみたいな
Android StudioのKeybindをVSのものにしたんだけど、
なぜかCtrl+Spaceで入力言語が切り替わっちゃってCode Completionが効かないので困って
Win Copilot君に聞いてみたら正解を教えてくれた、すごいなマジで
mutableStateを使ってpaddingを制御するところまで
Composeのpreview、interactive modeなるものがあるの初めて知った
emulatorがなくてもstateを使った状態変化をシミュレートできるのすごく便利
自作の簡単なミニアプリみたいなものを、一つのアプリに集約したプロジェクトにするといいかも
- じゃんけん
- 3目並べ
これに登壇するため、ちょっとショートカットしてJetpack for XRとか触ってみる
Jetpack XR SDKの中に、下記が入ってるというイメージらしい
- Jetpack Compose for XR
- Material Design for XR
- Jetpack SceneCore
- ARCore for Jetpack XR
雑に、上二つが2D UI系で、した二つが3D操作系なイメージだな
なんとなくComposeの勉強をしてきたため、Compose for XRは気になるかも
ここ深ぼってみようかな
androidXR自体、普通のアプリも動くけど
Compose for XRではspatial panelsとかorbitalsという専用のComposableを提供していたり
Volumeコンポーネントを使えばSceneCoreのエンティティとかを召喚できるのかな
orbitersを使えば、既存の2Dのrail?などをXR向けに使えるようになる
これについて、なにをOrbitersにすればよいかは下記リンクでプラクティスが書かれている
土鍋さんから教えてもらった、AndroidXRのCodeLab
実装はしないけどこれも見ていこう
Spatial ~~なComposableは、android.xr.composable.spatial
モジュールの中に入っていそう
- Orbiter
- Spatial Dialog
- Spatial Elevation
- Spatial Popup
- Subspace
あーでも、SpatialPanelとかないな?
あと、なんとなくglTFの読み込みについても調べてみた
まず、おそらくSubspace?の中にVolumeコンポーザブルを入れて、
Volumeは最後の引数にEntityを受け取れる
そのEntityを継承したGltfModelEntityをここにツッコめば良さそうで、
GltfModelEntityのファクトリにはGltfModelが必要そう
そして、こいつはurlを受け取ってcreateが非同期に実行される感じみたい
PanelEntity、もしかしたらSpatialPanelはFullSpaceになったら
onVolumeEntityが発動して、PanelEntityが渡ってくるとか?
subspaceとspatialized componentsについて知っておくべきらしい
なるほど、Subspaceを作るには
setContentの代わりにsetSubspaceContentを使うか、
もしくはsubspaceコンポーザブルを使うか
とりまここ読み終わった
subspaceの章も読みたいな
Kotlinの構文にrepeatという所定回反復構文があるのいいな
samplesにある通り、基本的にはHello Android XRとCodelabsのサンプルが参考になるだろうなぁ
あとはXRのテンプレートか
codelabsのプロジェクトにSceneCoreで3Dモデルを表示させてみよう
ここに従って作業してみる
新しいSpatialPanelをSpatialRowに追加してみる
アボカドをフォルダに配置
なんかLocalSession.currentでエラーになるなぁと思ったら、なんかSceneCoreがimportで参照できないな
どうやらcodelabsではscenecoreへの依存関係が記述されていなかった模様
堀さんのメモを参考に、Hello Android XRの依存を確認し、
それを参考にして依存関係を設定した
参考元とはちょっと記述方法が違うけど、まずはlibs.versions.toml
にscenecoreへの参照を追加
androidx-xr-scenecore = { group = "androidx.xr.scenecore", name = "scenecore", version.ref = "xrCompose" }
そしてappモジュールについてのbuild.gradle.kts
にも追加
implementation(libs.androidx.xr.scenecore)
この記述方法慣れないけど、tomlに書かれたエイリアスでgradleファイルに依存を追加するんだな
これでLocalSession.currentが動くようになったので、ドキュメントに従って3Dモデルを読み込んでみる
なんかよくわからないけど、GltfModelEntity.createのメソッド定義が違うな?
もしかしたらバージョン問題かもしれない
Codelabsはalpha01だけど、ドキュメント的にはadded in alpha02と書いてある
なんか!!!!alpha02に上げたら破壊的変更になってる!!
ん-、alpha02に上げたけど、以前GltfModelEntity.createの定義が変わらないなぁ
ん-なんじゃろな?ちゃんと変わっていそうだけど
なんだかんだやってたら出てきたぞ!
結局バージョンはalpha01を使用して、alpha01の仕様に沿って実装したら出てきた
そして発表資料です