有什么办法可以让伴奏库的两个横向寻呼机同步工作?

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 在属性 currentPagecurrentPageOffset 中有滚动位置信息。 scrollToPage 仅采用 0..1 页面偏移值,但向后滚动时 currentPageOffset 可以小于零。

假设 currentPage = 2currentPageOffset = -0.1。在这种情况下,我会在pagePart中得到1.9,我需要把它拆分回来得到10.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())
    }
}

结果: