Improve pager gesture handling (again)
This commit is contained in:
parent
d1218e8d2e
commit
3759a99510
@ -667,9 +667,10 @@ fun Modifier.pagerScaffoldScrollHandler(
|
||||
|
||||
awaitEachGesture {
|
||||
var overSlop = false
|
||||
var lockedInScroll = disablePager
|
||||
val initialDown = awaitFirstDown(requireUnconsumed = false, pass = PointerEventPass.Initial)
|
||||
val down = if (scrollableState.isScrollInProgress || pagerState.isScrollInProgress) {
|
||||
val initialDown =
|
||||
awaitFirstDown(requireUnconsumed = false, pass = PointerEventPass.Initial)
|
||||
val down =
|
||||
if (scrollableState.isScrollInProgress || pagerState.isScrollInProgress) {
|
||||
overSlop = true
|
||||
scope.launch {
|
||||
scrollableState.scrollBy(0f)
|
||||
@ -681,23 +682,19 @@ fun Modifier.pagerScaffoldScrollHandler(
|
||||
}
|
||||
velocityTracker.resetTracking()
|
||||
velocityTracker.addPointerInputChange(down)
|
||||
val notCanceled = drag(down.id) {
|
||||
val canceled = !drag(down.id) {
|
||||
if (it.isConsumed) return@drag
|
||||
val totalDrag = down.position - it.position
|
||||
if (!lockedInScroll && totalDrag.y.absoluteValue > lockScrollThreshold) {
|
||||
lockedInScroll = true
|
||||
scope.launch {
|
||||
pagerState.animateScrollToPage(pagerState.settledPage)
|
||||
}
|
||||
}
|
||||
if (!lockedInScroll && !overSlop && totalDrag.getDistanceSquared() > touchSlopSq) {
|
||||
if (!overSlop && totalDrag.getDistanceSquared() > touchSlopSq) {
|
||||
overSlop = true
|
||||
}
|
||||
if (!overSlop) return@drag
|
||||
val dragAmount = it
|
||||
.positionChange()
|
||||
.let {
|
||||
if (!overSlop || lockedInScroll) it.copy(x = 0f) else it
|
||||
if (it.x.absoluteValue > it.y.absoluteValue) it.copy(y = 0f) else it.copy(
|
||||
x = 0f
|
||||
)
|
||||
}
|
||||
it.consume()
|
||||
velocityTracker.addPointerInputChange(it)
|
||||
@ -707,11 +704,11 @@ fun Modifier.pagerScaffoldScrollHandler(
|
||||
NestedScrollSource.Drag
|
||||
)
|
||||
val available = dragAmount - preConsumed
|
||||
val consumedY = scrollableState.scrollBy(available.y * scrollMultiplier) * scrollMultiplier
|
||||
val consumedX = if (!lockedInScroll) {
|
||||
pagerState.scrollBy(available.x * pagerMultiplier) * pagerMultiplier
|
||||
} else available.x
|
||||
val totalConsumed = Offset(preConsumed.x + consumedX, preConsumed.y + consumedY)
|
||||
val consumedY =
|
||||
scrollableState.scrollBy(available.y * scrollMultiplier) * scrollMultiplier
|
||||
val consumedX = pagerState.scrollBy(available.x * pagerMultiplier) * -1f
|
||||
val totalConsumed =
|
||||
Offset(preConsumed.x + consumedX, preConsumed.y + consumedY)
|
||||
nestedScrollDispatcher.dispatchPostScroll(
|
||||
totalConsumed,
|
||||
dragAmount - totalConsumed,
|
||||
@ -719,11 +716,10 @@ fun Modifier.pagerScaffoldScrollHandler(
|
||||
)
|
||||
}
|
||||
}
|
||||
if (notCanceled) {
|
||||
val velocity = velocityTracker
|
||||
.calculateVelocity()
|
||||
|
||||
if (velocity.x.absoluteValue > velocity.y.absoluteValue && !lockedInScroll) {
|
||||
if (canceled || velocity.x.absoluteValue > velocity.y.absoluteValue) {
|
||||
scope.launch {
|
||||
val preConsumed = nestedScrollDispatcher.dispatchPreFling(velocity)
|
||||
val flingVelocity = (velocity - preConsumed).x
|
||||
@ -751,7 +747,8 @@ fun Modifier.pagerScaffoldScrollHandler(
|
||||
launch {
|
||||
with(flingBehavior) {
|
||||
scrollableState.scroll {
|
||||
consumed = performFling(flingVelocity * scrollMultiplier) * scrollMultiplier
|
||||
consumed =
|
||||
performFling(flingVelocity * scrollMultiplier) * scrollMultiplier
|
||||
}
|
||||
}
|
||||
val totalConsumed =
|
||||
@ -769,6 +766,5 @@ fun Modifier.pagerScaffoldScrollHandler(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal object DefaultNestedScrollConnection : NestedScrollConnection {}
|
||||
Loading…
x
Reference in New Issue
Block a user