Jetpack Composeでフルスクリーンで表示するには

Jetpack Composeを使ったAndroidアプリで、全画面表示をする方法です。

環境

  • Kotlin 1.6.10
  • Jetpack Compose 1.1.1

フルスクリーンで表示する

System UI Controller for Jetpack Composeのインストール

フルスクリーン表示には「System UI Controller for Jetpack Compose」を使用します。

build.gradleを編集し以下の行を追加します。

dependencies {
    implementation "com.google.accompanist:accompanist-systemuicontroller:0.23.1"
}

使用するバージョンは、使用するJetpack Composeのバーションによって変わります。

  • Compose 1.0 (1.0.x) → 0.20.3
  • Compose 1.1 (1.1.x) → 0.23.1
  • Compose UI 1.2 (1.2.x) → 0.25.1
  • Compose UI 1.3 (1.3.x) → 0.26.2-beta

詳しくはこちらをご覧ください。

使い方

WindowCompat.setDecorFitsSystemWindows()を使用して、
システムバーの領域にコンテンツが表示されるようにします。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // システムバーの領域にコンテンツが表示されるようにする
        WindowCompat.setDecorFitsSystemWindows(window, false)

システムバーを透明にします。

val systemUiController = rememberSystemUiController()
val useDarkIcons = !isSystemInDarkTheme()

DisposableEffect(systemUiController, useDarkIcons) {
    systemUiController.setSystemBarsColor(
        color = Color.Transparent,
        darkIcons = useDarkIcons
    )

    onDispose {}
}

サンプルプログラム

fillMaxSizeに指定したBoxがフルスクリーンで表示されます。

緑色の領域を画面上のナビゲーションバーや画面下のステータスバーの部分に描画できています。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        WindowCompat.setDecorFitsSystemWindows(window, false)
        setContent {
            // Remember a SystemUiController
            val systemUiController = rememberSystemUiController()
            val useDarkIcons = !isSystemInDarkTheme()

            DisposableEffect(systemUiController, useDarkIcons) {
                // すべてのシステム バーの色を透明に更新し、明るいテーマの場合は暗いアイコンを使用します
                systemUiController.setSystemBarsColor(
                    color = Color.Transparent,
                    darkIcons = useDarkIcons
                )
                onDispose {}
            }

            FullScreenSampleTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    MainContent()
                }
            }
        }
    }
}

@Composable
fun MainContent() {
    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(color = Color.Green)
    ) {
        Text(
            modifier = Modifier.align(alignment = Alignment.TopCenter),
            text = "Top"
        )
        Text(
            modifier = Modifier.align(alignment = Alignment.BottomCenter),
            text = "Bottom"
        )
        Text(
            modifier = Modifier.align(alignment = Alignment.CenterStart),
            text = "Start"
        )
        Text(
            modifier = Modifier.align(alignment = Alignment.CenterEnd),
            text = "End"
        )
    }
}

画面上のナビゲーションバーや画面下のステータスバーの部分を避ける

build.gradleを編集し以下の行を追加します。

dependencies {
    implementation "androidx.compose.foundation:foundation:1.2.1"
}

Modifier.statusBarsPadding()を追加し、ステータスバーのインセットに合わせてパディングを追加します。

modifier = Modifier
    // ステータスバーを避ける
    .statusBarsPadding()

Modifier.navigationBarsPadding()を追加し、ナビゲーションバーのインセットに合わせてパディングを追加します。

modifier = Modifier
    // ナビゲーションバーを避ける
    .navigationBarsPadding()

その他に、
ステータスバーとナビゲーションバーのインセットに合わせてパディングを追加するModifier.systemBarsPadding()、
ディスプレイのカットアウトに合わせてパディングを追加するModifier.displayCutoutPadding()、
などがある。

サンプルプログラム

青色の領域をステータスバーとナビゲーションバーを避けて描画できています。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // システムバーの領域にコンテンツが表示されるようにする
        WindowCompat.setDecorFitsSystemWindows(window, false)
        setContent {
            // Remember a SystemUiController
            val systemUiController = rememberSystemUiController()
            val useDarkIcons = !isSystemInDarkTheme()

            DisposableEffect(systemUiController, useDarkIcons) {
                // すべてのシステム バーの色を透明に更新し、明るいテーマの場合は暗いアイコンを使用します
                systemUiController.setSystemBarsColor(
                    color = Color.Transparent,
                    darkIcons = useDarkIcons
                )
                onDispose {}
            }

            FullScreenSampleTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    MainContent()
                }
            }
        }
    }
}

@Composable
fun MainContent() {
    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(color = Color.Green)
    ) {
        Box(
            modifier = Modifier
                // ステータスバーを避ける
                .statusBarsPadding()
                // ナビゲーションバーを避ける
                .navigationBarsPadding()
                .fillMaxSize()
                .background(color = Color.Cyan)
        ) {
            Text(
                modifier = Modifier.align(alignment = Alignment.TopCenter),
                text = "Top"
            )
            Text(
                modifier = Modifier.align(alignment = Alignment.BottomCenter),
                text = "Bottom"
            )
            Text(
                modifier = Modifier.align(alignment = Alignment.CenterStart),
                text = "Start"
            )
            Text(
                modifier = Modifier.align(alignment = Alignment.CenterEnd),
                text = "End"
            )
        }
    }
}

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください