fix: immediately scrolling
This commit is contained in:
@@ -323,34 +323,38 @@ private fun DayChips(
|
|||||||
|
|
||||||
LaunchedEffect(pagerState, days) {
|
LaunchedEffect(pagerState, days) {
|
||||||
snapshotFlow {
|
snapshotFlow {
|
||||||
pagerState.settledPage
|
pagerState.currentPage
|
||||||
}.collectLatest { targetPage ->
|
}.collectLatest { targetPage ->
|
||||||
|
|
||||||
if (targetPage in days.indices) {
|
if (targetPage in days.indices) {
|
||||||
val layoutInfo = listState.layoutInfo
|
val layoutInfo = listState.layoutInfo
|
||||||
var visibleItems = layoutInfo.visibleItemsInfo
|
val visibleItems = layoutInfo.visibleItemsInfo
|
||||||
var targetItem = visibleItems.firstOrNull { it.index == targetPage }
|
val targetItem = visibleItems.firstOrNull { it.index == targetPage }
|
||||||
if (targetItem == null) {
|
|
||||||
listState.scrollToItem(index = targetPage)
|
|
||||||
val updatedLayout = listState.layoutInfo
|
|
||||||
visibleItems = updatedLayout.visibleItemsInfo
|
|
||||||
targetItem = visibleItems.firstOrNull { it.index == targetPage }
|
|
||||||
}
|
|
||||||
if (targetItem != null) {
|
if (targetItem != null) {
|
||||||
val visiblePercentage = getVisiblePercentage(targetItem, layoutInfo)
|
val visiblePercentage = getVisiblePercentage(targetItem, layoutInfo)
|
||||||
val minVisibleThreshold = 0.75f
|
val minVisibleThreshold = 0.9f
|
||||||
|
|
||||||
if (visiblePercentage < minVisibleThreshold) {
|
if (visiblePercentage < minVisibleThreshold) {
|
||||||
val viewPortWidth = layoutInfo.viewportEndOffset - layoutInfo.viewportStartOffset
|
val viewPortWidth = layoutInfo.viewportEndOffset - layoutInfo.viewportStartOffset
|
||||||
val halfViewport = viewPortWidth / 2f
|
val halfViewport = viewPortWidth / 2f
|
||||||
val centerOffset = (halfViewport - (targetItem.size / 2f) - paddingPx).toInt()
|
val centerOffset = (halfViewport - (targetItem.size / 2f) - paddingPx).toInt()
|
||||||
|
|
||||||
listState.animateScrollToItem(index = targetPage, scrollOffset = -centerOffset)
|
listState.animateScrollToItem(index = targetPage, scrollOffset = -centerOffset)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
val viewPortWidth = layoutInfo.viewportEndOffset - layoutInfo.viewportStartOffset
|
||||||
|
val halfViewport = viewPortWidth / 2f
|
||||||
|
|
||||||
|
val averageSize = visibleItems.map { it.size }.average().toInt().coerceAtLeast(150)
|
||||||
|
val centerOffset = (halfViewport - (averageSize / 2f) - paddingPx).toInt()
|
||||||
|
|
||||||
|
listState.animateScrollToItem(index = targetPage, scrollOffset = -centerOffset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LazyRow(state = listState, horizontalArrangement = Arrangement.spacedBy(6.dp), contentPadding = PaddingValues(horizontal = hPadding, vertical = 2.dp),) {
|
LazyRow(state = listState, horizontalArrangement = Arrangement.spacedBy(6.dp), contentPadding = PaddingValues(horizontal = hPadding, vertical = 2.dp),) {
|
||||||
items(days, key = { it.date.toEpochDay() }) { day ->
|
items(days, key = { it.date.toEpochDay() }) { day ->
|
||||||
val selected = selectedDate == day.date
|
val selected = selectedDate == day.date
|
||||||
|
|||||||
Reference in New Issue
Block a user