จัดการอินพุตของตัวชี้ทางอ้อมใน Jetpack Compose Glimmer

อุปกรณ์ XR ที่รองรับ
คำแนะนำนี้จะช่วยคุณสร้างประสบการณ์การใช้งานสำหรับอุปกรณ์ XR ประเภทนี้
แว่นตาที่มีจอแสดงผล

ตัวแก้ไข onIndirectPointerGesture ช่วยให้คอมโพเนนต์รับและตอบสนองต่อเหตุการณ์ตัวชี้ทางอ้อมระดับสูง เช่น เหตุการณ์ที่มาจากทัชแพดของอุปกรณ์ ใช้ตัวแก้ไขนี้เพื่อบันทึกและประมวลผลท่าทางสัมผัสที่มาจากทัชแพดหรือแหล่งที่มาที่คล้ายกัน

แพลตฟอร์ม API

มี Callback 4 รายการที่แอปของคุณใช้เพื่อควบคุมการจัดการได้ ดังนี้

  • onClick: ทริกเกอร์เมื่อแตะหรือคลิกสำเร็จโดยไม่มีการเคลื่อนไหวในแนวนอนอย่างมีนัยสำคัญ
  • onSwipeForward: ทริกเกอร์เมื่อการปัดในแนวนอนเกินเกณฑ์ระยะทางและความเร็วในทิศทางไปข้างหน้า
  • onSwipeBackward: ทริกเกอร์เมื่อการปัดในแนวนอนเกินเกณฑ์ระยะทางและความเร็วในทิศทางย้อนกลับ
  • Enabled: เมื่อตั้งค่าเป็น false ระบบจะไม่สนใจตัวแก้ไขและไม่มีการเรียกใช้ Callback

ลักษณะการทำงานของระบบสำหรับการปัดและการเลื่อน

ระบบใช้เกณฑ์ความคลาดเคลื่อนของการแตะเพื่อแยกความแตกต่างระหว่างการคลิกและการปัด

  • หากตัวชี้เคลื่อนที่อย่างมีนัยสำคัญในสถานะกดลง ระบบจะยกเลิก onClick
  • หากตัวชี้เคลื่อนที่ย้อนกลับอย่างมากในระหว่างการเคลื่อนไหว ท่าทางการปัดจะใช้ไม่ได้

ตัวอย่าง: ตั้งค่าการจัดการการปัดและการคลิกในคอมโพเนนต์

โค้ดต่อไปนี้จะตั้งค่าการจัดการสำหรับการปัดและการคลิก Box ที่โฟกัสได้

@Composable
fun OnIndirectPointerGestureSample() {
    var lastGesture by remember { mutableStateOf("None") }

    Box(
        modifier =
            Modifier.fillMaxSize()
                .onIndirectPointerGesture(
                    enabled = true,
                    onSwipeForward = { lastGesture = "Forward" },
                    onSwipeBackward = { lastGesture = "Backward" },
                    onClick = { lastGesture = "Click" },
                )
                .focusTarget(),
        contentAlignment = Alignment.Center,
    ) {
        Text("Last Gesture: $lastGesture")
    }
}

ประเด็นสำคัญเกี่ยวกับโค้ด

  • onIndirectPointerGesture ต้องมีการโฟกัส ดังนั้นจึงมีการใช้ focusTarget เพื่อให้ Box โฟกัสได้ด้วย คุณสามารถใช้ focusTarget หรือตัวแก้ไขที่เปิดใช้การโฟกัสอื่นๆ เช่น surface หากไม่มีโฟกัส ตัวแก้ไขจะไม่สามารถดำเนินการกับเหตุการณ์ตัวชี้ทางอ้อมได้
  • ตัวอย่างนี้ใช้ทั้ง Callback onSwipeForward และ onClick ดังนั้นท่าทางการปัดและการคลิกที่ตรวจพบจะถูกสกัดกั้นและใช้ และไม่ส่งต่อไปยังคอนเทนเนอร์หลัก อย่างไรก็ตาม คุณยังสามารถปล่อยให้ Callback ที่เฉพาะเจาะจงเป็น Null เพื่อส่งผ่านท่าทางสัมผัสไปยังตัวแก้ไข onIndirectPointerGesture ในคอนเทนเนอร์หลักได้ด้วย