การป้อนข้อมูลด้วยปุ่มหมุนหมายถึงการป้อนข้อมูลจากชิ้นส่วนของนาฬิกาที่หมุน โดยเฉลี่ยแล้ว ผู้ใช้โต้ตอบกับนาฬิกาเพียงไม่กี่วินาที คุณสามารถปรับปรุงประสบการณ์ของผู้ใช้ได้โดยใช้อินพุตแบบหมุนเพื่อให้ผู้ใช้ทำงานต่างๆ ได้อย่างรวดเร็ว
แหล่งที่มาหลัก 3 แหล่งของอินพุตแบบหมุนในนาฬิกาส่วนใหญ่ ได้แก่ ปุ่มด้านข้างแบบหมุน (RSB) และขอบแบบสัมผัสหรือขอบแบบสัมผัส ซึ่งเป็นโซนสัมผัสแบบวงกลมรอบหน้าจอ แม้ว่าลักษณะการทำงานที่คาดไว้อาจแตกต่างกันไปตามประเภทของอินพุต แต่อย่าลืมรองรับอินพุตแบบหมุนสำหรับการโต้ตอบที่สำคัญทั้งหมด
เลื่อน
ผู้ใช้ส่วนใหญ่คาดหวังให้แอปรองรับท่าทางสัมผัสในการเลื่อน ขณะที่เนื้อหาเลื่อนบนหน้าจอ ให้แสดงผลภาพเป็นฟีดแบ็กแก่ผู้ใช้เพื่อตอบสนองต่อการโต้ตอบแบบหมุน การแสดงผลภาพอาจรวมถึงตัวบ่งชี้ตำแหน่งสำหรับการเลื่อนแนวตั้งหรือตัวบ่งชี้หน้า
ScalingLazyColumn
และ Picker
รองรับท่าทางสัมผัสในการเลื่อนโดยค่าเริ่มต้น ตราบใดที่คุณต้องวางคอมโพเนนต์เหล่านั้นภายใน Scaffold
Scaffold
มีโครงสร้างเลย์เอาต์พื้นฐานสำหรับแอป Wear OS และมีช่องสำหรับตัวบ่งชี้การเลื่อนอยู่แล้ว หากต้องการแสดงความคืบหน้าของการเลื่อน ให้สร้างตัวบ่งชี้ตำแหน่งที่อิงตามออบเจ็กต์สถานะรายการ ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
val listState = rememberScalingLazyListState() Scaffold( positionIndicator = { PositionIndicator(scalingLazyListState = listState) } ) { // ... }
คุณสามารถกําหนดค่าลักษณะการยึดของ ScalingLazyColumn
โดยใช้ ScalingLazyColumnDefaults.snapFlingBehavior
ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้
val listState = rememberScalingLazyListState() Scaffold( positionIndicator = { PositionIndicator(scalingLazyListState = listState) } ) { val state = rememberScalingLazyListState() ScalingLazyColumn( modifier = Modifier.fillMaxWidth(), state = state, flingBehavior = ScalingLazyColumnDefaults.snapFlingBehavior(state = state) ) { // Content goes here // ... } }
การทำงานที่กำหนดเอง
นอกจากนี้ คุณยังสร้างการดำเนินการที่กำหนดเองซึ่งตอบสนองต่อการป้อนข้อมูลด้วยปุ่มหมุนในแอปได้ด้วย เช่น ใช้การป้อนข้อมูลด้วยปุ่มหมุนเพื่อซูมเข้าและออก หรือเพื่อควบคุมระดับเสียงในแอปสื่อ
หากคอมโพเนนต์ของคุณไม่รองรับเหตุการณ์การเลื่อนโดยค่าเริ่มต้น เช่น การควบคุมระดับเสียง คุณสามารถจัดการเหตุการณ์การเลื่อนด้วยตนเองได้
// VolumeScreen.kt
val focusRequester: FocusRequester = remember { FocusRequester() }
Column(
modifier = Modifier
.fillMaxSize()
.onRotaryScrollEvent {
// handle rotary scroll events
true
}
.focusRequester(focusRequester)
.focusable(),
) { ... }
สร้างสถานะที่กําหนดเองซึ่งจัดการในโมเดลมุมมอง และการสร้างการเรียกคืนที่กําหนดเองซึ่งใช้เพื่อประมวลผลเหตุการณ์การเลื่อนแบบหมุน
// VolumeViewModel.kt
object VolumeRange(
public val max: Int = 10
public val min: Int = 0
)
val volumeState: MutableStateFlow<Int> = ...
fun onVolumeChangeByScroll(pixels: Float) {
volumeState.value = when {
pixels > 0 -> min (volumeState.value + 1, VolumeRange.max)
pixels < 0 -> max (volumeState.value - 1, VolumeRange.min)
}
}
ตัวอย่างก่อนหน้านี้ใช้ค่าพิกเซลที่อาจมีความละเอียดอ่อนมากเกินไปหากนำมาใช้จริง เพื่อความเรียบง่าย
ใช้การเรียกกลับเมื่อคุณได้รับเหตุการณ์ ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
val focusRequester: FocusRequester = remember { FocusRequester() }
val volumeState by volumeViewModel.volumeState.collectAsState()
Column(
modifier = Modifier
.fillMaxSize()
.onRotaryScrollEvent {
volumeViewModel
.onVolumeChangeByScroll(it.verticalScrollPixels)
true
}
.focusRequester(focusRequester)
.focusable(),
) { ... }
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- เปลี่ยนลักษณะการโฟกัส
- เพิ่มการรองรับแป้นพิมพ์ เมาส์ แทร็กแพด และสไตลัสด้วย Jetpack Compose
- Codelab ของ Compose สำหรับ Wear OS