Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Un carosello mostra un elenco scorrevole di elementi che si adattano dinamicamente in base alle dimensioni della finestra. Utilizza i caroselli per mostrare una raccolta di contenuti correlati.
Gli elementi del carosello mettono in evidenza le immagini, ma possono anche contenere un breve testo che si adatta alle dimensioni dell'elemento.
Sono disponibili quattro layout del carosello per adattarsi a diversi casi d'uso:
Multi-browse: include articoli di dimensioni diverse. Consigliato per sfogliare
molti elementi contemporaneamente, come le foto.
Senza contenitore: contiene elementi di una sola dimensione che scorrono oltre il bordo
dello schermo. Può essere personalizzato per mostrare più testo o altre UI sopra o sotto
ogni elemento.
Hero: mette in evidenza un'immagine grande su cui concentrarsi e fornisce un'anteprima di ciò che
segue con un piccolo elemento. Consigliato per mettere in evidenza i contenuti che vuoi
enfatizzare, come le miniature di film o programmi.
A schermo intero: mostra un elemento grande da bordo a bordo alla volta e scorre
verticalmente. Consigliato per i contenuti più alti che larghi.
Figura 1. Tipi di carosello non contenuto (1) e a schermo intero (2).
Questa pagina mostra come implementare i layout di carosello multi-browse e non contenuto. Per ulteriori informazioni sui tipi di layout, consulta le linee guida per i caroselli Material 3.
state: un'istanza CarouselState che gestisce l'indice dell'elemento corrente e
la posizione di scorrimento. Crea questo stato utilizzando rememberCarouselState { itemCount },
dove itemCount è il numero totale di elementi nel carosello.
itemSpacing: Definisce la quantità di spazio vuoto tra elementi adiacenti nel
carosello.
contentPadding: applica il padding intorno all'area dei contenuti del carosello. Utilizza
questo valore per aggiungere spazio prima del primo elemento o dopo l'ultimo elemento oppure per fornire
margini per gli elementi all'interno della regione scorrevole.
content: una funzione componibile che riceve un indice intero. Utilizza questa
espressione lambda per definire l'interfaccia utente per ogni elemento del carosello in base al relativo indice.
Questi composable differiscono per il modo in cui specificano le dimensioni degli elementi:
itemWidth (per HorizontalUncontainedCarousel): specifica la larghezza esatta di ogni elemento di un carosello non contenuto.
preferredItemWidth (per HorizontalMultiBrowseCarousel): suggerisce la larghezza ideale per gli elementi di un carosello di navigazione multipla, consentendo al componente di visualizzare più elementi se lo spazio lo consente.
Esempio: carosello multi-navigazione
Questo snippet implementa un carosello multi-browse:
Definisce una classe di dati CarouselItem, che struttura i dati per ogni elemento del carosello.
Crea e memorizza un List di oggetti CarouselItem compilati con risorse e descrizioni delle immagini.
Utilizza il composable HorizontalMultiBrowseCarousel, progettato per visualizzare più elementi in un carosello.
Lo stato del carosello viene inizializzato utilizzando rememberCarouselState, a cui viene assegnato il conteggio totale degli elementi.
Gli elementi hanno un valore preferredItemWidth (in questo caso, 186.dp), che suggerisce una larghezza ottimale per ogni elemento. Il carosello utilizza questo valore per determinare quanti elementi possono essere visualizzati contemporaneamente sullo schermo.
Il parametro itemSpacing aggiunge un piccolo spazio tra gli elementi.
La lambda finale di HorizontalMultiBrowseCarousel scorre CarouselItems. In ogni iterazione, recupera l'elemento all'indice i e ne esegue il rendering di un composable Image.
Modifier.maskClip(MaterialTheme.shapes.extraLarge) applica una maschera di forma predefinita a ogni immagine, conferendole angoli arrotondati.
contentDescription fornisce una descrizione di accessibilità per l'immagine.
Risultato
L'immagine seguente mostra il risultato dello snippet precedente:
Figura 2. Un carosello di navigazione multipla, con l'ultimo elemento ritagliato.
Esempio: carosello senza contenitore
Il seguente snippet implementa un carosello non contenuto:
Il composable HorizontalUncontainedCarousel crea il layout del carosello.
Il parametro itemWidth imposta una larghezza fissa per ogni elemento del carosello.
Risultato
L'immagine seguente mostra il risultato dello snippet precedente:
Figura 3. Un carosello non contenuto, in cui l'ultimo elemento del carosello non viene tagliato.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-08-28 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-08-28 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/7a0ebbee11495f628cf9d574f6b6069c2867232a/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/7a0ebbee11495f628cf9d574f6b6069c2867232a/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."]]