ใช้ท่าทางสัมผัสบีบนิ้วเพื่อซูมเพื่อรองรับเนื้อหาที่ปรับขนาดได้ในแอป ซึ่งเป็นวิธีมาตรฐานที่สอดคล้องกับแพลตฟอร์มในการปรับปรุงการช่วยเหลือพิเศษ เพื่อให้ผู้ใช้ปรับขนาดข้อความและองค์ประกอบ UI ได้อย่างเป็นธรรมชาติตามความต้องการ แอปของคุณสามารถกำหนดลักษณะการปรับขนาดที่กำหนดเองด้วยการควบคุมแบบละเอียด และลักษณะการทำงานตามบริบทที่มอบประสบการณ์ที่ผู้ใช้มักจะค้นพบได้เร็วกว่า ฟีเจอร์ระดับระบบ เช่น การขยายหน้าจอ
เลือกกลยุทธ์การปรับขนาด
กลยุทธ์ที่กล่าวถึงในคู่มือนี้จะทำให้ UI จัดวางใหม่และจัดระเบียบใหม่เพื่อให้ พอดีกับความกว้างของหน้าจอ ซึ่งช่วยเพิ่มการช่วยเหลือพิเศษได้อย่างมากโดย ไม่จำเป็นต้องเลื่อนในแนวนอนและไม่ต้องใช้การเคลื่อนไหวแบบ "ซิกแซก" ที่น่าหงุดหงิด ซึ่งจำเป็นต่อการอ่านข้อความบรรทัดยาว
อ่านเพิ่มเติม: งานวิจัยยืนยันว่าสำหรับผู้ใช้ที่มีสายตาเลือนราง การปรับเนื้อหาให้แสดงผลใหม่ จะอ่านได้ง่ายและไปยังส่วนต่างๆ ได้ง่ายกว่าอินเทอร์เฟซ ที่ต้องใช้การเลื่อนแบบ 2 มิติอย่างมาก โปรดดูรายละเอียดเพิ่มเติมที่หัวข้อการเปรียบเทียบเนื้อหาแบบแพนและสแกนกับเนื้อหาแบบปรับให้เข้ากับอุปกรณ์เคลื่อนที่
ปรับขนาดองค์ประกอบทั้งหมดหรือเฉพาะองค์ประกอบข้อความ
ตารางต่อไปนี้แสดงให้เห็นถึงผลลัพธ์ด้านภาพของกลยุทธ์การปรับขนาดแต่ละอย่าง
| กลยุทธ์ | การปรับขนาดความหนาแน่น | การปรับขนาดแบบอักษร |
|---|---|---|
พฤติกรรม |
ปรับขนาดทุกอย่างตามสัดส่วน เนื้อหาจะปรับให้พอดีกับคอนเทนเนอร์ ผู้ใช้จึงไม่ต้องเลื่อนในแนวนอนเพื่อดูเนื้อหาทั้งหมด |
มีผลกับองค์ประกอบข้อความเท่านั้น เลย์เอาต์โดยรวมและคอมโพเนนต์ที่ไม่ใช่ข้อความจะยังคงมีขนาดเท่าเดิม |
สิ่งที่ปรับขนาดได้ |
องค์ประกอบภาพทั้งหมด: ข้อความ คอมโพเนนต์ (ปุ่ม ไอคอน) รูปภาพ และระยะห่างของเลย์เอาต์ (ระยะห่างภายใน ขอบ) |
ข้อความเท่านั้น |
การสาธิต |
คำแนะนำ
ตอนนี้คุณได้เห็นความแตกต่างด้านภาพแล้ว ตารางต่อไปนี้จะช่วยให้คุณพิจารณา ข้อดีข้อเสียและเลือกกลยุทธ์ที่ดีที่สุดสำหรับเนื้อหาของคุณได้
ประเภท UI |
กลยุทธ์ที่แนะนํา |
การให้เหตุผล |
เลย์เอาต์ที่เน้นการอ่าน ตัวอย่าง: บทความข่าว แอปรับส่งข้อความ |
ความหนาแน่นหรือการปรับขนาดแบบอักษร |
เราขอแนะนำให้ใช้การปรับขนาดความหนาแน่นเพื่อปรับขนาดพื้นที่เนื้อหาทั้งหมด รวมถึงรูปภาพในบรรทัด การปรับขนาดแบบอักษรเป็นทางเลือกที่ตรงไปตรงมาหากต้องการปรับขนาดเฉพาะข้อความ |
เลย์เอาต์ที่มีโครงสร้างภาพ ตัวอย่างเช่น App Store, ฟีดโซเชียลมีเดีย |
การปรับขนาดความหนาแน่น |
รักษาความสัมพันธ์ด้านภาพระหว่างรูปภาพกับข้อความในภาพสไลด์หรือตารางกริด ลักษณะการปรับข้อความใหม่ช่วยหลีกเลี่ยงการเลื่อนในแนวนอน ซึ่งจะขัดแย้งกับองค์ประกอบการเลื่อนที่ซ้อนกัน |
ตรวจหาท่าทางสัมผัสการปรับขนาดใน Jetpack Compose
หากต้องการรองรับเนื้อหาที่ผู้ใช้ปรับขนาดได้ คุณต้องตรวจจับท่าทางสัมผัสแบบมัลติทัชก่อน ใน
Jetpack Compose คุณทำได้โดยใช้ Modifier.transformable
ตัวแก้ไข transformable เป็น API ระดับสูงที่ให้ zoomChange
delta ตั้งแต่เหตุการณ์ท่าทางสัมผัสครั้งล่าสุด ซึ่งจะช่วยลดความซับซ้อนของตรรกะการอัปเดตสถานะเป็น
การสะสมโดยตรง (เช่น scale *= zoomChange) จึงเหมาะสำหรับ
กลยุทธ์การปรับขนาดแบบอิงตามข้อมูลที่ครอบคลุมในคู่มือนี้
ตัวอย่างการใช้งาน
ตัวอย่างต่อไปนี้แสดงวิธีใช้กลยุทธ์การปรับขนาดความหนาแน่นและการปรับขนาดแบบอักษร
การปรับขนาดความหนาแน่น
วิธีนี้จะปรับขนาดฐาน density ของพื้นที่ UI ด้วยเหตุนี้ การวัดผลทั้งหมดที่อิงตามเลย์เอาต์ ซึ่งรวมถึงระยะห่างจากขอบ ระยะห่าง และขนาดคอมโพเนนต์จึงได้รับการปรับขนาดราวกับว่าขนาดหรือความละเอียดของหน้าจอมีการเปลี่ยนแปลง เนื่องจากขนาดข้อความ
ขึ้นอยู่กับความหนาแน่นด้วย จึงจะปรับขนาดตามสัดส่วนด้วย กลยุทธ์นี้มีประสิทธิภาพเมื่อคุณต้องการขยายองค์ประกอบทั้งหมดภายในพื้นที่หนึ่งๆ อย่างสม่ำเสมอ โดยยังคงจังหวะภาพรวมและสัดส่วนของ UI ไว้
private class DensityScalingState( // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x. private val minScale: Float = 0.75f, private val maxScale: Float = 3.5f, private val currentDensity: Density ) { val transformableState = TransformableState { zoomChange, _, _ -> scaleFactor.floatValue = (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale) } val scaleFactor = mutableFloatStateOf(1f) fun scaledDensity(): Density { return Density( currentDensity.density * scaleFactor.floatValue, currentDensity.fontScale ) } }
การปรับขนาดแบบอักษร
กลยุทธ์นี้มีความเฉพาะเจาะจงมากขึ้น โดยจะแก้ไขเฉพาะปัจจัย fontScale
ผลลัพธ์คือมีเพียงองค์ประกอบข้อความเท่านั้นที่ขยายหรือย่อ ในขณะที่คอมโพเนนต์เลย์เอาต์อื่นๆ ทั้งหมด
เช่น คอนเทนเนอร์ ระยะห่างจากขอบ และไอคอน จะยังคงมีขนาดคงที่ กลยุทธ์นี้เหมาะสําหรับการปรับปรุงความชัดเจนของข้อความในแอปที่เน้นการอ่าน
class FontScaleState( // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x. private val minScale: Float = 0.75f, private val maxScale: Float = 3.5f, private val currentDensity: Density ) { val transformableState = TransformableState { zoomChange, _, _ -> scaleFactor.floatValue = (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale) } val scaleFactor = mutableFloatStateOf(1f) fun scaledFont(): Density { return Density( currentDensity.density, currentDensity.fontScale * scaleFactor.floatValue ) } }
UI ของการสาธิตที่แชร์
นี่คือ DemoCard ที่ใช้ร่วมกันซึ่งใช้ในตัวอย่างทั้ง 2 รายการก่อนหน้า
เพื่อไฮไลต์ลักษณะการปรับขนาดที่แตกต่างกัน
@Composable private fun DemoCard() { Card( modifier = Modifier .width(360.dp) .padding(16.dp), shape = RoundedCornerShape(12.dp) ) { Column( modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp) ) { Text("Demo Card", style = MaterialTheme.typography.headlineMedium) var isChecked by remember { mutableStateOf(true) } Row(verticalAlignment = Alignment.CenterVertically) { Text("Demo Switch", Modifier.weight(1f), style = MaterialTheme.typography.bodyLarge) Switch(checked = isChecked, onCheckedChange = { isChecked = it }) } Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Filled.Person, "Icon", Modifier.size(32.dp)) Spacer(Modifier.width(8.dp)) Text("Demo Icon", style = MaterialTheme.typography.bodyLarge) } Row( Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Box( Modifier .width(100.dp) .weight(1f) .height(80.dp) .background(Color.Blue) ) Box( Modifier .width(100.dp) .weight(1f) .height(80.dp) .background(Color.Red) ) } Text( "Demo Text: Lorem ipsum dolor sit amet, consectetur adipiscing elit," + " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", style = MaterialTheme.typography.bodyMedium, textAlign = TextAlign.Justify ) } } }
เคล็ดลับและข้อควรพิจารณา
โปรดพิจารณาคำแนะนำต่อไปนี้เพื่อสร้างประสบการณ์ที่ราบรื่นและเข้าถึงได้ง่ายยิ่งขึ้น
- พิจารณาเสนอการควบคุมการปรับขนาดที่ไม่ใช่ท่าทางสัมผัส: ผู้ใช้บางรายอาจมี ปัญหาเกี่ยวกับท่าทางสัมผัส หากต้องการรองรับผู้ใช้เหล่านี้ ให้พิจารณาจัดหาวิธีอื่นในการปรับหรือรีเซ็ตการซูมที่ไม่ต้องใช้ท่าทางสัมผัส
- สร้างสำหรับทุกขนาด: ทดสอบ UI กับการปรับขนาดในแอปและการตั้งค่าแบบอักษรหรือการแสดงผลทั้งระบบ ตรวจสอบว่าเลย์เอาต์ของแอปปรับเปลี่ยน อย่างถูกต้องโดยไม่ทำให้เนื้อหาขาดหายไป ทับซ้อนกัน หรือซ่อนอยู่ ดูข้อมูลเพิ่มเติมเกี่ยวกับ วิธีสร้างเลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์