j3iiifn’s blog

ネットワーク、インフラ、プログラミングについての備忘録

Android 11 (API 30) の全画面モードを試してみた

Androidで全画面モードといえば、これまでは window.decorView.systemUiVisibility()View.SYSTEM_UI_FLAG_HIDE_NAVIGATIONView.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エミュレータで確認した。

動作確認に使用したコードはこちらに置いた。

github.com

パターン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が一時的に表示される。

f:id:j3iiifn:20200816232347g:plain
パターンA-1: status barとnavigation barを非表示 / BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

パターン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が表示される。

f:id:j3iiifn:20200816232726g:plain
パターンA-2: status barとnavigation barを非表示 / BEHAVIOR_SHOW_BARS_BY_SWIPE

パターン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が表示される。

f:id:j3iiifn:20200816232804g:plain
パターンA-3: status barとnavigation barを非表示 / BEHAVIOR_SHOW_BARS_BY_TOUCH

パターン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が現れる上にコンテンツのレイアウトがリサイズされる。まだ動作が不安定な模様。

f:id:j3iiifn:20200816235153g:plain
パターンB-1: navigation barを非表示 / BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

パターン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が現れる上にコンテンツのレイアウトがリサイズされる。まだ動作が不安定な模様。

f:id:j3iiifn:20200816235246g:plain
パターンB-2: navigation barを非表示 / BEHAVIOR_SHOW_BARS_BY_SWIPE

パターン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が表示される。

f:id:j3iiifn:20200816233050g:plain
パターンB-3: navigation barを非表示 / BEHAVIOR_SHOW_BARS_BY_TOUCH

パターン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が一時的に表示される。

f:id:j3iiifn:20200816233121g:plain
パターンC-1: status barを非表示 / BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

パターン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が表示される。

f:id:j3iiifn:20200816233157g:plain
パターンC-2: status barを非表示 / BEHAVIOR_SHOW_BARS_BY_SWIPE

パターン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が表示される。

f:id:j3iiifn:20200816233224g:plain
パターンC-3: status barを非表示 / BEHAVIOR_SHOW_BARS_BY_TOUCH