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

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

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

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

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

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

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

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

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

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

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

PredictiveBackHandler มี Lambda เรียกกลับที่แสดง 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(x = xOffset.dp, y = 0.dp),
            color = Color.Blue
        ) {}
    }
}