כפתורי סמלים מציגים פעולות שהמשתמשים יכולים לבצע. בכפתורי סמלים צריך להשתמש בסמל עם משמעות ברורה, ובדרך כלל הם מייצגים פעולות נפוצות או פעולות שמשתמשים בהן לעיתים קרובות.
יש שני סוגים של כפתורי סמלים:
- ברירת מחדל: הלחצנים האלה יכולים לפתוח רכיבים אחרים, כמו תפריט או חיפוש.
- מתג: הלחצנים האלה יכולים לייצג פעולות בינאריות שאפשר להפעיל או להשבית, כמו "מועדף" או "סימנייה".
פלטפורמת ה-API
משתמשים בקוד IconButton קומפוזבילי כדי להטמיע כפתורי סמלים רגילים. כדי ליצור סגנונות חזותיים שונים כמו מלא, מלא בצבע אחד או עם קווי מתאר, משתמשים ב-FilledIconButton, ב-FilledTonalIconButton וב-OutlinedIconButton, בהתאמה.
הפרמטרים העיקריים של IconButton כוללים:
-
onClick: פונקציית lambda שמופעלת כשהמשתמש לוחץ על כפתור הסמל. -
enabled: ערך בוליאני שקובע אם הכפתור מופעל או מושבת. כשהערך הואfalse, הכפתור לא מגיב לקלט של המשתמש. -
content: התוכן הניתן לשילוב בתוך הכפתור, בדרך כללIcon.
דוגמה בסיסית: כפתור סמל של מתג
בדוגמה הזו מוסבר איך להטמיע לחצן סמל להחלפה. כפתור עם סמל החלפה משנה את המראה שלו בהתאם למצב שלו – אם הוא נבחר או לא.
@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." ) } }
מידע חשוב על הקוד
- הפונקציה הקומפוזבילית
ToggleIconButtonExampleמגדירהIconButtonשניתן להפעיל או להשבית.-
mutableStateOf(false)יוצרת אובייקטMutableStateשמכיל ערך בוליאני, שהערך הראשוני שלו הואfalse. כךisToggledהופך למאחסן מצב, כלומר מערכת פיתוח נייטיב יוצרת מחדש את ממשק המשתמש בכל פעם שהערך שלו משתנה. - הפונקציה
rememberSaveableמבטיחה שהמצב שלisToggledיישמר גם אם משנים את ההגדרות, למשל אם מסובבים את המסך.
-
- הלמבדה
onClickשלIconButtonמגדירה את התנהגות הכפתור כשלוחצים עליו, ומחליפה את המצב ביןtrueל-false. - הפרמטר
painterשל הרכיב הניתן לקישורIconטוען באופן מותנהpainterResourceשונה על סמך המצב שלisToggled. הפעולה הזו משנה את המראה החזותי של הסמל.- אם הערך של
isToggledהואtrue, נטען ה-drawable של הלב המלא. - אם הערך של
isToggledהואfalse, הוא טוען את ה-drawable של הלב עם קווי המתאר.
- אם הערך של
- ה-
contentDescriptionשל ה-Iconמתעדכן גם על סמך המצב שלisToggledכדי לספק מידע מתאים לגבי נגישות.
תוצאה
בתמונה הבאה מוצג כפתור הסמל להחלפת מצב מקטע הקוד הקודם במצב לא מסומן:
דוגמה מתקדמת: פעולות חוזרות בלחיצה
בקטע הזה מוסבר איך ליצור לחצני סמלים שמפעילים פעולה באופן רציף כל עוד המשתמש לוחץ עליהם לחיצה ארוכה, במקום להפעיל אותה רק פעם אחת בכל לחיצה.
@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, ) } }
מידע חשוב על הקוד
- הפונקציה
MomentaryIconButtonמקבלת אתunselectedImage: Int, מזהה הפריט הגרפי שניתן להזזה של הסמל כשהכפתור לא לחוץ, ואתselectedImage: Int, מזהה הפריט הגרפי שניתן להזזה של הסמל כשהכפתור לחוץ. - הוא משתמש ב-
interactionSourceכדי לעקוב באופן ספציפי אחרי אינטראקציות של "לחיצה" מצד המשתמש. - הערך של
isPressedהוא True כשהכפתור נלחץ, ו-False בכל מצב אחר. כשהערך שלisPressedהואtrue, ה-LaunchedEffectנכנס ללולאה.- בתוך הלולאה הזו, הוא משתמש ב-
delay(עםstepDelay) כדי ליצור השהיות בין הפעולות שמופעלות. coerceInמוודא שההשהיה היא לפחות אלפית השנייה כדי למנוע לולאות אינסופיות. - הפונקציה
pressedListenerמופעלת אחרי כל השהיה בתוך הלולאה. כך הפעולה תחזור על עצמה.
- בתוך הלולאה הזו, הוא משתמש ב-
- ה-
pressedListenerמשתמש ב-rememberUpdatedStateכדי לוודא ש-onClicklambda (הפעולה שצריך לבצע) תמיד מעודכנת מהקומפוזיציה האחרונה. - התמונה שמוצגת ב-
Iconמשתנה בהתאם למצב של הלחצן – אם הוא לחוץ או לא.- אם הערך של
isPressedהוא True, מוצגselectedImage. - אחרת, מוצג
unselectedImage.
- אם הערך של
עכשיו, צריך להשתמש בMomentaryIconButton הזה בדוגמה. קטע הקוד הבא מדגים שני כפתורי סמלים ששולטים במונה:
@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 } ) } }
מידע חשוב על הקוד
- הרכיב הניתן לקישור
MomentaryIconButtonExampleמציגRowשמכיל שני מופעים שלMomentaryIconButtonורכיב ניתן לקישורTextכדי ליצור ממשק משתמש להגדלה ולהקטנה של מונה. - הוא שומר על משתנה מצב
pressedCountשניתן לשינוי באמצעותrememberו-mutableIntStateOf, שמאותחל ל-0. כש-pressedCountמשתנה, כל רכיב Composable שצופה בו (כמו הרכיבText) עובר הרכבה מחדש כדי לשקף את הערך החדש. - הערך הראשון של
MomentaryIconButtonיורד ב-pressedCountכשלוחצים עליו או לוחצים לחיצה ארוכה. - השנייה
MomentaryIconButtonמגדילה אתpressedCountבלחיצה או בלחיצה ארוכה. - בשני הכפתורים מוגדר
stepDelayשל 100 אלפיות השנייה, כלומר הפעולהonClickחוזרת על עצמה כל 100 אלפיות השנייה כל עוד הכפתור לחוץ.
תוצאה
בסרטון הבא מוצג ממשק המשתמש עם לחצני הסמלים והמונה: