แอปควรทำงานได้ดีในอุปกรณ์ Wear OS ทุกขนาด โดยใช้ประโยชน์จากพื้นที่เพิ่มเติมเมื่อมี และยังคงดูดีในหน้าจอขนาดเล็กด้วย คู่มือนี้มีคำแนะนำในการมอบประสบการณ์การใช้งานดังกล่าว
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับหลักการออกแบบเลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์ โปรดอ่าน คำแนะนำในการออกแบบ
สร้างเลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์โดยใช้ Material 3
เลย์เอาต์ควรมีระยะขอบเป็นเปอร์เซ็นต์ เนื่องจาก Compose ทำงานด้วย ค่าสัมบูรณ์โดยค่าเริ่มต้น ให้ใช้rememberResponsiveColumnPadding จาก
ไลบรารี Horologist เพื่อคำนวณระยะห่างจากขอบและส่งไปยังพารามิเตอร์ ScreenScaffold's contentPadding และพารามิเตอร์
TransformingLazyColumn's contentPadding
ข้อมูลโค้ดต่อไปนี้ใช้คอมโพเนนต์ TransformingLazyColumn เพื่อสร้างเนื้อหาที่ดูดีในหน้าจอ Wear OS ขนาดต่างๆ
val columnState = rememberTransformingLazyColumnState() val transformationSpec = rememberTransformationSpec() ScreenScaffold( scrollState = columnState ) { contentPadding -> TransformingLazyColumn( state = columnState, contentPadding = contentPadding ) { item { ListHeader( modifier = Modifier .fillMaxWidth() .transformedHeight(this, transformationSpec) .minimumVerticalContentPadding(ListHeaderDefaults.minimumTopListContentPadding), transformation = SurfaceTransformation(transformationSpec) ) { Text(text = "Header") } } // ... other items item { Button( modifier = Modifier .fillMaxWidth() .transformedHeight(this, transformationSpec) .minimumVerticalContentPadding(ButtonDefaults.minimumVerticalListContentPadding), transformation = SurfaceTransformation(transformationSpec), onClick = { /* ... */ }, icon = { Icon( imageVector = Icons.Default.Build, contentDescription = "build", ) }, ) { Text( text = "Build", maxLines = 1, overflow = TextOverflow.Ellipsis, ) } } } }
ตัวอย่างนี้ยังแสดง ScreenScaffold และ AppScaffold ด้วย
ซึ่งจะประสานงานระหว่างแอปกับหน้าจอแต่ละหน้าจอ
(เส้นทางการนำทาง) เพื่อให้มั่นใจว่าพฤติกรรมการเลื่อนและตำแหน่งของ
TimeText จะถูกต้อง
นอกจากนี้ โปรดทราบสิ่งต่อไปนี้เกี่ยวกับระยะห่างจากขอบด้านบนและด้านล่าง
- ข้อกำหนดของ
ItemTypeรายการแรกและรายการสุดท้าย เพื่อกำหนดระยะห่างจากขอบที่ถูกต้อง - การใช้
ListHeaderสำหรับรายการแรกในรายการ เนื่องจากส่วนหัวTextไม่ควรมีระยะห่างจากขอบ
ดูข้อกำหนดทั้งหมดได้ในชุดเครื่องมือการออกแบบ Figma ดูรายละเอียดและตัวอย่างเพิ่มเติมได้ที่
- ไลบรารี Horologist \- มีฟังก์ชันช่วยเหลือที่จะช่วยสร้างแอปที่เพิ่มประสิทธิภาพและแตกต่างสำหรับ Wear OS
- ตัวอย่าง ComposeStarter \- ตัวอย่างที่แสดง หลักการที่ระบุไว้ในคู่มือนี้
- ตัวอย่าง JetCaster \- ตัวอย่างที่ซับซ้อนมากขึ้นในการสร้าง แอปให้ทำงานกับหน้าจอขนาดต่างๆ โดยใช้ไลบรารี Horologist
ใช้เลย์เอาต์แบบเลื่อนในแอป
ใช้เลย์เอาต์แบบเลื่อนตามที่แสดงไว้ก่อนหน้านี้ในหน้านี้เป็นตัวเลือกเริ่มต้นเมื่อใช้หน้าจอ ซึ่งจะช่วยให้ผู้ใช้เข้าถึงคอมโพเนนต์ของแอปได้ไม่ว่าจะมีค่ากำหนดการแสดงผลหรือขนาดหน้าจออุปกรณ์ Wear OS เป็นอย่างไร
ผลกระทบของขนาดอุปกรณ์และการปรับขนาดแบบอักษรที่แตกต่างกัน
กล่องโต้ตอบ
กล่องโต้ตอบควรเลื่อนได้ด้วย เว้นแต่จะมีเหตุผลที่ดีมากที่จะไม่ให้เลื่อน
คอมโพเนนต์ AlertDialog จะปรับเปลี่ยนตามอุปกรณ์และเลื่อนได้โดยค่าเริ่มต้น
หากเนื้อหามีความสูงเกินความสูงของวิวพอร์ต
หน้าจอที่กำหนดเองอาจต้องใช้เลย์เอาต์ที่ไม่เลื่อน
บางหน้าจออาจยังเหมาะกับเลย์เอาต์ที่ไม่เลื่อน ตัวอย่างเช่น หน้าจอเพลเยอร์หลักในแอปสื่อและหน้าจอการออกกำลังกายในแอปฟิตเนส
ในกรณีเหล่านี้ ให้ดูคำแนะนำ Canonical ที่มีให้ใน ชุดเครื่องมือการออกแบบ Figma และใช้การออกแบบที่ปรับเปลี่ยนตามขนาด หน้าจอโดยใช้ระยะขอบที่ถูกต้อง
มอบประสบการณ์ที่แตกต่างผ่านเบรกพอยต์
เมื่อใช้จอแสดงผลขนาดใหญ่ขึ้น คุณจะเพิ่มเนื้อหาและฟีเจอร์เพิ่มเติมได้ หากต้องการใช้ประสบการณ์ที่แตกต่างกันแบบนี้ ให้ใช้ เบรกพอยต์ขนาดหน้าจอ ซึ่งจะแสดงเลย์เอาต์ที่แตกต่างกันเมื่อขนาดหน้าจอเกิน 225 dp
const val LARGE_DISPLAY_BREAKPOINT = 225 @Composable fun isLargeDisplay() = LocalConfiguration.current.screenWidthDp >= LARGE_DISPLAY_BREAKPOINT // ... // ... use in your Composables: if (isLargeDisplay()) { // Show additional content. } else { // Show content only for smaller displays. } // ...
คำแนะนำในการออกแบบจะแสดงโอกาสเหล่านี้เพิ่มเติม
ทดสอบการผสมผสานระหว่างขนาดหน้าจอและขนาดแบบอักษรโดยใช้ตัวอย่าง
ตัวอย่าง Compose จะช่วยให้คุณพัฒนาแอปสำหรับหน้าจอ Wear OS ขนาดต่างๆ ได้ ใช้ทั้งคำจำกัดความของตัวอย่างอุปกรณ์และการปรับขนาดแบบอักษรเพื่อดูสิ่งต่อไปนี้
- ลักษณะที่หน้าจอจะแสดงในขนาดที่แตกต่างกันมาก เช่น แบบอักษรที่ใหญ่ที่สุดจับคู่กับหน้าจอที่เล็กที่สุด
- ลักษณะการทำงานของประสบการณ์ที่แตกต่างกันในเบรกพอยต์ต่างๆ
ตรวจสอบว่าคุณได้ใช้ตัวอย่างโดยใช้ WearPreviewDevices และ
WearPreviewFontScales สำหรับหน้าจอทั้งหมดในแอป
@WearPreviewDevices @WearPreviewFontScales @Composable fun ComposeListPreview() { ComposeList() }
การทดสอบภาพหน้าจอ
นอกเหนือจากการทดสอบตัวอย่างแล้ว การทดสอบภาพหน้าจอยังช่วยให้คุณทดสอบกับฮาร์ดแวร์ขนาดต่างๆ ที่มีอยู่ได้ ซึ่งจะเป็นประโยชน์อย่างยิ่งในกรณีที่คุณอาจไม่มีอุปกรณ์เหล่านั้นให้ใช้งานในทันที และปัญหาอาจไม่ปรากฏในหน้าจอขนาดอื่นๆ
การทดสอบภาพหน้าจอยังช่วยให้คุณระบุการถดถอยในตำแหน่งที่เฉพาะเจาะจงในฐานของโค้ดได้ด้วย
ตัวอย่างของเราใช้ Roborazzi สำหรับการทดสอบภาพหน้าจอ โดยทำดังนี้
- กำหนดค่าไฟล์ โปรเจ็กต์ และ แอป
build.gradleเพื่อใช้ Roborazzi - สร้างการทดสอบภาพหน้าจอสำหรับแต่ละหน้าจอในแอป เช่น โค้ดต่อไปนี้แสดงการทดสอบภาพหน้าจอสำหรับหน้าจอที่มีรายการ
@RunWith(ParameterizedRobolectricTestRunner::class) class ComposeListScreenTest( override val device: WearDevice ) : WearScreenshotTest() { override val tolerance = 0.02f @Test fun myScreenTest() = runTest { AppScaffold { ComposeList() } } companion object { @JvmStatic @ParameterizedRobolectricTestRunner.Parameters fun devices() = WearDevice.entries } }
ประเด็นสำคัญที่ควรทราบมีดังนี้
WearDevice.entriesมีคำจำกัดความสำหรับอุปกรณ์ Wear OS ที่ได้รับความนิยมมากที่สุด เพื่อให้การทดสอบทำงานในหน้าจอขนาดต่างๆ ที่เป็นตัวแทน
สร้างรูปภาพมาตรฐาน
หากต้องการสร้างรูปภาพสำหรับหน้าจอ ให้เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
./gradlew recordRoborazziDebug
ยืนยันรูปภาพ
หากต้องการยืนยันการเปลี่ยนแปลงกับรูปภาพที่มีอยู่ ให้เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
./gradlew verifyRoborazziDebug
ดูตัวอย่างการทดสอบภาพหน้าจอทั้งหมดได้ที่ตัวอย่าง ComposeStarter