1

我想要实现的是,如果有两个水平寻呼机,那么在向左滑动顶部一个然后底部水平寻呼机应该向右滑动,反之亦然,尝试使用 pagerState scrollBy 方法但没有获得所需的输出

4

1 回答 1

2

首先,您需要确定滚动哪个寻呼机以及应该跟随哪个寻呼机。这可以用 来完成isScrollInProgress,我在里面使用它derivedStateOf来避免不必要的重新组合。

然后我跑LaunchedEffect。我正在按需要的顺序传递一对寻呼机状态,或者 null,作为 a key,因此LaunchedEffect将在滚动停止/开始时重新启动。使用snapshotFlow,可以跟踪其计算取决于状态变化的块的结果变化。

PagerStatecurrentPage在属性和中具有滚动位置信息currentPageOffsetscrollToPage0..1取页面偏移值,但currentPageOffset向后滚动时可以小于零。

假设currentPage = 2currentPageOffset = -0.1。在这种情况下,我将进入1.9pagePart我需要将其拆分回来以获取10.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 回答