Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Карусель представляет собой прокручиваемый список элементов, динамически подстраивающийся под размер окна. Используйте карусели для демонстрации коллекции связанного контента. Элементы карусели акцентируют внимание на визуальных элементах, но также могут содержать краткий текст, подстраивающийся под размер элемента.
Доступны четыре варианта макета карусели для различных вариантов использования:
Мультипросмотр : включает элементы разных размеров. Рекомендуется для просмотра нескольких элементов одновременно, например фотографий.
Неограниченный : содержит элементы одного размера, выходящие за пределы экрана. Можно настроить для отображения дополнительного текста или другого пользовательского интерфейса над или под каждым элементом.
Hero : выделяет одно большое изображение для фокусировки и позволяет заглянуть в будущее с помощью небольшого элемента. Рекомендуется для выделения контента, на котором вы хотите сделать акцент, например, миниатюр фильмов или передач.
Полноэкранный режим : отображает один большой элемент от края до края и прокручивается вертикально. Рекомендуется для контента, высота которого больше ширины.
Рисунок 1. Неограниченный (1) и полноэкранный (2) типы карусели.
На этой странице показано, как реализовать макеты с несколькими окнами просмотра и неограниченной каруселью. Подробнее о типах макетов см. в руководстве по Carousel Material 3.
state : Экземпляр CarouselState , который управляет текущим индексом элемента и позицией прокрутки. Создайте это состояние с помощью rememberCarouselState { itemCount } , где itemCount — общее количество элементов в карусели.
itemSpacing : определяет величину пустого пространства между соседними элементами в карусели.
contentPadding : добавляет отступ вокруг области контента карусели. Используйте его, чтобы добавить пространство перед первым элементом или после последнего элемента, а также для задания полей для элементов в прокручиваемой области.
content : Компонуемая функция, получающая целочисленный индекс. Используйте эту лямбда-функцию для определения пользовательского интерфейса каждого элемента карусели на основе его индекса.
Эти компонуемые элементы различаются по способу указания размеров элементов:
itemWidth (для HorizontalUncontainedCarousel ): указывает точную ширину каждого элемента в неизолированной карусели.
preferredItemWidth (для HorizontalMultiBrowseCarousel ): предлагает идеальную ширину для элементов в карусели с несколькими просмотрами, позволяя компоненту отображать несколько элементов, если позволяет пространство.
Пример: карусель с несколькими вариантами просмотра
Определяет класс данных CarouselItem , который структурирует данные для каждого элемента карусели.
Создает и запоминает List объектов CarouselItem , заполненных ресурсами изображений и описаниями.
Использует компонуемый элемент HorizontalMultiBrowseCarousel , предназначенный для отображения нескольких элементов в карусели.
Состояние карусели инициализируется с помощью rememberCarouselState , которому присваивается общее количество элементов.
У элементов есть свойство preferredItemWidth (в данном случае 186.dp ), которое определяет оптимальную ширину каждого элемента. Карусель использует это значение для определения количества элементов, которые могут поместиться на экране одновременно.
Параметр itemSpacing добавляет небольшой зазор между элементами.
Завершающая лямбда-функция HorizontalMultiBrowseCarousel перебирает элементы CarouselItems . На каждой итерации она извлекает элемент с индексом i и визуализирует для него Image которое можно скомпоновать.
Modifier.maskClip(MaterialTheme.shapes.extraLarge) применяет к каждому изображению предопределенную маску формы, придавая ему скругленные углы.
contentDescription предоставляет описание доступности изображения.
Результат
На следующем изображении показан результат предыдущего фрагмента:
Рисунок 2. Карусель с несколькими вариантами просмотра, в которой последний элемент обрезан.
Пример: Неограниченная карусель
Следующий фрагмент реализует неконтрастную карусель:
Компоновочный элемент HorizontalUncontainedCarousel создает макет карусели.
Параметр itemWidth задает фиксированную ширину для каждого элемента в карусели.
Результат
На следующем изображении показан результат предыдущего фрагмента:
Рисунок 3. Неограниченная карусель, где последний элемент в карусели не обрезан.
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2025-08-27 UTC.
[null,null,["Последнее обновление: 2025-08-27 UTC."],[],[],null,["A carousel displays a scrollable list of items that adapt dynamically based on\nwindow size. Use carousels to showcase a collection of related content.\nCarousel items emphasize visuals, but can also contain brief text that adapts to\nthe item size.\n\nThere are four carousel layouts available to suit different use cases:\n\n- **Multi-browse**: Includes differently sized items. Recommended for browsing many items at once, like photos.\n- **Uncontained**: Contains items that are a single size and flow past the edge of the screen. Can be customized to show more text or other UI above or below each item.\n- **Hero**: Highlights one large image to focus on and provides a peek of what's next with a small item. Recommended for spotlighting content that you want to emphasize, like movie or show thumbnails.\n- **Full-screen**: Shows one edge-to-edge large item at a time and scrolls vertically. Recommended for content that is taller than it is wide.\n\n**Figure 1.** Uncontained (1) and full-screen (2) carousel types.\n\nThis page shows you how to implement the multi-browse and uncontained carousel\nlayouts. See the [Carousel Material 3 guidelines](https://m3.material.io/components/carousel/overview) for\nmore information about the layout types.\n\nAPI surface\n\nTo implement multi-browse and uncontained carousels, use the\n[`HorizontalMultiBrowseCarousel`](/reference/kotlin/androidx/compose/material3/carousel/package-summary#HorizontalMultiBrowseCarousel(androidx.compose.material3.carousel.CarouselState,androidx.compose.ui.unit.Dp,androidx.compose.ui.Modifier,androidx.compose.ui.unit.Dp,androidx.compose.foundation.gestures.TargetedFlingBehavior,androidx.compose.ui.unit.Dp,androidx.compose.ui.unit.Dp,androidx.compose.foundation.layout.PaddingValues,kotlin.Function2)) and [`HorizontalUncontainedCarousel`](/reference/kotlin/androidx/compose/material3/carousel/package-summary#HorizontalUncontainedCarousel(androidx.compose.material3.carousel.CarouselState,androidx.compose.ui.unit.Dp,androidx.compose.ui.Modifier,androidx.compose.ui.unit.Dp,androidx.compose.foundation.gestures.TargetedFlingBehavior,androidx.compose.foundation.layout.PaddingValues,kotlin.Function2))\ncomposables. These composables share the following key parameters:\n\n- `state`: A `CarouselState` instance that manages the current item index and scroll position. Create this state using `rememberCarouselState { itemCount }`, where `itemCount` is the total number of items in the carousel.\n- `itemSpacing`: Defines the amount of empty space between adjacent items in the carousel.\n- `contentPadding`: Applies padding around the content area of the carousel. Use this to add space before the first item or after the last item, or to provide margins for the items within the scrollable region.\n- `content`: A composable function that receives an integer index. Use this lambda to define the UI for each item in the carousel based on its index.\n\nThese composables differ in how they specify item sizing:\n\n- `itemWidth` (for `HorizontalUncontainedCarousel`): Specifies the exact width for each item in an uncontained carousel.\n- `preferredItemWidth` (for `HorizontalMultiBrowseCarousel`): Suggests the ideal width for items in a multi-browse carousel, letting the component display multiple items if space permits.\n\nExample: Multi-browse carousel\n\nThis snippet implements a multi-browse carousel:\n\n\n```kotlin\n@Composable\nfun CarouselExample_MultiBrowse() {\n data class CarouselItem(\n val id: Int,\n @DrawableRes val imageResId: Int,\n val contentDescription: String\n )\n\n val items = remember {\n listOf(\n CarouselItem(0, R.drawable.cupcake, \"cupcake\"),\n CarouselItem(1, R.drawable.donut, \"donut\"),\n CarouselItem(2, R.drawable.eclair, \"eclair\"),\n CarouselItem(3, R.drawable.froyo, \"froyo\"),\n CarouselItem(4, R.drawable.gingerbread, \"gingerbread\"),\n )\n }\n\n HorizontalMultiBrowseCarousel(\n state = rememberCarouselState { items.count() },\n modifier = Modifier\n .fillMaxWidth()\n .wrapContentHeight()\n .padding(top = 16.dp, bottom = 16.dp),\n preferredItemWidth = 186.dp,\n itemSpacing = 8.dp,\n contentPadding = PaddingValues(horizontal = 16.dp)\n ) { i -\u003e\n val item = items[i]\n Image(\n modifier = Modifier\n .height(205.dp)\n .maskClip(MaterialTheme.shapes.extraLarge),\n painter = painterResource(id = item.imageResId),\n contentDescription = item.contentDescription,\n contentScale = ContentScale.Crop\n )\n }\n}https://github.com/android/snippets/blob/5673ffc60b614daf028ee936227128eb8c4f9781/compose/snippets/src/main/java/com/example/compose/snippets/components/Carousel.kt#L44-L82\n```\n\n\u003cbr /\u003e\n\nKey points about the code\n\n- Defines a `CarouselItem` data class, which structures the data for each element in the carousel.\n- Creates and remembers a `List` of `CarouselItem` objects that are populated with image resources and descriptions.\n- Uses the `HorizontalMultiBrowseCarousel` composable, which is designed for displaying multiple items in a carousel.\n - The carousel's state is initialized using `rememberCarouselState`, which is given the total count of items.\n - Items have a `preferredItemWidth` (here, `186.dp`), which suggests an optimal width for each item. The carousel uses this to determine how many items can fit on the screen at once.\n - The `itemSpacing` parameter adds a small gap between items.\n - The trailing lambda of `HorizontalMultiBrowseCarousel` iterates through the `CarouselItems`. In each iteration, it retrieves the item at index `i` and renders an `Image` composable for it.\n - `Modifier.maskClip(MaterialTheme.shapes.extraLarge)` applies a predefined shape mask to each image, giving it rounded corners.\n - `contentDescription` provides an accessibility description for the image.\n\nResult\n\nThe following image shows the result from the preceding snippet:\n**Figure 2.** A multi-browse carousel, with the last item clipped.\n\nExample: Uncontained carousel\n\nThe following snippet implements an uncontained carousel:\n\n\n```kotlin\n@Composable\nfun CarouselExample() {\n data class CarouselItem(\n val id: Int,\n @DrawableRes val imageResId: Int,\n val contentDescription: String\n )\n\n val carouselItems = remember {\n listOf(\n CarouselItem(0, R.drawable.cupcake, \"cupcake\"),\n CarouselItem(1, R.drawable.donut, \"donut\"),\n CarouselItem(2, R.drawable.eclair, \"eclair\"),\n CarouselItem(3, R.drawable.froyo, \"froyo\"),\n CarouselItem(4, R.drawable.gingerbread, \"gingerbread\"),\n )\n }\n\n HorizontalUncontainedCarousel(\n state = rememberCarouselState { carouselItems.count() },\n modifier = Modifier\n .fillMaxWidth()\n .wrapContentHeight()\n .padding(top = 16.dp, bottom = 16.dp),\n itemWidth = 186.dp,\n itemSpacing = 8.dp,\n contentPadding = PaddingValues(horizontal = 16.dp)\n ) { i -\u003e\n val item = carouselItems[i]\n Image(\n modifier = Modifier\n .height(205.dp)\n .maskClip(MaterialTheme.shapes.extraLarge),\n painter = painterResource(id = item.imageResId),\n contentDescription = item.contentDescription,\n contentScale = ContentScale.Crop\n )\n }\n}https://github.com/android/snippets/blob/5673ffc60b614daf028ee936227128eb8c4f9781/compose/snippets/src/main/java/com/example/compose/snippets/components/Carousel.kt#L88-L126\n```\n\n\u003cbr /\u003e\n\nKey points about the code\n\n- The `HorizontalUncontainedCarousel` composable creates the carousel layout.\n - The `itemWidth` parameter sets a fixed width for each item in the carousel.\n\nResult\n\nThe following image shows the result from the preceding snippet:\n**Figure 3.** An uncontained carousel, where the last item in the carousel is not clipped."]]