Androidで全画面モードといえば、これまでは window.decorView.systemUiVisibility()
に View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
や View.SYSTEM_UI_FLAG_FULLSCREEN
などのフラグを組み合わせて渡すことで実現してきた。
API level 30で systemUiVisibility
はdeprecatedになり、その代わりに WindowInsetsController クラスが追加された。
WindowInsetsController
クラスでは、 hide()
メソッドで非表示にするUIを指定したり、 setSystemBarsBehavior()
メソッドでシステムバーが非表示になった際にどのように振る舞うのかを指定できる。
hide()
メソッドで非表示にするUI(下記A, B, Cの3通り)とsetSystemBarsBehavior()
で指定するフラグ(下記1, 2, 3の3通り)の組み合わせは全部で3x3=9パターンある。
hide()メソッドで非表示にするUI A. status barとnavigation barを非表示 B. navigation barを非表示 C. status barを非表示
setSystemBarsBehavior()メソッドで指定するフラグ 1. BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 2. BEHAVIOR_SHOW_BARS_BY_SWIPE 3. BEHAVIOR_SHOW_BARS_BY_TOUCH
まだβ版であるため今後変更される可能性もあるが、全9パターンについて2020年8月時点での setSystemBarsBehavior()
の挙動をAndroid 11エミュレータで確認した。
動作確認に使用したコードはこちらに置いた。
パターンA-1: status barとnavigation barを非表示 / BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
window.insetsController?.hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars()) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
- 上からスワイプすると半透明なstatus barとnavigation barが一時的に表示される。
パターンA-2: status barとnavigation barを非表示 / BEHAVIOR_SHOW_BARS_BY_SWIPE
window.insetsController?.hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars()) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE
- 上からスワイプするとstatus barとnavigation barが表示される。
パターンA-3: status barとnavigation barを非表示 / BEHAVIOR_SHOW_BARS_BY_TOUCH
window.insetsController?.hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars()) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_TOUCH
- タップするとnavigation barが表示される。
- 上からスワイプするとstatus barが表示される。
パターンB-1: navigation barを非表示 / BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
window.insetsController?.hide(WindowInsets.Type.navigationBars()) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
- タップに対しては反応なし。
- 下からスワイプすると半透明なnavigation barが一時的に表示される。
- 上からスワイプすると透明なnavigation barが一時的に表示される。スワイプのやり方によっては白背景のnavigation barが現れる上にコンテンツのレイアウトがリサイズされる。まだ動作が不安定な模様。
パターンB-2: navigation barを非表示 / BEHAVIOR_SHOW_BARS_BY_SWIPE
window.insetsController?.hide(WindowInsets.Type.navigationBars()) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE
- タップに対しては反応なし。
- 下からスワイプするとnavigation barが表示される。
- 上からスワイプすると透明なnavigation barが一時的に表示される。スワイプのやり方によっては白背景のnavigation barが現れる上にコンテンツのレイアウトがリサイズされる。まだ動作が不安定な模様。
パターンB-3: navigation barを非表示 / BEHAVIOR_SHOW_BARS_BY_TOUCH
window.insetsController?.hide(WindowInsets.Type.navigationBars()) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_TOUCH
- タップするとnavigation barが表示される。
パターンC-1: status barを非表示 / BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
window.insetsController?.hide(WindowInsets.Type.statusBars()) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
- タップに対しては反応なし。
- 上からスワイプすると透明のstatus barが一時的に表示される。
パターンC-2: status barを非表示 / BEHAVIOR_SHOW_BARS_BY_SWIPE
window.insetsController?.hide(WindowInsets.Type.statusBars()) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE
- タップに対しては反応なし。
- 上からスワイプするとstatus barが表示される。
パターンC-3: status barを非表示 / BEHAVIOR_SHOW_BARS_BY_TOUCH
window.insetsController?.hide(WindowInsets.Type.statusBars()) window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_TOUCH
- タップに対しては反応なし。
- 上からスワイプするとstatus barが表示される。