fix: fix statusbar smoothness
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user