From bc59c6879a3149e8dd620d273786884e336ba7b6 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Wed, 4 Feb 2026 01:46:12 +0500 Subject: [PATCH] fix: fix statusbar smoothness --- .../ui/chats/components/ImageEditorScreen.kt | 110 ++++++++++++------ 1 file changed, 74 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ImageEditorScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ImageEditorScreen.kt index 9cae223..6e200f2 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ImageEditorScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ImageEditorScreen.kt @@ -164,28 +164,47 @@ fun ImageEditorScreen( ) } - // 🎨 Черный статус бар и навигационный бар для редактора + // 🎨 Плавная анимация status bar синхронно с fade val activity = context as? Activity val window = activity?.window + + // Сохраняем оригинальные цвета один раз + val originalStatusBarColor = remember { window?.statusBarColor ?: android.graphics.Color.WHITE } + val originalNavigationBarColor = remember { window?.navigationBarColor ?: android.graphics.Color.WHITE } + val insetsController = remember(window, view) { window?.let { WindowCompat.getInsetsController(it, view) } } + val originalLightStatusBars = remember { insetsController?.isAppearanceLightStatusBars ?: true } + val originalLightNavigationBars = remember { insetsController?.isAppearanceLightNavigationBars ?: true } + + // ⚡ Анимация цвета status bar синхронно с fade + LaunchedEffect(animationProgress.value) { + if (window == null || insetsController == null) return@LaunchedEffect + + val progress = animationProgress.value + + // Интерполируем цвет: оригинальный (progress=0) -> черный (progress=1) + val currentStatusColor = androidx.core.graphics.ColorUtils.blendARGB( + originalStatusBarColor, + android.graphics.Color.BLACK, + progress + ) + val currentNavColor = androidx.core.graphics.ColorUtils.blendARGB( + originalNavigationBarColor, + android.graphics.Color.BLACK, + progress + ) + + window.statusBarColor = currentStatusColor + window.navigationBarColor = currentNavColor + + // Иконки: светлые (false) когда progress > 0.5, иначе оригинальные + insetsController.isAppearanceLightStatusBars = progress < 0.5f && originalLightStatusBars + insetsController.isAppearanceLightNavigationBars = progress < 0.5f && originalLightNavigationBars + } + + // Восстановление при dispose DisposableEffect(window) { - if (window == null) return@DisposableEffect onDispose { } - - val originalStatusBarColor = window.statusBarColor - val originalNavigationBarColor = window.navigationBarColor - - // 🔥 Сохраняем оригинальное состояние иконок статус бара - val insetsController = WindowCompat.getInsetsController(window, view) - val originalLightStatusBars = insetsController.isAppearanceLightStatusBars - val originalLightNavigationBars = insetsController.isAppearanceLightNavigationBars - - // Устанавливаем черный цвет и светлые иконки - window.statusBarColor = android.graphics.Color.BLACK - window.navigationBarColor = android.graphics.Color.BLACK - insetsController.isAppearanceLightStatusBars = false // Светлые иконки на черном фоне - insetsController.isAppearanceLightNavigationBars = false - onDispose { - // Восстанавливаем оригинальные цвета и состояние иконок + if (window == null || insetsController == null) return@onDispose window.statusBarColor = originalStatusBarColor window.navigationBarColor = originalNavigationBarColor insetsController.isAppearanceLightStatusBars = originalLightStatusBars @@ -1520,28 +1539,47 @@ fun MultiImageEditorScreen( } } - // 🎨 Черный статус бар и навигационный бар для редактора + // 🎨 Плавная анимация status bar синхронно с fade val activity = context as? Activity val window = activity?.window + + // Сохраняем оригинальные цвета один раз + val originalStatusBarColor = remember { window?.statusBarColor ?: android.graphics.Color.WHITE } + val originalNavigationBarColor = remember { window?.navigationBarColor ?: android.graphics.Color.WHITE } + val insetsController = remember(window, view) { window?.let { WindowCompat.getInsetsController(it, view) } } + val originalLightStatusBars = remember { insetsController?.isAppearanceLightStatusBars ?: true } + val originalLightNavigationBars = remember { insetsController?.isAppearanceLightNavigationBars ?: true } + + // ⚡ Анимация цвета status bar синхронно с fade + LaunchedEffect(animationProgress.value) { + if (window == null || insetsController == null) return@LaunchedEffect + + val progress = animationProgress.value + + // Интерполируем цвет: оригинальный (progress=0) -> черный (progress=1) + val currentStatusColor = androidx.core.graphics.ColorUtils.blendARGB( + originalStatusBarColor, + android.graphics.Color.BLACK, + progress + ) + val currentNavColor = androidx.core.graphics.ColorUtils.blendARGB( + originalNavigationBarColor, + android.graphics.Color.BLACK, + progress + ) + + window.statusBarColor = currentStatusColor + window.navigationBarColor = currentNavColor + + // Иконки: светлые (false) когда progress > 0.5, иначе оригинальные + insetsController.isAppearanceLightStatusBars = progress < 0.5f && originalLightStatusBars + insetsController.isAppearanceLightNavigationBars = progress < 0.5f && originalLightNavigationBars + } + + // Восстановление при dispose DisposableEffect(window) { - if (window == null) return@DisposableEffect onDispose { } - - val originalStatusBarColor = window.statusBarColor - val originalNavigationBarColor = window.navigationBarColor - - // 🔥 Сохраняем оригинальное состояние иконок статус бара - val insetsController = WindowCompat.getInsetsController(window, view) - val originalLightStatusBars = insetsController.isAppearanceLightStatusBars - val originalLightNavigationBars = insetsController.isAppearanceLightNavigationBars - - // Устанавливаем черный цвет и светлые иконки - window.statusBarColor = android.graphics.Color.BLACK - window.navigationBarColor = android.graphics.Color.BLACK - insetsController.isAppearanceLightStatusBars = false // Светлые иконки на черном фоне - insetsController.isAppearanceLightNavigationBars = false - onDispose { - // Восстанавливаем оригинальные цвета и состояние иконок + if (window == null || insetsController == null) return@onDispose window.statusBarColor = originalStatusBarColor window.navigationBarColor = originalNavigationBarColor insetsController.isAppearanceLightStatusBars = originalLightStatusBars