我有一个Composable
是在一个LazyColumn
,但我试图做的可见性检查出的LazyListState
我用这个
fun LazyListState.visibleItems(itemVisiblePercentThreshold: Float) =
layoutInfo
.visibleItemsInfo
.filter {
visibilityPercent(it) >= itemVisiblePercentThreshold
}
private fun LazyListState.visibilityPercent(info: LazyListItemInfo): Float {
val cutTop = maxOf(0, layoutInfo.viewportStartOffset - info.offset)
val cutBottom = maxOf(0, info.offset + info.size - layoutInfo.viewportEndOffset)
return maxOf(0f, 100f - (cutTop + cutBottom) * 100f / info.size)
}
但是现在我想让它在Composable
里面,因为我没有访问列表的权限,其他功能使用我的Composables
,它可能在LazyList
,Surface
,无论什么里面,所以我使用onGloballyPositioned
来确定它是否可见,但是我想知道它是否至少30%可见。有什么想法吗?
说明
我有一个@Composable
,我想提供给我的应用程序的其他功能,例如:LazyColumn
打印它的项目,但是他们想把我的@Composable
添加到列表的顶部,所以我想知道我的@Composable
何时可见(至少30%)在这种情况下,如果它在顶部,通常应该始终是100%当加载列表时,但例如在Appendix 2中,他们希望将我的@Composable
添加到列表的中间,所以我应该知道它何时开始可见,这就是为什么我需要阈值来发送一些事件。
它不会总是一个LazyColumn
,这就是为什么我不知道我是否想连接到一个LazyListState
,但如果需要,我可以收到一个LazyListState
对我的@Composable
。
2条答案
按热度按时间vbkedwbf1#
如果你想在任何Compoasble中使用它,你可以使用
Modifier.onGloballyPositioned{}
我发布了一个有点复杂的例子来展示你可以得到位置,不管parent在它的parent中的位置。
您可以使用它与LazyColumn或列与垂直滚动。
编辑
如果不想传递父LayoutCoordinates,可以将此修改器更新为
如果您想将其用于多个Composable,请创建一个自定义Composable,
你可以用它作为
cdmah0mi2#
您可以使用
snapshotFlow
轻松监控可见项目:这将重新计算每个项目的可见程度,每当滚动状态发生变化时,然后在UI中显示可见部分。