fix(recorder): 修复日期记录器多选模式下拖动多选中断问题
This commit is contained in:
parent
c6377d85f9
commit
c3510cde39
@ -53,6 +53,8 @@ import androidx.compose.material.icons.filled.Delete
|
|||||||
import androidx.compose.material.icons.filled.PhotoCamera
|
import androidx.compose.material.icons.filled.PhotoCamera
|
||||||
import androidx.compose.material.icons.filled.Sort
|
import androidx.compose.material.icons.filled.Sort
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.rememberUpdatedState
|
||||||
import androidx.compose.ui.geometry.Offset
|
import androidx.compose.ui.geometry.Offset
|
||||||
import androidx.compose.ui.graphics.graphicsLayer
|
import androidx.compose.ui.graphics.graphicsLayer
|
||||||
import androidx.compose.ui.input.pointer.pointerInput
|
import androidx.compose.ui.input.pointer.pointerInput
|
||||||
@ -364,15 +366,17 @@ private fun RecordGrid(
|
|||||||
val gridState = rememberLazyGridState()
|
val gridState = rememberLazyGridState()
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
var initialDragIndex by remember { mutableStateOf<Int?>(null) }
|
val currentRecords by rememberUpdatedState(records)
|
||||||
var initialSelectedIds by remember { mutableStateOf<Set<Long>>(emptySet()) }
|
val currentSelectionMode by rememberUpdatedState(selectionMode)
|
||||||
|
val currentSelectedIds by rememberUpdatedState(selectedIds)
|
||||||
|
val currentOnSetSelectedIds by rememberUpdatedState(onSetSelectedIds)
|
||||||
|
|
||||||
LazyVerticalGrid(
|
LazyVerticalGrid(
|
||||||
state = gridState,
|
state = gridState,
|
||||||
columns = GridCells.Adaptive(minSize = 100.dp),
|
columns = GridCells.Adaptive(minSize = 100.dp),
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.pointerInput(records, selectionMode, selectedIds) {
|
.pointerInput(Unit) {
|
||||||
awaitEachGesture {
|
awaitEachGesture {
|
||||||
val down = awaitFirstDown(pass = PointerEventPass.Initial, requireUnconsumed = false)
|
val down = awaitFirstDown(pass = PointerEventPass.Initial, requireUnconsumed = false)
|
||||||
val startOffset = down.position
|
val startOffset = down.position
|
||||||
@ -381,7 +385,7 @@ private fun RecordGrid(
|
|||||||
|
|
||||||
var isDragSelecting = false
|
var isDragSelecting = false
|
||||||
var isScrolling = false
|
var isScrolling = false
|
||||||
val initialSelected = if (selectionMode) selectedIds else emptySet()
|
val initialSelected = if (currentSelectionMode) currentSelectedIds else emptySet()
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
val event = awaitPointerEvent(pass = PointerEventPass.Initial)
|
val event = awaitPointerEvent(pass = PointerEventPass.Initial)
|
||||||
@ -389,25 +393,32 @@ private fun RecordGrid(
|
|||||||
if (!pointerChange.pressed) break
|
if (!pointerChange.pressed) break
|
||||||
|
|
||||||
val currentOffset = pointerChange.position
|
val currentOffset = pointerChange.position
|
||||||
val distance = (currentOffset - startOffset).getDistance()
|
val delta = currentOffset - startOffset
|
||||||
|
val distance = delta.getDistance()
|
||||||
val elapsedTime = pointerChange.uptimeMillis - startTime
|
val elapsedTime = pointerChange.uptimeMillis - startTime
|
||||||
|
|
||||||
if (!isDragSelecting && !isScrolling) {
|
if (!isDragSelecting && !isScrolling) {
|
||||||
if (selectionMode) {
|
if (currentSelectionMode) {
|
||||||
// 多选模式下:滑动超过 6px 立刻触发极速滑动多选
|
// 多选模式下:如果快速纵向滑动,判定为普通滚屏;否则在移动超过 16px 或按住超过 120ms 后触发拖拽多选
|
||||||
if (distance >= 6f) {
|
if (distance > 20f && elapsedTime < 120L && kotlin.math.abs(delta.y) > kotlin.math.abs(delta.x) * 2f) {
|
||||||
|
isScrolling = true
|
||||||
|
} else if (distance >= 16f || (elapsedTime >= 120L && distance >= 6f)) {
|
||||||
isDragSelecting = true
|
isDragSelecting = true
|
||||||
val startId = records[startIndex].id
|
val startId = currentRecords.getOrNull(startIndex)?.id
|
||||||
onSetSelectedIds(initialSelected + startId)
|
if (startId != null) {
|
||||||
|
currentOnSetSelectedIds(initialSelected + startId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 普通模式下:按住满 250ms 或按住移动超过 10px(且未快滑滚屏)触发长按多选
|
// 普通模式下:按住满 250ms 或按住移动超过 10px(且未快滑滚屏)触发长按多选
|
||||||
if (distance > 30f && elapsedTime < 200L) {
|
if (distance > 30f && elapsedTime < 200L && kotlin.math.abs(delta.y) > kotlin.math.abs(delta.x) * 1.5f) {
|
||||||
isScrolling = true // 快速划过判定为普通滚屏
|
isScrolling = true // 快速划过判定为普通滚屏
|
||||||
} else if (elapsedTime >= 250L || (elapsedTime >= 150L && distance >= 10f)) {
|
} else if (elapsedTime >= 250L || (elapsedTime >= 150L && distance >= 10f)) {
|
||||||
isDragSelecting = true
|
isDragSelecting = true
|
||||||
val startId = records[startIndex].id
|
val startId = currentRecords.getOrNull(startIndex)?.id
|
||||||
onSetSelectedIds(setOf(startId))
|
if (startId != null) {
|
||||||
|
currentOnSetSelectedIds(setOf(startId))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -418,8 +429,8 @@ private fun RecordGrid(
|
|||||||
if (currentIndex != null) {
|
if (currentIndex != null) {
|
||||||
val minIdx = minOf(startIndex, currentIndex)
|
val minIdx = minOf(startIndex, currentIndex)
|
||||||
val maxIdx = maxOf(startIndex, currentIndex)
|
val maxIdx = maxOf(startIndex, currentIndex)
|
||||||
val draggedIds = (minIdx..maxIdx).mapNotNull { records.getOrNull(it)?.id }.toSet()
|
val draggedIds = (minIdx..maxIdx).mapNotNull { currentRecords.getOrNull(it)?.id }.toSet()
|
||||||
onSetSelectedIds(initialSelected + draggedIds)
|
currentOnSetSelectedIds(initialSelected + draggedIds)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 边界滑动自动滚屏
|
// 边界滑动自动滚屏
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user