[Android] 全画面表示 WindowInsetsController

アプリによって、ゲームやギャラリーなどは全画面での表示が好まれるケースがあります。ステータスバーやナビゲーションバーが消えてくれると見やすいというような時にどのようにするといいのでしょうか、

 
1x1.trans - [Android] 全画面表示 WindowInsetsController


Android Studio
2021.2.1

 




Fullscreen

 

例えばこのような通常の表示で、

  • Status bar
  • Title bar
  • Navigation bar
  • (System bar = Status bar + Navigation bar)

を非表示にしたい場合
1x1.trans - [Android] 全画面表示 WindowInsetsController

Status bar とNavigation bar については API 30 以降はそれ以前と異なっています。

  • systemUiVisibility: API 29 まで
  • WindowInsetsController: API 30 以降

Title barについてはThemeの変更などで対応できます。
API29まではこちらを参考にしてください、ちなみにAndroid Studio 4.1.3 のフルスクリーンのテンプレートでも古い方法でした(2021年4月)
 

API 30 からは全画面モードに使っていたsystemUiVisibilityが非推奨になりました。代わりに windowInsetsControlle を使いますが、下位互換ではないのでAPI29までは切り替えて使う必要があります。

 

 

Title bar

 

最初にTtile barを非表示にしたいと思います。

NoActionBar のThemeに設定変更します。

Themeの変更は、res/values/themes/ 以下にあります。

1x1.trans - [Android] 全画面表示 WindowInsetsController

デフォルトではこのようになっているparentをNoActionBarに変更

例えばこのようにタイトルバーを非表示にできます。

1x1.trans - [Android] 全画面表示 WindowInsetsController

画像は “centerCrop” を設定しているためにタイトルバーが無くなった分だけ拡大されました。

このケースでの設定です。

theme.xml

activity_main.xml

strings.xml

NoActionBarとなるThemeは他にもあります。

あるいは、ActionBarはAppCompatActivity()によって実現しているので単純に
Activity()にすれば表示されなくなります。 

 

hide & show bars

 

WindowInsetsController を使います。WindowInsetsController | Android Developers
 

status bar と navigation bar を非表示にするために
hide(types: Int)
を使います。

両方のbarを非表示にしますが、片方だけでも可能です

表示させる場合は、show(types: Int) を使います

とします。

また、System barはStatus bar と Navigation barの両方をさすのでまとめて以下のようにもできます。

 

behavior

 

以前の全画面の方法として Immersive Sticky モードがありました。アプリ優先型没入モードというような意味です。
通常は全画面で何か必要な場合のみbarを表示させて、数秒後には元の全画面に戻るモードです

これは半透明なバーですが透明ではないバーを表示させたり
BEHAVIOR_SHOW_BARS_BY_SWIPE

スワイプではなくタッチで表示させる
BEHAVIOR_SHOW_BARS_BY_TOUCH

などがあります。

 

サンプルコード

 

ボタンを使って、バーの非表示から半透明でスワイプで一時表示
非表示から表示させるコードを作ってみます。

MainActivity.kt

レイアウトです
何か画像があるとわかりやすいです

activity_main.xml

リソース
strings.xml

Title barを非表示にするためThemeを変更します。
theme.xml

これで実行してみましょう

 

これはAPI30からなのでそれ以前ではsystemUiVisibilityを使わないといけないのでAPIによる切り分けが必要になります。

 
 
Reference:
WindowInsetsController | Android Developers

シェアする

  • このエントリーをはてなブックマークに追加

フォローする