in android/source/src/main/kotlin/com/gu/source/components/pager/PagerProgressIndicator.kt [65:118]
fun PagerProgressIndicator(
pagerState: PagerState,
selectedIndicatorColour: Color,
unSelectedIndicatorColour: Color,
modifier: Modifier = Modifier,
maxIndicatorCount: Int = DefaultIndicatorCount,
indicatorSpacing: Dp = DefaultItemSpacing,
indicatorShape: Shape = CircleShape,
selectedItemSize: Dp = DefaultSelectedItemSize,
unselectedItemScaleFactor: Float = DefaultUnselectedItemScaling,
numberOfItemsToScale: Int = DefaultNumberOfItemsToScale,
itemsVerticalAlignment: Alignment.Vertical = Alignment.CenterVertically,
) {
val listState = rememberLazyListState()
val adjustedMaxItems = maxIndicatorCount
.coerceAtMost(pagerState.pageCount)
.toOddUnder()
val rowWidth = selectedItemSize * adjustedMaxItems +
indicatorSpacing * (adjustedMaxItems - 1)
val itemWidthInPx = with(LocalDensity.current) { selectedItemSize.toPx() }
val rowWidthInPx = with(LocalDensity.current) { rowWidth.toPx() }
LaunchedEffect(pagerState.currentPage) {
listState.animateScrollToItem(
index = pagerState.currentPage,
scrollOffset = (itemWidthInPx / 2 - rowWidthInPx / 2).toInt(),
)
}
val numberOfScaledItems = numberOfItemsToScale.coerceAtMost(adjustedMaxItems).toOddUnder()
LazyRow(
state = listState,
modifier = modifier.width(rowWidth),
horizontalArrangement = Arrangement.spacedBy(indicatorSpacing),
verticalAlignment = itemsVerticalAlignment,
userScrollEnabled = false,
) {
items(pagerState.pageCount) { pageIndex ->
PagerProgressItem(
itemIndex = pageIndex,
selectedItemIndex = pagerState.currentPage,
selectedItemSize = selectedItemSize,
selectedColour = selectedIndicatorColour,
unSelectedColour = unSelectedIndicatorColour,
unselectedItemScaleFactor = unselectedItemScaleFactor,
itemShape = indicatorShape,
numberOfItemsToScale = numberOfScaledItems,
)
}
}
}