เพิ่มการรองรับภาพเคลื่อนไหวย้อนกลับแบบคาดเดา

เมื่อใช้ API ย้อนกลับของระบบ คุณเลือกรับภาพเคลื่อนไหวในแอปและรองรับการเปลี่ยนภาพที่กำหนดเองได้

วิดีโอที่ 1: ภาพเคลื่อนไหวการย้อนกลับที่คาดการณ์ได้

หลังจากเลือกใช้แล้ว แอปจะแสดงภาพเคลื่อนไหวสำหรับการกลับไปที่หน้าแรก การข้ามกิจกรรม และการข้ามงาน

วิดีโอแสดงตัวอย่างสั้นๆ ของภาพเคลื่อนไหวการย้อนกลับที่คาดการณ์ได้สำหรับการข้ามกิจกรรมและการกลับไปที่หน้าแรกโดยใช้แอปการตั้งค่าของ Android

  1. ในภาพเคลื่อนไหว ผู้ใช้ปัดกลับเพื่อกลับไปที่หน้าจอการตั้งค่าก่อนหน้า ซึ่งเป็นตัวอย่างของภาพเคลื่อนไหวการข้ามกิจกรรม
  2. ตอนนี้อยู่ในหน้าจอก่อนหน้า ผู้ใช้เริ่มปัดกลับเป็นครั้งที่ 2 ซึ่งแสดงตัวอย่างหน้าจอหลักพร้อมวอลเปเปอร์ ซึ่งเป็นตัวอย่างของภาพเคลื่อนไหวการกลับไปที่หน้าแรก
  3. ผู้ใช้ปัดไปทางขวาต่อ ซึ่งแสดงภาพเคลื่อนไหวของหน้าต่างที่เล็กลงจนเหลือไอคอนบนหน้าจอหลัก
  4. ตอนนี้ผู้ใช้กลับไปที่หน้าจอหลักอย่างสมบูรณ์แล้ว

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีเพิ่มการรองรับท่าทางสัมผัสการย้อนกลับแบบคาดการณ์

เพิ่มการเปลี่ยนภาพและภาพเคลื่อนไหวในแอปที่กำหนดเอง

คุณสามารถสร้างภาพเคลื่อนไหวและการเปลี่ยนภาพพร็อพเพอร์ตี้ในแอปที่กำหนดเอง ภาพเคลื่อนไหวการข้ามกิจกรรมที่กำหนดเอง และภาพเคลื่อนไหวการข้าม Fragment ที่กำหนดเองด้วยท่าทางสัมผัสการย้อนกลับแบบคาดการณ์

เพิ่มการเปลี่ยนภาพที่กำหนดเองใน Jetpack Compose

คุณสามารถใช้ PredictiveBackHandler เพื่อจัดการท่าทางสัมผัสการย้อนกลับแบบคาดการณ์ใน Jetpack Compose สำหรับการสร้างการเปลี่ยนภาพในแอปที่กำหนดเอง ฟีเจอร์นี้พร้อมใช้งานใน androidx.activity:activity-compose:1.8.0-alpha01 ขึ้นไป

PredictiveBackHandler มีแลมบ์ดาการเรียกกลับที่แสดง Flow<BackEventCompat> ซึ่งจะปล่อยเหตุการณ์เมื่อผู้ใช้ปัดกลับจาก ขอบ เหตุการณ์เหล่านี้ให้ข้อมูลเกี่ยวกับตำแหน่งสัมผัสของผู้ใช้ ขอบการปัด และที่สำคัญที่สุดคือ progress ซึ่งสามารถใช้เพื่อทำให้คอมโพเนนต์เคลื่อนออกไปเป็นส่วนหนึ่งของการจัดการท่าทางสัมผัสการย้อนกลับ

ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างการใช้ PredictiveBackHandler เพื่อทำให้ Surface เล็กลงและเคลื่อนออกไปตามความคืบหน้าของท่าทางสัมผัส

@Composable
fun DetailScreen(onBack: () -> Unit) {
    var scale by remember { mutableFloatStateOf(1f) }
    var xOffset by remember { mutableFloatStateOf(0f) }
    val scope = rememberCoroutineScope()

    PredictiveBackHandler { progressFlow ->
        try {
            progressFlow.collectLatest { backEvent ->
                scale = 1f - backEvent.progress
                xOffset = backEvent.progress * 100f
            }
            // User completed gesture.
            onBack()
        } catch (e: CancellationException) {
            // User cancelled gesture.
            // Animate scale and xOffset back to 1f and 0f respectively.
            scope.launch {
                animate(scale, 1f) { value, _ -> scale = value }
            }
            scope.launch {
                animate(xOffset, 0f) { value, _ -> xOffset = value }
            }
        }
    }
    Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        Surface(
            modifier = Modifier
                .size(200.dp)
                .scale(scale)
                .offset { IntOffset(x = xOffset.dp.roundToPx(), y = 0) },
            color = Color.Blue
        ) {}
    }
}