From 3ed49863938e29d0777cae5ebde0142acc7e7835 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Sat, 31 Jan 2026 04:03:43 +0500 Subject: [PATCH] feat: Enhance avatar animation with sharp expansion effect for smoother transitions --- .../messenger/ui/settings/ProfileScreen.kt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileScreen.kt index ee68575..cb6213f 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/ProfileScreen.kt @@ -757,6 +757,10 @@ private fun CollapsingProfileHeader( // Зона аватарки = ВСЯ высота header включая статус бар val avatarZoneHeight = EXPANDED_HEADER_HEIGHT + statusBarHeight + // Резкая анимация - используем easeOut (быстро в начале, медленно в конце) + // sqrt делает анимацию более резкой/быстрой + val sharpExpansion = kotlin.math.sqrt(expansionProgress.toDouble()).toFloat() + // При overscroll расширяем до прямоугольника на всю зону (только если не collapsed И есть // аватарка) val avatarWidth: Dp @@ -764,9 +768,9 @@ private fun CollapsingProfileHeader( if (hasAvatar && collapseProgress < 0.1f && expansionProgress > 0f) { // Overscroll: круг -> прямоугольник на всю зону ВКЛЮЧАЯ статус бар (ТОЛЬКО С АВАТАРКОЙ) - avatarWidth = androidx.compose.ui.unit.lerp(circleSize, screenWidthDp, expansionProgress) - avatarHeight = - androidx.compose.ui.unit.lerp(circleSize, avatarZoneHeight, expansionProgress) + // Используем sharpExpansion для резкой анимации + avatarWidth = androidx.compose.ui.unit.lerp(circleSize, screenWidthDp, sharpExpansion) + avatarHeight = androidx.compose.ui.unit.lerp(circleSize, avatarZoneHeight, sharpExpansion) } else { // Collapse: сразу начинаем уменьшаться от круга до 0 val collapsedSize = androidx.compose.ui.unit.lerp(circleSize, 0.dp, collapseProgress) @@ -787,7 +791,8 @@ private fun CollapsingProfileHeader( val avatarY = if (hasAvatar && collapseProgress < 0.1f && expansionProgress > 0f) { // При overscroll прижимаемся к самому верху (ТОЛЬКО С АВАТАРКОЙ) - androidx.compose.ui.unit.lerp(defaultCenterY, topAvatarY, expansionProgress) + // Используем sharpExpansion для резкой анимации + androidx.compose.ui.unit.lerp(defaultCenterY, topAvatarY, sharpExpansion) } else { // Collapse: сразу начинаем уходить вверх androidx.compose.ui.unit.lerp( @@ -797,12 +802,12 @@ private fun CollapsingProfileHeader( ) } - // Закругление: круг по умолчанию, при overscroll становится квадратом БЕЗ скругления (ТОЛЬКО С + // Закругление: круг по умолчанию, при overscroll плавно становится квадратом (ТОЛЬКО С // АВАТАРКОЙ) val cornerRadius = if (hasAvatar && collapseProgress < 0.1f && expansionProgress > 0f) { - // Overscroll: круг -> квадрат без скругления - androidx.compose.ui.unit.lerp(avatarSize / 2, 0.dp, expansionProgress) + // Overscroll: круг -> квадрат без скругления (резкая анимация) + androidx.compose.ui.unit.lerp(avatarSize / 2, 0.dp, sharpExpansion) } else { // Всегда круг avatarSize / 2