fix: simplify horizontal swipe gesture for reply functionality in MessageBubble
This commit is contained in:
@@ -308,54 +308,35 @@ fun MessageBubble(
|
|||||||
Box(
|
Box(
|
||||||
modifier =
|
modifier =
|
||||||
Modifier.fillMaxWidth().pointerInput(Unit) {
|
Modifier.fillMaxWidth().pointerInput(Unit) {
|
||||||
// 🔥 Кастомная обработка жестов с определением направления
|
// 🔥 Простой горизонтальный свайп для reply
|
||||||
// Это предотвращает конфликт между swipe-to-reply и вертикальным скроллом
|
// Используем detectHorizontalDragGestures который лучше работает со скроллом
|
||||||
awaitEachGesture {
|
detectHorizontalDragGestures(
|
||||||
val down = awaitFirstDown(requireUnconsumed = false)
|
onDragStart = { },
|
||||||
var isDragStarted = false
|
onDragEnd = {
|
||||||
var isHorizontalDrag = false
|
// Если свайпнули достаточно вправо - reply
|
||||||
val touchSlop = 20f // Минимальное смещение для определения направления
|
if (swipeOffset >= swipeThreshold) {
|
||||||
|
|
||||||
var totalX = 0f
|
|
||||||
var totalY = 0f
|
|
||||||
|
|
||||||
do {
|
|
||||||
val event = awaitPointerEvent()
|
|
||||||
val change = event.changes.firstOrNull() ?: break
|
|
||||||
|
|
||||||
if (!isDragStarted) {
|
|
||||||
// Определяем направление по первым движениям
|
|
||||||
totalX += change.positionChange().x
|
|
||||||
totalY += change.positionChange().y
|
|
||||||
|
|
||||||
if (abs(totalX) > touchSlop || abs(totalY) > touchSlop) {
|
|
||||||
isDragStarted = true
|
|
||||||
// Горизонтальный свайп только если X > Y и свайп влево
|
|
||||||
isHorizontalDrag = abs(totalX) > abs(totalY) * 1.5f && totalX < 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isDragStarted && isHorizontalDrag) {
|
|
||||||
// Перехватываем только горизонтальные жесты влево
|
|
||||||
change.consume()
|
|
||||||
val dragAmount = change.positionChange().x
|
|
||||||
val newOffset = swipeOffset + dragAmount
|
|
||||||
swipeOffset = newOffset.coerceIn(-maxSwipe, 0f)
|
|
||||||
}
|
|
||||||
} while (event.changes.any { it.pressed })
|
|
||||||
|
|
||||||
// onDragEnd
|
|
||||||
if (isHorizontalDrag && swipeOffset <= -swipeThreshold) {
|
|
||||||
onSwipeToReply()
|
onSwipeToReply()
|
||||||
}
|
}
|
||||||
swipeOffset = 0f
|
swipeOffset = 0f
|
||||||
|
},
|
||||||
|
onDragCancel = {
|
||||||
|
swipeOffset = 0f
|
||||||
|
},
|
||||||
|
onHorizontalDrag = { change, dragAmount ->
|
||||||
|
// Только свайп вправо (положительное значение)
|
||||||
|
if (dragAmount > 0 || swipeOffset > 0) {
|
||||||
|
change.consume()
|
||||||
|
val newOffset = swipeOffset + dragAmount
|
||||||
|
swipeOffset = newOffset.coerceIn(0f, maxSwipe)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
) {
|
) {
|
||||||
// Reply icon
|
// 🔥 Reply icon - слева, появляется при свайпе вправо
|
||||||
Box(
|
Box(
|
||||||
modifier =
|
modifier =
|
||||||
Modifier.align(Alignment.CenterEnd).padding(end = 16.dp).graphicsLayer {
|
Modifier.align(Alignment.CenterStart).padding(start = 16.dp).graphicsLayer {
|
||||||
alpha = swipeProgress
|
alpha = swipeProgress
|
||||||
scaleX = swipeProgress
|
scaleX = swipeProgress
|
||||||
scaleY = swipeProgress
|
scaleY = swipeProgress
|
||||||
|
|||||||
Reference in New Issue
Block a user