有什么办法可以让伴奏库的两个横向寻呼机同步工作?
Is there any way to make two horizontal pager of accompanist library to work synchronously?
我想要实现的是,如果有两个水平寻呼机,然后将顶部的一个向左滑动,然后底部的水平寻呼机应向右滑动,反之亦然,已尝试使用 pagerState scrollBy 方法但没有得到所需输出
首先,您需要确定滚动的是哪个分页器,应该跟随哪个分页器。这可以用isScrollInProgress
来完成,我在derivedStateOf
里面使用它来避免不必要的重新组合。
那我运行LaunchedEffect
。我正在按需要的顺序传递一对寻呼机状态,或者空值,作为 key
,因此 LaunchedEffect
将在滚动 stops/starts 时重新启动。使用 snapshotFlow
,可以跟踪其计算依赖于状态变化的块的结果变化。
PagerState
在属性 currentPage
和 currentPageOffset
中有滚动位置信息。 scrollToPage
仅采用 0..1
页面偏移值,但向后滚动时 currentPageOffset
可以小于零。
假设 currentPage = 2
和 currentPageOffset = -0.1
。在这种情况下,我会在pagePart
中得到1.9
,我需要把它拆分回来得到1
和0.9
。为此,我使用 divideAndRemainder
:它将 return 一个 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())
}
}
结果:
我想要实现的是,如果有两个水平寻呼机,然后将顶部的一个向左滑动,然后底部的水平寻呼机应向右滑动,反之亦然,已尝试使用 pagerState scrollBy 方法但没有得到所需输出
首先,您需要确定滚动的是哪个分页器,应该跟随哪个分页器。这可以用isScrollInProgress
来完成,我在derivedStateOf
里面使用它来避免不必要的重新组合。
那我运行LaunchedEffect
。我正在按需要的顺序传递一对寻呼机状态,或者空值,作为 key
,因此 LaunchedEffect
将在滚动 stops/starts 时重新启动。使用 snapshotFlow
,可以跟踪其计算依赖于状态变化的块的结果变化。
PagerState
在属性 currentPage
和 currentPageOffset
中有滚动位置信息。 scrollToPage
仅采用 0..1
页面偏移值,但向后滚动时 currentPageOffset
可以小于零。
假设 currentPage = 2
和 currentPageOffset = -0.1
。在这种情况下,我会在pagePart
中得到1.9
,我需要把它拆分回来得到1
和0.9
。为此,我使用 divideAndRemainder
:它将 return 一个 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())
}
}
结果: