Fix the scroll bar thumb jumping a little bit due to lack of smothness on interpolatedIndex

pull/1553/head
Rodrigo Dias Ferreira 1 year ago
parent 2aea08364b
commit 32514c1b68

@ -33,7 +33,7 @@ import kotlin.math.abs
* @return a [Float] in the range [firstItemPosition..nextItemPosition) where nextItemPosition * @return a [Float] in the range [firstItemPosition..nextItemPosition) where nextItemPosition
* is the index of the consecutive item along the major axis. * is the index of the consecutive item along the major axis.
* */ * */
internal inline fun <LazyState : ScrollableState, LazyStateItem> LazyState.interpolateFirstItemIndex( internal inline fun <LazyState : ScrollableState, LazyStateItem> LazyState.interpolateIndex(
visibleItems: List<LazyStateItem>, visibleItems: List<LazyStateItem>,
crossinline itemSize: LazyState.(LazyStateItem) -> Int, crossinline itemSize: LazyState.(LazyStateItem) -> Int,
crossinline offset: LazyState.(LazyStateItem) -> Int, crossinline offset: LazyState.(LazyStateItem) -> Int,

@ -51,7 +51,7 @@ fun LazyListState.scrollbarState(
if (visibleItemsInfo.isEmpty()) return@snapshotFlow null if (visibleItemsInfo.isEmpty()) return@snapshotFlow null
val firstIndex = min( val firstIndex = min(
a = interpolateFirstItemIndex( a = interpolateIndex(
visibleItems = visibleItemsInfo, visibleItems = visibleItemsInfo,
itemSize = { it.size }, itemSize = { it.size },
offset = { it.offset }, offset = { it.offset },
@ -114,8 +114,11 @@ fun LazyGridState.scrollbarState(
if (visibleItemsInfo.isEmpty()) return@snapshotFlow null if (visibleItemsInfo.isEmpty()) return@snapshotFlow null
val firstIndex = min( val firstIndex = min(
a = interpolateFirstItemIndex( a = interpolateIndex(
visibleItems = visibleItemsInfo, visibleItems = when (layoutInfo.orientation) {
Orientation.Vertical -> layoutInfo.visibleItemsInfo.filter { it.row == 0 }
Orientation.Horizontal -> layoutInfo.visibleItemsInfo.filter { it.column == 0 }
},
itemSize = { layoutInfo.orientation.valueOf(it.size) }, itemSize = { layoutInfo.orientation.valueOf(it.size) },
offset = { layoutInfo.orientation.valueOf(it.offset) }, offset = { layoutInfo.orientation.valueOf(it.offset) },
nextItemOnMainAxis = { first -> nextItemOnMainAxis = { first ->
@ -188,8 +191,8 @@ fun LazyStaggeredGridState.scrollbarState(
if (visibleItemsInfo.isEmpty()) return@snapshotFlow null if (visibleItemsInfo.isEmpty()) return@snapshotFlow null
val firstIndex = min( val firstIndex = min(
a = interpolateFirstItemIndex( a = interpolateIndex(
visibleItems = visibleItemsInfo, visibleItems = layoutInfo.visibleItemsInfo.filter { it.lane == 0 },
itemSize = { layoutInfo.orientation.valueOf(it.size) }, itemSize = { layoutInfo.orientation.valueOf(it.size) },
offset = { layoutInfo.orientation.valueOf(it.offset) }, offset = { layoutInfo.orientation.valueOf(it.offset) },
nextItemOnMainAxis = { first -> nextItemOnMainAxis = { first ->

Loading…
Cancel
Save