我想要实现的是,如果有两个水平寻呼机,那么在向左滑动顶部一个然后底部水平寻呼机应该向右滑动,反之亦然,尝试使用 pagerState scrollBy 方法但没有获得所需的输出
问问题
94 次
1 回答
2
首先,您需要确定滚动哪个寻呼机以及应该跟随哪个寻呼机。这可以用 来完成isScrollInProgress
,我在里面使用它derivedStateOf
来避免不必要的重新组合。
然后我跑LaunchedEffect
。我正在按需要的顺序传递一对寻呼机状态,或者 null,作为 a key
,因此LaunchedEffect
将在滚动停止/开始时重新启动。使用snapshotFlow
,可以跟踪其计算取决于状态变化的块的结果变化。
PagerState
currentPage
在属性和中具有滚动位置信息currentPageOffset
。scrollToPage
只0..1
取页面偏移值,但currentPageOffset
向后滚动时可以小于零。
假设currentPage = 2
和currentPageOffset = -0.1
。在这种情况下,我将进入1.9
,pagePart
我需要将其拆分回来以获取1
和0.9
。为此,我使用divideAndRemainder
:它将返回表单列表listOf(1.0, 0.9)
。
Column {
val count = 10
val firstPagerState = rememberPagerState()
val secondPagerState = rememberPagerState()
val scrollingFollowingPair by remember {
derivedStateOf {
if (firstPagerState.isScrollInProgress) {
firstPagerState to secondPagerState
} else if (secondPagerState.isScrollInProgress) {
secondPagerState to firstPagerState
} else null
}
}
LaunchedEffect(scrollingFollowingPair) {
val (scrollingState, followingState) = scrollingFollowingPair ?: return@LaunchedEffect
snapshotFlow { scrollingState.currentPage + scrollingState.currentPageOffset }
.collect { pagePart ->
val divideAndRemainder = BigDecimal.valueOf(pagePart.toDouble())
.divideAndRemainder(BigDecimal.ONE)
followingState.scrollToPage(
divideAndRemainder[0].toInt(),
divideAndRemainder[1].toFloat(),
)
}
}
HorizontalPager(
count = count,
state = firstPagerState,
modifier = Modifier.weight(1f)
) {
Text(it.toString())
}
HorizontalPager(
count = count,
state = secondPagerState,
modifier = Modifier.weight(1f)
) {
Text(it.toString())
}
}
结果:
于 2021-12-24T02:34:51.510 回答