【问题标题】:Current scroll position value in pixels in LazyColumn Jetpack ComposeLazyColumn Jetpack Compose 中的当前滚动位置值(以像素为单位)
【发布时间】:2022-08-20 11:20:53
【问题描述】:

我想在 LazyColumn 中以 px 为单位的总滚动位置。 列本身有一个 ScrollState,它有一个值(在文档中描述为当前滚动位置值,以像素为单位),但是 LazyColumn ScrollState 没有这个字段,我想要与 LazyColumn 的 Column ScrollState 滚动位置值完全相同,如何我可以在 LazyScrollState 的帮助下实现这一点吗?

    标签: android scroll android-jetpack-compose android-jetpack lazycolumn


    【解决方案1】:

    它存在于 Column 中的原因是因为它在生成时知道所有项目(行)。

    但是 LazyColumn 在任何给定时刻仅显示总视图的一部分,并且当您滚动时,它会不断地在屏幕上重新生成视图(加上可见区域上方和/或下方的一对),因此它从不实际计算所有行的总高度。如果您想获得滚动位置,则必须手动计算它。如果每行的高度相同,它会工作得很好。但是如果高度不同,那么您将无法获得确切的滚动位置(您的计算将根据当前显示的行的高度而波动)。但是,您必须自己进行计算:

    计算所有项目的总大小

    val totalItems = lazyListState.layoutInfo.totalItemsCount
    val itemLengthInPx = lazyListState.layoutInfo.visibleItemsInfo.firstOrNull()?.size ?: 0
    val totalLengthInPx = totalItems * itemLengthInPx 
    

    计算当前滚动位置

    val scrollPos = (lazyListState.firstVisibleItemIndex * itemLengthInPx) / totalLengthInPx
    

    但正如我之前提到的,这个计算取决于每个项目的高度(itemLengthInPx),如果所有视图都相同,它就可以完美地工作。但是你可以看到如果每个视图都有不同的高度,它会如何波动

    【讨论】:

    • 这与“滚动位置”不完全一样,每次滚动列表时,列中的滚动位置都会发生变化,并且第一项的偏移量会发生一点变化,但是这样一来,如果第一个可见项目更改 (firstVisibleItemIndex)
    • 您正在描述列中的滚动位置。 LaxyColumn 完全不同(出于我在回答中解释的所有原因)。关键是在任何给定时间只显示少数项目,您需要计算这些行相对于完整项目列表的位置。因此,您肯定需要跟踪 firstVisibleItemIndex ——它会告诉您正在显示的“部分”
    【解决方案2】:

    通过将onGloballyPosition{ it.positionInParent()} 修饰符附加到一个或多个项目,可以在项目本身中获得滚动量,无需计算。

    然后,这些项目可以用它们自己的滚动位置来做他们需要做的事情,例如偏移一些屏幕绘图的 y 坐标。

    或者,如果您需要父 LazyColumn 中的滚动偏移量,您可以在项目列表的最顶部有一个项目(也许是一个高度为零的项目,尽管我没有测试过),它会将其位置报告给每当它移动时,父级(可能通过更新由父级传递给项目的 mutableState)。

    我也有同样的需求,onGloballyPosition{ it.positionInParent()} 很好地解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2021-09-28
      • 1970-01-01
      • 2021-11-09
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多