A Pager that scrolls horizontally.
@Composable
fun HorizontalPagerWithScrollableContent() {
// This is a sample using NestedScroll and Pager.
// We use the toolbar offset changing example from
// androidx.compose.ui.samples.NestedScrollConnectionSample
val pagerState = rememberPagerState { 10 }
val toolbarHeight = 48.dp
val toolbarHeightPx = with(LocalDensity.current) { toolbarHeight.roundToPx().toFloat() }
val toolbarOffsetHeightPx = remember { mutableStateOf(0f) }
val nestedScrollConnection = remember {
object : NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
val delta = available.y
val newOffset = toolbarOffsetHeightPx.value + delta
toolbarOffsetHeightPx.value = newOffset.coerceIn(-toolbarHeightPx, 0f)
return Offset.Zero
}
}
}
Box(modifier = Modifier.fillMaxSize().nestedScroll(nestedScrollConnection)) {
TopAppBar(
modifier =
Modifier.height(toolbarHeight).offset {
IntOffset(x = 0, y = toolbarOffsetHeightPx.value.roundToInt())
},
title = { Text("Toolbar offset is ${toolbarOffsetHeightPx.value}") },
)
val paddingOffset =
toolbarHeight + with(LocalDensity.current) { toolbarOffsetHeightPx.value.toDp() }
HorizontalPager(
modifier = Modifier.fillMaxSize(),
state = pagerState,
contentPadding = PaddingValues(top = paddingOffset),
) {
Column(modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState())) {
repeat(20) {
Box(
modifier =
Modifier.fillMaxWidth()
.height(64.dp)
.padding(4.dp)
.background(if (it % 2 == 0) Color.Black else Color.Yellow),
contentAlignment = Alignment.Center,
) {
Text(
text = it.toString(),
color = if (it % 2 != 0) Color.Black else Color.Yellow,
)
}
}
}
}
}
}
@Composable
fun SimpleHorizontalPagerSample() {
// Creates a 1-pager/viewport horizontal pager with single page snapping
val state = rememberPagerState { 10 }
HorizontalPager(state = state, modifier = Modifier.fillMaxSize()) { page ->
Box(
modifier =
Modifier.padding(10.dp).background(Color.Blue).fillMaxWidth().aspectRatio(1f),
contentAlignment = Alignment.Center,
) {
Text(text = page.toString(), fontSize = 32.sp)
}
}
}