การปฏิเสธฝ่ามือที่ใช้สไตลัส

ไอคอนให้คะแนน 5 ดาว

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

แนวทางปฏิบัติแนะนำ

แอปของคุณต้องระบุและละเว้นเหตุการณ์การสัมผัสที่ไม่เกี่ยวข้อง ใน Jetpack Compose คุณสามารถเข้าถึง MotionEvent ของ Android ที่อยู่เบื้องหลังได้จาก PointerEvent ตรวจสอบ MotionEvent สำหรับ ACTION_CANCEL ซึ่ง บ่งชี้ว่าควรหยุดท่าทางสัมผัสและอาจต้องย้อนกลับ ใน Android 13 (API ระดับ 33) ขึ้นไป ให้ตรวจสอบแฟล็ก FLAG_CANCELED ในเหตุการณ์ ACTION_CANCEL และ ACTION_POINTER_UP ซึ่งเป็น สัญญาณที่ชัดเจนว่าการสัมผัสนั้นไม่ได้ตั้งใจ เช่น การสัมผัสฝ่ามือ

ส่วนผสม

  • Modifier.pointerInput(): ตัวปรับแต่ง Compose ที่ใช้ประมวลผลการป้อนข้อมูลด้วยตัวชี้
  • PointerEvent: แสดงถึงเหตุการณ์ตัวชี้ใน Compose ซึ่งมีการเปลี่ยนแปลงอย่างน้อย 1 รายการ
  • PointerEvent.motionEvent: พร็อพเพอร์ตี้ส่วนขยายที่ให้สิทธิ์เข้าถึง MotionEvent ของ Android ที่อยู่เบื้องหลัง (อาจเป็น Null)
  • MotionEvent: แสดงถึงเหตุการณ์การสัมผัสและการเคลื่อนไหว มีข้อมูลที่จำเป็นในการพิจารณาว่าควรละเว้นเหตุการณ์หรือไม่
  • ACTION_CANCEL: ค่าคงที่ MotionEvent ที่บ่งชี้ว่าท่าทางสัมผัสถูกยกเลิกแล้ว ควรหยุดท่าทางสัมผัสและอาจต้องย้อนกลับ
  • ACTION_POINTER_UP: ค่าคงที่ MotionEvent ที่บ่งชี้ว่าตัวชี้อื่นที่ไม่ใช่ตัวชี้แรกยกขึ้น (นั่นคือ ปล่อยการสัมผัสกับหน้าจออุปกรณ์)
  • FLAG_CANCELED: ค่าคงที่ MotionEvent ที่บ่งชี้ว่าตัวชี้ที่ยกขึ้นทำให้เกิดเหตุการณ์การสัมผัสโดยไม่ตั้งใจ เพิ่มลงในเหตุการณ์ ACTION_POINTER_UP และ ACTION_CANCEL ใน Android 13 (API ระดับ 33) ขึ้นไป

ขั้นตอน

ตรวจสอบออบเจ็กต์ MotionEvent ที่ส่งไปยังแอปของคุณ ใช้ API ของ MotionEvent เพื่อกำหนดลักษณะของเหตุการณ์ ดังนี้

  • เหตุการณ์ตัวชี้เดียว \- ตรวจสอบ ACTION_CANCEL ซึ่งบ่งชี้ว่าควรหยุดท่าทางสัมผัส ใน Android 13 ขึ้นไป ให้ตรวจสอบ FLAG_CANCELED ด้วยเพื่อยืนยันว่าการสัมผัสไม่ได้ตั้งใจ
  • เหตุการณ์ตัวชี้หลายตัว \- ใน Android 13 ขึ้นไป ให้ตรวจสอบ ACTION_POINTER_UP และ FLAG_CANCELED เพื่อระบุการสัมผัสโดยไม่ตั้งใจ

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

1. รับออบเจ็กต์เหตุการณ์การเคลื่อนไหว

ใช้ Modifier.pointerInput เพื่อประมวลผลการป้อนข้อมูลด้วยตัวชี้ใน Composable ภายในขอบเขตการป้อนข้อมูลด้วยตัวชี้ ให้ใช้ awaitPointerEventScope และ awaitPointerEvent เพื่อรับเหตุการณ์ และดึงข้อมูล MotionEvent ของ Android ที่อยู่เบื้องหลังโดยใช้พร็อพเพอร์ตี้ motionEvent ดังนี้

import androidx.compose.ui.input.pointer.pointerInput
    Box(
        modifier = Modifier
            .fillMaxSize()
            .pointerInput(Unit) {
                awaitPointerEventScope {
                    while (true) {
                        val event = awaitPointerEvent()
                        val motionEvent = event.motionEvent
                        if (motionEvent != null) {
                            // Process motion event.
                        }
                    }
                }
            }
    )

2. กำหนดการดำเนินการและแฟล็กของเหตุการณ์

ตรวจสอบ MotionEvent สำหรับ ACTION_CANCEL ซึ่งบ่งชี้ถึงเหตุการณ์ตัวชี้เดียวใน API ทุกระดับ ใน Android 13 ขึ้นไป ให้ตรวจสอบ ACTION_POINTER_UP สำหรับ FLAG_CANCELED ดังนี้

import androidx.compose.ui.input.pointer.pointerInput
    Box(
        modifier = Modifier
            .fillMaxSize()
            .pointerInput(Unit) {
                awaitPointerEventScope {
                    while (true) {
                        val event = awaitPointerEvent()
                        val motionEvent = event.motionEvent ?: continue

                        when (motionEvent.actionMasked) {
                            MotionEvent.ACTION_CANCEL -> {
                                // Process canceled single-pointer motion event for all SDK versions.
                            }
                            MotionEvent.ACTION_POINTER_UP -> {
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
                                    (motionEvent.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED
                                ) {
                                    // Process canceled multi-pointer motion event for Android 13 and higher.
                                }
                            }
                        }
                    }
                }
            }
    )

3. เลิกทำท่าทางสัมผัส

เมื่อระบุการสัมผัสฝ่ามือได้แล้ว คุณจะเลิกทำเอฟเฟกต์บนหน้าจอของท่าทางสัมผัสได้

แอปของคุณต้องเก็บประวัติการดำเนินการของผู้ใช้ไว้เพื่อให้เลิกทำอินพุตที่ไม่ตั้งใจ เช่น การสัมผัสฝ่ามือได้ ดูตัวอย่างได้ที่ Implement a basic drawing app ใน Enhance stylus support in an Android app Codelab

ผลลัพธ์

ตอนนี้แอปของคุณสามารถระบุและปฏิเสธการสัมผัสฝ่ามือสำหรับเหตุการณ์ตัวชี้หลายตัวใน API ระดับ Android 13 ขึ้นไป และสำหรับเหตุการณ์ตัวชี้เดียวใน API ทุกระดับได้แล้ว

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมได้ที่