有没有办法让伴奏库的两个水平寻呼机同步工作?

sar*_*pta 4 android android-jetpack-compose jetpack-compose-accompanist

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

Phi*_*hov 7

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

然后我就跑LaunchedEffect。我按需要的顺序传递一对寻呼机状态,或者将其作为 null 传递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())
    }
}
Run Code Online (Sandbox Code Playgroud)

结果: