簡體   English   中英

LazyColumn Jetpack Compose 中的當前滾動 position 值(以像素為單位)

[英]Current scroll position value in pixels in LazyColumn Jetpack Compose

我想要在 LazyColumn 中以 px 為單位的總滾動 position。 該列本身有一個 ScrollState,它有一個值(在文檔中描述為當前滾動 position 值(以像素為單位)),但是 LazyColumn ScrollState 沒有這個字段,我想要完全等同於 LazyColumn 的 Column ScrollState 滾動 position 值,我如何可以借助 LazyScrollState 實現嗎?

它存在於 Column 中的原因是因為它在生成時知道所有項目(行)。

但是 LazyColumn 在任何給定時刻僅顯示總視圖的一部分,並且當您滾動時,它會不斷地在屏幕上重新生成視圖(加上可見區域上方和/或下方的一對),因此它從不實際計算所有行的總高度。 如果您想獲得卷軸 position,則必須手動計算。 如果每行的高度相同,它會工作得很好。 但是如果高度不同,那么您將無法獲得精確的滾動 position(您的計算將根據當前顯示的行的高度而波動)。 但是,您必須自己進行計算:

計算所有項目的總大小

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

計算當前滾動 position

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

但正如我之前提到的,這個計算取決於每個項目的高度( itemLengthInPx ),如果所有視圖都相同,它就可以完美地工作。 但是你可以看到如果每個視圖都有不同的高度,它會如何波動

通過將onGloballyPosition{ it.positionInParent()}修飾符附加到一個或多個項目,可以在項目本身中獲得滾動量,無需計算。

然后,項目可以用自己的滾動position來做他們需要做的事情,例如偏移一些屏幕繪圖的y坐標。

或者,如果您需要父 LazyColumn 中的滾動偏移量,您可以在項目列表的最頂部有一個項目(可能是高度為零的項目,盡管我沒有測試過),它會將其 position 報告給每當它移動時,父級(可能通過更新由父級傳遞給項目的 mutableState)。

我有同樣的需求, onGloballyPosition{ it.positionInParent()}很好地解決了這個問題。

您可以通過firstVisibleItemScrollOffset獲取它。
('androidx.activity:activity-compose:1.3.1')

val listState = rememberLazyListState()
val itemHeight = with(LocalDensity.current) { 80.dp.toPx() } // Your item height
val scrollPos = listState.firstVisibleItemIndex * itemHeight + listState.firstVisibleItemScrollOffset

Text(text = "scroll: $scrollPos")

LazyColumn(state = listState) {
    // Your items here
}

此外,您可以將滾動條 position 設置為listState ,如下所示:

LaunchedEffect(key1 = "Key") {
    delay(1000) // To show scroll explicitly, set the delay
    listState.scrollBy(itemHeight * 2)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM