О защите системной панели

Как только ваше приложение перейдет на SDK 35 или более позднюю версию, будет принудительно реализована технология Edge-to-Edge . Системная строка состояния и панели навигации жестами станут прозрачными, но панель навигации с тремя кнопками также полупрозрачна. Для обеспечения обратной совместимости вызовите enableEdgeToEdge .

Однако системные настройки по умолчанию могут не подходить для всех случаев использования. Ознакомьтесь с рекомендациями по дизайну системных панелей Android и рекомендациями по дизайну «от края до края», чтобы узнать, когда следует использовать прозрачные или полупрозрачные системные панели.

Создать прозрачные системные панели

Создайте прозрачную панель навигации с поддержкой жестов, ориентируясь на Android 15 и более поздние версии, или вызвав enableEdgeToEdge() с аргументами по умолчанию для более ранних версий. Для трёхкнопочной панели навигации установите для Window.setNavigationBarContrastEnforced значение false иначе будет применена полупрозрачная сетка.

Создание полупрозрачных системных панелей

Чтобы создать полупрозрачную строку состояния, создайте пользовательский компонуемый элемент, который перекрывает основное содержимое и рисует градиент в области, закрытой вставками.

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) }
}

Рисунок 1. Полупрозрачная строка состояния.

Для адаптивных приложений добавьте пользовательский компонуемый элемент, соответствующий цветам каждой панели, как показано в дизайне «От края до края» . Чтобы создать полупрозрачную панель навигации, установите для свойства Window.setNavigationBarContrastEnforced значение true.