À propos de la protection de la barre système

Une fois que votre application cible le SDK 35 ou une version ultérieure, le mode bord à bord est appliqué. Les barres d'état et de navigation par gestes du système sont transparentes, mais la barre de navigation à trois boutons est translucide. Appelez enableEdgeToEdge pour rendre cette méthode rétrocompatible.

Toutefois, les paramètres système par défaut peuvent ne pas fonctionner pour tous les cas d'utilisation. Consultez les consignes de conception des barres système Android et les consignes de conception bord à bord pour savoir quand envisager d'avoir des barres système transparentes ou translucides.

Créer des barres système transparentes

Créez une barre de navigation transparente pour la navigation par gestes en ciblant Android 15 ou version ultérieure, ou en appelant enableEdgeToEdge() avec des arguments par défaut pour les versions antérieures. Pour la barre de navigation à trois boutons, définissez Window.setNavigationBarContrastEnforced sur false. Sinon, un voile translucide sera appliqué.

Créer des barres système translucides

Pour créer une barre d'état translucide, créez un composable personnalisé qui se chevauche le contenu principal et dessine un dégradé dans la zone couverte par les encarts.

class SystemBarProtectionSnippets : ComponentActivity() {

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

        // enableEdgeToEdge sets window.isNavigationBarContrastEnforced = true
        // which is used to add a translucent scrim to three-button navigation
        enableEdgeToEdge()

        setContent {
            MyTheme {
                // Main content
                MyContent()

                // After drawing main content, draw status bar protection
                StatusBarProtection()
            }
        }
    }
}

@Composable
private fun StatusBarProtection(
    color: Color = MaterialTheme.colorScheme.surfaceContainer,
    heightProvider: () -> Float = calculateGradientHeight(),
) {

    Canvas(Modifier.fillMaxSize()) {
        val calculatedHeight = heightProvider()
        val gradient = Brush.verticalGradient(
            colors = listOf(
                color.copy(alpha = 1f),
                color.copy(alpha = .8f),
                Color.Transparent
            ),
            startY = 0f,
            endY = calculatedHeight
        )
        drawRect(
            brush = gradient,
            size = Size(size.width, calculatedHeight),
        )
    }
}

@Composable
fun calculateGradientHeight(): () -> Float {
    val statusBars = WindowInsets.statusBars
    val density = LocalDensity.current
    return { statusBars.getTop(density).times(1.2f) }
}

Figure 1. Barre d'état translucide.

Pour les applications adaptatives, insérez un composable personnalisé qui correspond aux couleurs de chaque volet, comme indiqué dans la section Conception bord à bord. Pour créer une barre de navigation translucide, définissez Window.setNavigationBarContrastEnforced sur "true".