作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要实现的是,如果有两个水平寻呼机,那么在向左滑动顶部一个然后底部水平寻呼机应该向右滑动,反之亦然,尝试使用 pagerState scrollBy 方法但没有获得所需的输出
最佳答案
首先,您需要确定滚动哪个寻呼机以及应该跟随哪个寻呼机。这可以通过 isScrollInProgress
来完成,我在derivedStateOf
里面使用以避免不必要的重新组合。
然后我运行 LaunchedEffect
.我正在按需要的顺序传递一对寻呼机状态,或者为 null,作为 key
, 所以 LaunchedEffect
滚动停止/开始时将重新启动。使用 snapshotFlow
,可以跟踪其计算取决于状态变化的 block 的结果变化。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())
}
}
结果:
关于android - 有什么办法可以让伴奏库的两个水平寻呼机同步工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70458058/
我是一名优秀的程序员,十分优秀!