I pulsanti con icona mostrano le azioni che gli utenti possono intraprendere. I pulsanti con icona devono utilizzare un'icona con un significato chiaro e in genere rappresentano azioni comuni o utilizzate di frequente.
Esistono due tipi di pulsanti icona:
- Predefinito: questi pulsanti possono aprire altri elementi, ad esempio un menu o una ricerca.
- Attivazione/disattivazione: questi pulsanti possono rappresentare azioni binarie che possono essere attivate o disattivate, come "Preferito" o "Segnalibro".
Piattaforma API
Utilizza il componibile IconButton per implementare i pulsanti con icona standard. Per creare stili visivi diversi, come riempito, riempito tonale o con contorno, utilizza rispettivamente FilledIconButton, FilledTonalIconButton e OutlinedIconButton.
I parametri chiave per IconButton includono:
onClick: una funzione lambda che viene eseguita quando l'utente tocca il pulsante con icona.enabled: un valore booleano che controlla lo stato di attivazione del pulsante. Quandofalse, il pulsante non risponde all'input dell'utente.content: i contenuti componibili all'interno del pulsante, in genere unIcon.
Esempio di base: pulsante icona di attivazione/disattivazione
Questo esempio mostra come implementare un pulsante di attivazione/disattivazione con icona. Un pulsante con icona di attivazione/disattivazione cambia aspetto a seconda che sia selezionato o meno.
@Preview @Composable fun ToggleIconButtonExample() { // isToggled initial value should be read from a view model or persistent storage. var isToggled by rememberSaveable { mutableStateOf(false) } IconButton( onClick = { isToggled = !isToggled } ) { Icon( painter = if (isToggled) painterResource(R.drawable.favorite_filled) else painterResource(R.drawable.favorite), contentDescription = if (isToggled) "Selected icon button" else "Unselected icon button." ) } }
Punti chiave sul codice
- Il componibile
ToggleIconButtonExampledefinisce unIconButtonattivabile/disattivabile.mutableStateOf(false)crea un oggettoMutableStateche contiene un valore booleano, inizialmentefalse. In questo modo,isToggleddiventa un contenitore di stato, il che significa che Compose ricompone la UI ogni volta che il suo valore cambia.rememberSaveablegarantisce che lo stato diisToggledpersista durante le modifiche alla configurazione, come la rotazione dello schermo.
- La funzione lambda
onClickdiIconButtondefinisce il comportamento del pulsante quando viene fatto clic, attivando/disattivando lo stato tratrueefalse. - Il parametro
painterdel componibileIconcarica in modo condizionale unpainterResourcediverso in base allo statoisToggled. In questo modo, l'aspetto visivo dell'icona cambia.- Se
isToggledètrue, carica l'elemento drawable del cuore pieno. - Se
isToggledèfalse, carica l'elemento drawable del cuore con contorno.
- Se
- Anche l'elemento
contentDescriptiondiIconviene aggiornato in base allo stato diisToggledper fornire informazioni sull'accessibilità appropriate.
Risultato
La seguente immagine mostra il pulsante di attivazione/disattivazione dello snippet precedente nello stato non selezionato:
Esempio avanzato: azioni ripetute alla pressione
Questa sezione mostra come creare pulsanti con icone che attivano continuamente un'azione mentre l'utente li tiene premuti, anziché attivarla una sola volta per clic.
@Composable fun MomentaryIconButton( unselectedImage: Int, selectedImage: Int, contentDescription: String, modifier: Modifier = Modifier, stepDelay: Long = 100L, // Minimum value is 1L milliseconds. onClick: () -> Unit ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() val pressedListener by rememberUpdatedState(onClick) LaunchedEffect(isPressed) { while (isPressed) { delay(stepDelay.coerceIn(1L, Long.MAX_VALUE)) pressedListener() } } IconButton( modifier = modifier, onClick = onClick, interactionSource = interactionSource ) { Icon( painter = if (isPressed) painterResource(id = selectedImage) else painterResource(id = unselectedImage), contentDescription = contentDescription, ) } }
Punti chiave sul codice
MomentaryIconButtonaccetta ununselectedImage: Int, l'ID risorsa drawable per l'icona quando il pulsante non è premuto, eselectedImage: Int, l'ID risorsa drawable per l'icona quando il pulsante è premuto.- Utilizza un
interactionSourceper monitorare in modo specifico le interazioni di "pressione" dell'utente. isPressedè true quando il pulsante viene premuto attivamente e false in caso contrario. QuandoisPressedètrue,LaunchedEffectentra in un loop.- All'interno di questo loop, utilizza un
delay(constepDelay) per creare pause tra le azioni di attivazione.coerceIngarantisce che il ritardo sia di almeno 1 ms per evitare loop infiniti. pressedListenerviene richiamato dopo ogni ritardo all'interno del loop. In questo modo, l'azione viene ripetuta.
- All'interno di questo loop, utilizza un
pressedListenerutilizzarememberUpdatedStateper garantire che la funzione lambdaonClick(l'azione da eseguire) sia sempre la più aggiornata dell'ultima composizione.- L'immagine visualizzata di
Iconcambia a seconda che il pulsante sia premuto o meno.- Se
isPressedè true, viene mostratoselectedImage. - In caso contrario, viene visualizzato
unselectedImage.
- Se
Ora utilizza questo MomentaryIconButton in un esempio. Lo snippet seguente mostra due pulsanti con icona che controllano un contatore:
@Preview() @Composable fun MomentaryIconButtonExample() { var pressedCount by remember { mutableIntStateOf(0) } Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { MomentaryIconButton( unselectedImage = R.drawable.fast_rewind, selectedImage = R.drawable.fast_rewind_filled, stepDelay = 100L, onClick = { pressedCount -= 1 }, contentDescription = "Decrease count button" ) Spacer(modifier = Modifier) Text("advanced by $pressedCount frames") Spacer(modifier = Modifier) MomentaryIconButton( unselectedImage = R.drawable.fast_forward, selectedImage = R.drawable.fast_forward_filled, contentDescription = "Increase count button", stepDelay = 100L, onClick = { pressedCount += 1 } ) } }
Punti chiave sul codice
- Il componibile
MomentaryIconButtonExamplemostra unRowcontenente due istanzeMomentaryIconButtone un componibileTextper creare una UI per incrementare e decrementare un contatore. - Mantiene una variabile di stato modificabile
pressedCountutilizzandorememberemutableIntStateOf, inizializzata su 0. QuandopressedCountcambia, tutti i componibili che lo osservano (come il componibileText) si ricompongono per riflettere il nuovo valore. - Il primo
MomentaryIconButtondiminuiscepressedCountquando viene selezionato o tenuto premuto. - La seconda
MomentaryIconButtonaumentapressedCountquando viene selezionata o tenuta premuta. - Entrambi i pulsanti utilizzano un
stepDelaydi 100 millisecondi, il che significa che l'azioneonClickviene ripetuta ogni 100 ms mentre un pulsante viene tenuto premuto.
Risultato
Il seguente video mostra la UI con i pulsanti icona e il contatore: