feat: Add haptic feedback for avatar expansion completion and adjust corner radius behavior
This commit is contained in:
@@ -31,6 +31,7 @@ import androidx.compose.ui.graphics.Color
|
|||||||
import androidx.compose.ui.graphics.asImageBitmap
|
import androidx.compose.ui.graphics.asImageBitmap
|
||||||
import androidx.compose.ui.graphics.graphicsLayer
|
import androidx.compose.ui.graphics.graphicsLayer
|
||||||
import androidx.compose.ui.graphics.vector.ImageVector
|
import androidx.compose.ui.graphics.vector.ImageVector
|
||||||
|
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
|
||||||
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
|
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
|
||||||
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
|
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
|
||||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||||
@@ -38,6 +39,7 @@ import androidx.compose.ui.layout.ContentScale
|
|||||||
import androidx.compose.ui.platform.LocalConfiguration
|
import androidx.compose.ui.platform.LocalConfiguration
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
|
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||||
import androidx.compose.ui.text.TextStyle
|
import androidx.compose.ui.text.TextStyle
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
@@ -793,16 +795,29 @@ private fun CollapsingProfileHeader(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Закругление: круг по умолчанию, при overscroll становится квадратом
|
// Закругление: круг по умолчанию, при overscroll становится квадратом БЕЗ скругления
|
||||||
val cornerRadius =
|
val cornerRadius =
|
||||||
if (collapseProgress < 0.1f && expansionProgress > 0f) {
|
if (collapseProgress < 0.1f && expansionProgress > 0f) {
|
||||||
// Overscroll: круг -> квадрат с небольшим скруглением
|
// Overscroll: круг -> квадрат без скругления
|
||||||
androidx.compose.ui.unit.lerp(avatarSize / 2, 12.dp, expansionProgress)
|
androidx.compose.ui.unit.lerp(avatarSize / 2, 0.dp, expansionProgress)
|
||||||
} else {
|
} else {
|
||||||
// Всегда круг
|
// Всегда круг
|
||||||
avatarSize / 2
|
avatarSize / 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Haptic feedback при достижении полного квадрата
|
||||||
|
val hapticFeedback = LocalHapticFeedback.current
|
||||||
|
var hasTriggeredHaptic by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
|
LaunchedEffect(expansionProgress) {
|
||||||
|
if (expansionProgress >= 0.95f && !hasTriggeredHaptic) {
|
||||||
|
hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
|
||||||
|
hasTriggeredHaptic = true
|
||||||
|
} else if (expansionProgress < 0.5f) {
|
||||||
|
hasTriggeredHaptic = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val avatarFontSize = androidx.compose.ui.unit.lerp(40.sp, 0.sp, collapseProgress)
|
val avatarFontSize = androidx.compose.ui.unit.lerp(40.sp, 0.sp, collapseProgress)
|
||||||
|
|
||||||
// ═══════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════
|
||||||
|
|||||||
Reference in New Issue
Block a user