4

对于LazyRow, or Column, 我如何知道用户是向左还是向右滚动(或向上或......你知道的)。对于这样的事情,我们不需要在 compose 中进行回调,因为mutableStateOf对象总是会触发重新组合,所以我只想知道一种将它存储在变量中的方法。好的,所以有lazyRowState.firstVisibleItemScrollOffset,它可以用来以某种方式测量它,但我找不到一种方法来先存储它的值,然后减去当前值以检索方向(基于正或负变化)。关于如何做到这一点的任何想法,谢谢

4

2 回答 2

3

目前 ( 1.0.x) 没有内置函数可以从中获取此信息LazyListState

你可以使用类似的东西:

@Composable
private fun LazyListState.isScrollingUp(): Boolean {
    var previousIndex by remember(this) { mutableStateOf(firstVisibleItemIndex) }
    var previousScrollOffset by remember(this) { mutableStateOf(firstVisibleItemScrollOffset) }
    return remember(this) {
        derivedStateOf {
            if (previousIndex != firstVisibleItemIndex) {
                previousIndex > firstVisibleItemIndex
            } else {
                previousScrollOffset >= firstVisibleItemScrollOffset
            }.also {
                previousIndex = firstVisibleItemIndex
                previousScrollOffset = firstVisibleItemScrollOffset
            }
        }
    }.value
}

然后只需使用listState.isScrollingUp()获取有关滚动的信息。

此代码段在 google codelab中使用。

于 2021-08-10T17:58:43.607 回答
2

知道了

{ //Composable Scope
val lazyRowState = rememberLazyListState()
    val pOffset = remember { lazyRowState.firstVisibleItemScrollOffset }
    val direc = lazyRowState.firstVisibleItemScrollOffset - pOffset
    val scrollingRight /*or Down*/ = direc > 0 // Tad'aa
}
于 2021-08-10T13:42:15.953 回答