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

Как только ваше приложение станет ориентировано на 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. Полупрозрачная строка состояния.

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