fix: fix statusbar smoothness

This commit is contained in:
k1ngsterr1
2026-02-04 01:46:12 +05:00
parent 70f5f9b9f9
commit bc59c6879a

View File

@@ -164,28 +164,47 @@ fun ImageEditorScreen(
) )
} }
// 🎨 Черный статус бар и навигационный бар для редактора // 🎨 Плавная анимация status bar синхронно с fade
val activity = context as? Activity val activity = context as? Activity
val window = activity?.window 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) { 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 { onDispose {
// Восстанавливаем оригинальные цвета и состояние иконок if (window == null || insetsController == null) return@onDispose
window.statusBarColor = originalStatusBarColor window.statusBarColor = originalStatusBarColor
window.navigationBarColor = originalNavigationBarColor window.navigationBarColor = originalNavigationBarColor
insetsController.isAppearanceLightStatusBars = originalLightStatusBars insetsController.isAppearanceLightStatusBars = originalLightStatusBars
@@ -1520,28 +1539,47 @@ fun MultiImageEditorScreen(
} }
} }
// 🎨 Черный статус бар и навигационный бар для редактора // 🎨 Плавная анимация status bar синхронно с fade
val activity = context as? Activity val activity = context as? Activity
val window = activity?.window 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) { 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 { onDispose {
// Восстанавливаем оригинальные цвета и состояние иконок if (window == null || insetsController == null) return@onDispose
window.statusBarColor = originalStatusBarColor window.statusBarColor = originalStatusBarColor
window.navigationBarColor = originalNavigationBarColor window.navigationBarColor = originalNavigationBarColor
insetsController.isAppearanceLightStatusBars = originalLightStatusBars insetsController.isAppearanceLightStatusBars = originalLightStatusBars