轮播图显示一个可滚动的项目列表,这些项目会根据窗口大小动态调整。使用轮播图展示一组相关内容。轮播图项目侧重于视觉效果,但也可以包含适应项目大小的简短文本。
有四种轮播图布局可供选择,以适应不同的用例:
- 多浏览:包含不同大小的项目。建议用于一次浏览多个项目,例如照片。
- 未限制:包含单一大小的项目,这些项目会流出屏幕边缘。可以自定义以在每个项目上方或下方显示更多文本或其他 UI。
- 主推:突出显示一张大图以供聚焦,并提供一个小项目以预览接下来内容。建议用于突出显示您想要强调的内容,例如电影或节目缩略图。
- 全屏:一次显示一个边缘到边缘的大项目,并垂直滚动。建议用于高度大于宽度的内容。

本页面向您展示如何实现多浏览和未限制轮播图布局。有关布局类型的更多信息,请参阅 轮播图 Material 3 指南。
API 接口
要实现多浏览和未限制轮播图,请使用 HorizontalMultiBrowseCarousel
和 HorizontalUncontainedCarousel
可组合项。这些可组合项共享以下关键参数:
state
:一个CarouselState
实例,用于管理当前项目索引和滚动位置。使用rememberCarouselState { itemCount }
创建此状态,其中itemCount
是轮播图中的项目总数。itemSpacing
:定义轮播图中相邻项目之间的空白空间量。contentPadding
:在轮播图的内容区域周围应用内边距。可用于在第一个项目之前或最后一个项目之后添加空间,或为可滚动区域内的项目提供外边距。content
:一个接收整数索引的可组合函数。使用此 lambda 根据其索引定义轮播图中每个项目的 UI。
这些可组合项在指定项目大小的方式上有所不同:
itemWidth
(适用于HorizontalUncontainedCarousel
):指定未限制轮播图中每个项目的确切宽度。preferredItemWidth
(适用于HorizontalMultiBrowseCarousel
):建议多浏览轮播图中项目的理想宽度,如果空间允许,组件可以显示多个项目。
示例:多浏览轮播图
此代码段实现了多浏览轮播图:
@Composable fun CarouselExample_MultiBrowse() { data class CarouselItem( val id: Int, @DrawableRes val imageResId: Int, val contentDescription: String ) val items = remember { listOf( CarouselItem(0, R.drawable.cupcake, "cupcake"), CarouselItem(1, R.drawable.donut, "donut"), CarouselItem(2, R.drawable.eclair, "eclair"), CarouselItem(3, R.drawable.froyo, "froyo"), CarouselItem(4, R.drawable.gingerbread, "gingerbread"), ) } HorizontalMultiBrowseCarousel( state = rememberCarouselState { items.count() }, modifier = Modifier .fillMaxWidth() .wrapContentHeight() .padding(top = 16.dp, bottom = 16.dp), preferredItemWidth = 186.dp, itemSpacing = 8.dp, contentPadding = PaddingValues(horizontal = 16.dp) ) { i -> val item = items[i] Image( modifier = Modifier .height(205.dp) .maskClip(MaterialTheme.shapes.extraLarge), painter = painterResource(id = item.imageResId), contentDescription = item.contentDescription, contentScale = ContentScale.Crop ) } }
关于代码的要点:
- 定义了一个
CarouselItem
数据类,用于构造轮播图中每个元素的数据。 - 创建并记住一个
CarouselItem
对象列表,该列表填充了图像资源和描述。 - 使用
HorizontalMultiBrowseCarousel
可组合项,它专为在轮播图中显示多个项目而设计。- 轮播图的状态使用
rememberCarouselState
初始化,并传入项目的总数。 - 项目具有
preferredItemWidth
(此处为186.dp
),它建议了每个项目的最佳宽度。轮播图使用此宽度来确定一次可在屏幕上容纳多少个项目。 itemSpacing
参数在项目之间添加了小间隙。HorizontalMultiBrowseCarousel
的尾随 lambda 迭代CarouselItems
。在每次迭代中,它检索索引i
处的项目并为其渲染一个Image
可组合项。Modifier.maskClip(MaterialTheme.shapes.extraLarge)
对每个图像应用预定义的形状遮罩,使其具有圆角。contentDescription
为图像提供了无障碍描述。
- 轮播图的状态使用
结果
下图显示了前面代码段的结果:

示例:未限制轮播图
以下代码段实现了一个未限制轮播图:
@Composable fun CarouselExample() { data class CarouselItem( val id: Int, @DrawableRes val imageResId: Int, val contentDescription: String ) val carouselItems = remember { listOf( CarouselItem(0, R.drawable.cupcake, "cupcake"), CarouselItem(1, R.drawable.donut, "donut"), CarouselItem(2, R.drawable.eclair, "eclair"), CarouselItem(3, R.drawable.froyo, "froyo"), CarouselItem(4, R.drawable.gingerbread, "gingerbread"), ) } HorizontalUncontainedCarousel( state = rememberCarouselState { carouselItems.count() }, modifier = Modifier .fillMaxWidth() .wrapContentHeight() .padding(top = 16.dp, bottom = 16.dp), itemWidth = 186.dp, itemSpacing = 8.dp, contentPadding = PaddingValues(horizontal = 16.dp) ) { i -> val item = carouselItems[i] Image( modifier = Modifier .height(205.dp) .maskClip(MaterialTheme.shapes.extraLarge), painter = painterResource(id = item.imageResId), contentDescription = item.contentDescription, contentScale = ContentScale.Crop ) } }
关于代码的要点:
HorizontalUncontainedCarousel
可组合项创建了轮播图布局。itemWidth
参数为轮播图中的每个项目设置了固定宽度。
结果
下图显示了前面代码段的结果:
