รองรับเนื้อหาที่ผู้ใช้ปรับขนาดได้

ใช้ท่าทางสัมผัสบีบนิ้วเพื่อซูมเพื่อรองรับเนื้อหาที่ปรับขนาดได้ในแอป ซึ่งเป็นวิธีมาตรฐานที่สอดคล้องกับแพลตฟอร์มในการปรับปรุงการช่วยเหลือพิเศษ เพื่อให้ผู้ใช้ปรับขนาดข้อความและองค์ประกอบ 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 กับการปรับขนาดในแอปและการตั้งค่าแบบอักษรหรือการแสดงผลทั้งระบบ ตรวจสอบว่าเลย์เอาต์ของแอปปรับเปลี่ยน อย่างถูกต้องโดยไม่ทำให้เนื้อหาขาดหายไป ทับซ้อนกัน หรือซ่อนอยู่ ดูข้อมูลเพิ่มเติมเกี่ยวกับ วิธีสร้างเลย์เอาต์ที่ปรับเปลี่ยนตามอุปกรณ์