ปุ่มไอคอนจะแสดงการดำเนินการที่ผู้ใช้ทำได้ ปุ่มไอคอนต้องใช้ไอคอนที่มีความหมายชัดเจน และโดยทั่วไปจะแสดงถึงการดำเนินการที่พบบ่อยหรือใช้บ่อย
ปุ่มไอคอนมี 2 ประเภท ได้แก่
- ค่าเริ่มต้น: ปุ่มเหล่านี้สามารถเปิดองค์ประกอบอื่นๆ ได้ เช่น เมนูหรือการค้นหา
- ปุ่มเปิด/ปิด: ปุ่มเหล่านี้แสดงถึงการดำเนินการแบบไบนารีที่เปิดหรือปิดได้ เช่น "รายการโปรด" หรือ "บุ๊กมาร์ก"
แพลตฟอร์ม API
ใช้ Composable 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เป็นตัวเก็บสถานะ ซึ่งหมายความว่า Compose จะสร้าง UI ใหม่ทุกครั้งที่ค่าของตัวเก็บสถานะมีการเปลี่ยนแปลงrememberSaveableช่วยให้มั่นใจว่าสถานะisToggledจะยังคงอยู่ตลอดการเปลี่ยนแปลงการกำหนดค่า เช่น การหมุนหน้าจอ
onClicklambda ของIconButtonจะกำหนดลักษณะการทำงานของปุ่มเมื่อคลิก โดยสลับสถานะระหว่างtrueและfalse- พารามิเตอร์
painterของ ComposableIconจะโหลดpainterResourceที่แตกต่างกันตามเงื่อนไขโดยอิงตามสถานะisToggledซึ่งจะเปลี่ยนลักษณะที่ปรากฏของไอคอน- หาก
isToggledเป็นtrueระบบจะโหลดทรัพยากรที่ถอนออกได้รูปหัวใจที่เติมสี - หาก
isToggledเป็นfalseระบบจะโหลดรูปหัวใจแบบเส้นขอบที่วาดได้
- หาก
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จะเป็นจริงเมื่อมีการกดปุ่มอยู่ และเป็นเท็จในกรณีอื่นๆ เมื่อisPressedเป็นtrueLaunchedEffectจะเข้าสู่ลูป- ภายในลูปนี้ จะใช้
delay(พร้อมstepDelay) เพื่อหยุดชั่วคราวระหว่างการทริกเกอร์การดำเนินการcoerceInช่วยให้มั่นใจว่าความล่าช้าจะอยู่ที่อย่างน้อย 1 มิลลิวินาทีเพื่อป้องกันการวนซ้ำไม่สิ้นสุด - ระบบจะเรียกใช้
pressedListenerหลังจากแต่ละช่วงเวลาหน่วงภายในลูป ซึ่งจะทำให้การดำเนินการทำซ้ำ
- ภายในลูปนี้ จะใช้
pressedListenerใช้rememberUpdatedStateเพื่อให้แน่ใจว่าแลมบ์ดาonClick(การดำเนินการที่จะทำ) เป็นเวอร์ชันล่าสุดเสมอจากองค์ประกอบล่าสุดIconจะเปลี่ยนรูปภาพที่แสดงตามสถานะของปุ่มว่ามีการกดอยู่หรือไม่- หาก
isPressedเป็นจริง ระบบจะแสดงselectedImage - มิเช่นนั้น ระบบจะแสดง
unselectedImage
- หาก
ถัดไป ให้ใช้ MomentaryIconButton นี้ในตัวอย่าง ข้อมูลโค้ดต่อไปนี้แสดงปุ่มไอคอน 2 ปุ่มที่ควบคุมตัวนับ
@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 } ) } }
ประเด็นสำคัญเกี่ยวกับโค้ด
MomentaryIconButtonExampleComposable จะแสดงRowที่มีอินสแตนซ์MomentaryIconButton2 รายการและTextComposable เพื่อสร้าง UI สำหรับเพิ่มและลดตัวนับ- โดยจะรักษาตัวแปรสถานะ
pressedCountที่เปลี่ยนแปลงได้โดยใช้rememberและmutableIntStateOfซึ่งเริ่มต้นเป็น 0 เมื่อpressedCountเปลี่ยนแปลง คอมโพสิเบิลที่สังเกตการณ์อยู่ (เช่น คอมโพสิเบิลText) จะจัดองค์ประกอบใหม่เพื่อให้สอดคล้องกับค่าใหม่ MomentaryIconButtonแรกจะลดpressedCountเมื่อคลิกหรือกดค้างไว้MomentaryIconButtonที่ 2 จะเพิ่มpressedCountเมื่อคลิกหรือกดค้างไว้- ปุ่มทั้ง 2 ปุ่มใช้
stepDelay100 มิลลิวินาที ซึ่งหมายความว่าการดำเนินการonClickจะทำซ้ำทุกๆ 100 มิลลิวินาทีขณะกดปุ่มค้างไว้
ผลลัพธ์
วิดีโอต่อไปนี้แสดง UI ที่มีปุ่มไอคอนและตัวนับ