Przyciski ikon wyświetlają działania, które użytkownicy mogą wykonać. Przyciski ikon muszą używać ikony o jasnym znaczeniu i zwykle reprezentują typowe lub często używane działania.
Istnieją 2 rodzaje przycisków ikon:
- Domyślne: te przyciski mogą otwierać inne elementy, takie jak menu lub wyszukiwanie.
- Przełącznik: te przyciski mogą reprezentować działania binarne, które można włączać lub wyłączać, takie jak „ulubione” lub „zakładka”.
Interfejs API
Aby zaimplementować standardowe przyciski ikon, użyj funkcji kompozycyjnej IconButton. Aby utworzyć różne style wizualne, takie jak wypełniony, wypełniony tonalny lub konturowy, użyj odpowiednio FilledIconButton, FilledTonalIconButton i OutlinedIconButton.
Najważniejsze parametry IconButton to:
onClick: funkcja lambda, która jest wykonywana, gdy użytkownik kliknie przycisk ikony.enabled: wartość logiczna, która określa stan włączenia przycisku. Gdyfalse, przycisk nie reaguje na dane wejściowe użytkownika.content: funkcja kompozycyjna wewnątrz przycisku, zwykleIcon.
Podstawowy przykład: przycisk ikony przełącznika
Ten przykład pokazuje, jak zaimplementować przycisk przełącznika z ikoną. Przycisk ikony przełącznika zmienia wygląd w zależności od tego, czy jest zaznaczony, czy nie.
@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." ) } }
Najważniejsze informacje o kodzie
- Element kompozycyjny
ToggleIconButtonExampledefiniuje przełączany elementIconButton.mutableStateOf(false)tworzy obiektMutableState, który zawiera wartość logiczną, początkowofalse. Dzięki temuisToggledjest zmienną stanu, co oznacza, że Compose ponownie komponuje interfejs, gdy zmienia się jej wartość.rememberSaveablezapewnia, że stanisToggledjest zachowywany podczas zmian konfiguracji, takich jak obrót ekranu.
- Funkcja lambda
onClickelementuIconButtonokreśla zachowanie przycisku po kliknięciu, przełączając stan międzytrueafalse. - Parametr
painterfunkcji kompozycyjnejIconwarunkowo wczytuje inny elementpainterResourcena podstawie stanuisToggled. Zmienia to wygląd ikony.- Jeśli
isToggledtotrue, wczytuje wypełniony element graficzny serca. - Jeśli
isToggledtofalse, wczytuje element rysowalny z konturem serca.
- Jeśli
contentDescriptionelementuIconrównież aktualizuje się na podstawie stanuisToggled, aby dostarczać odpowiednie informacje o ułatwieniach dostępu.
Wynik
Obraz poniżej przedstawia przycisk przełączania z poprzedniego fragmentu kodu w stanie niewybranym:
Przykład zaawansowany: powtarzane działania po naciśnięciu
W tej sekcji pokazujemy, jak tworzyć przyciski ikon, które stale wywołują działanie, gdy użytkownik je naciśnie i przytrzyma, zamiast wywoływać je tylko raz po kliknięciu.
@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, ) } }
Najważniejsze informacje o kodzie
MomentaryIconButtonprzyjmujeunselectedImage: Int, czyli identyfikator obiektu rysowalnego ikony, gdy przycisk nie jest naciśnięty, orazselectedImage: Int, czyli identyfikator obiektu rysowalnego ikony, gdy przycisk jest naciśnięty.- Używa
interactionSourcedo śledzenia interakcji „naciśnięcia” przez użytkownika. isPressedma wartość true, gdy przycisk jest aktywnie naciskany, a w przeciwnym razie ma wartość false. GdyisPressedma wartośćtrue,LaunchedEffectwchodzi w pętlę.- W tej pętli używa
delay(zstepDelay), aby tworzyć przerwy między działaniami wyzwalającymi.coerceInzapewnia, że opóźnienie wynosi co najmniej 1 ms, aby zapobiec nieskończonym pętlom. - Funkcja
pressedListenerjest wywoływana po każdym opóźnieniu w pętli. Spowoduje to powtórzenie działania.
- W tej pętli używa
pressedListenerużywarememberUpdatedState, aby mieć pewność, że lambdaonClick(działanie do wykonania) jest zawsze aktualna i pochodzi z najnowszej kompozycji.Iconzmienia wyświetlany obraz w zależności od tego, czy przycisk jest aktualnie naciśnięty.- Jeśli
isPressedma wartość Prawda, wyświetla sięselectedImage. - W przeciwnym razie wyświetli się
unselectedImage.
- Jeśli
Następnie użyj tego słowa MomentaryIconButton w przykładzie. Ten fragment kodu pokazuje 2 przyciski ikon sterujące licznikiem:
@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 } ) } }
Najważniejsze informacje o kodzie
- Funkcja kompozycyjna
MomentaryIconButtonExamplewyświetla elementRowzawierający 2 instancjeMomentaryIconButtoni funkcję kompozycyjnąText, aby utworzyć interfejs do zwiększania i zmniejszania licznika. - Utrzymuje zmienną stanu zmiennego
pressedCountza pomocąrememberimutableIntStateOf, zainicjowaną na 0. Gdy wartośćpressedCountsię zmienia, wszystkie elementy kompozycyjne, które ją obserwują (np. element kompozycyjnyText), są ponownie komponowane, aby odzwierciedlić nową wartość. - Pierwszy element
MomentaryIconButtonzmniejsza wartośćpressedCountpo kliknięciu lub przytrzymaniu. - Kliknięcie lub przytrzymanie drugiej wartości
MomentaryIconButtonzwiększa wartośćpressedCount. - Oba przyciski mają
stepDelayo wartości 100 milisekund, co oznacza, że działanieonClickpowtarza się co 100 ms, gdy przycisk jest przytrzymywany.
Wynik
Poniższy film przedstawia interfejs z przyciskami ikon i licznikiem: