ปฏิเสธการสัมผัสสไตลัสด้วยฝ่ามือ

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

แอปของคุณต้องระบุเหตุการณ์สัมผัสที่ไม่เกี่ยวข้องและไม่สนใจเหตุการณ์เหล่านั้น Android 13 และ API ระดับที่สูงกว่าจะระบุการสัมผัสด้วยฝ่ามือแตกต่างจาก API ระดับอื่นๆ ทั้งหมด

ผลลัพธ์

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

ระบุและไม่สนใจการสัมผัสด้วยฝ่ามือ

Android จะยกเลิกการสัมผัสด้วยฝ่ามือโดยการส่งออบเจ็กต์ MotionEvent ไปยังแอปของคุณ

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

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

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

วิธีเพิ่ม OnTouchListener ลงในแอป

Kotlin

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        // Process motion event.
    }
}

Java

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    // Process motion event.
});

2. กำหนดการดำเนินการและค่าสถานะของเหตุการณ์

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

Kotlin

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        when (event.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 &&
                   (event.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                    //Process canceled multi-pointer motion event for Android 13 and higher.
                }
            }
        }
        true
    }
}

Java

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_CANCEL:
            // Process canceled single-pointer motion event for all SDK versions.
        case MotionEvent.ACTION_UP:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
               (event.getFlags() & MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                //Process canceled multi-pointer motion event for Android 13 and higher.
            }
    }
    return true;
});

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

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

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

ข้อมูลสำคัญ

  • MotionEvent: แสดงเหตุการณ์การสัมผัสและการเคลื่อนไหว มี ข้อมูลที่จำเป็นต่อการพิจารณาว่าควรละเว้นเหตุการณ์หรือไม่
  • OnTouchListener#onTouch(): รับออบเจ็กต์ MotionEvent
  • MotionEvent#getActionMasked(): แสดงผลการดำเนินการที่เชื่อมโยงกับ เหตุการณ์การเคลื่อนไหว
  • ACTION_CANCEL: ค่าคงที่ MotionEvent ที่ระบุว่าควรเลิกทำท่าทาง
  • ACTION_POINTER_UP: ค่าคงที่ MotionEvent ที่ระบุว่าเคอร์เซอร์ อื่นที่ไม่ใช่เคอร์เซอร์แรกได้เลิกสัมผัส (กล่าวคือ ไม่ได้สัมผัส หน้าจออุปกรณ์แล้ว)
  • FLAG_CANCELED: ค่าคงที่ MotionEvent ที่ระบุว่าตัวชี้ ที่เลื่อนขึ้นทำให้เกิดเหตุการณ์สัมผัสโดยไม่ตั้งใจ เพิ่มลงในเหตุการณ์ ACTION_POINTER_UP และ ACTION_CANCEL ใน Android 13 (API ระดับ 33) ขึ้นไป

คอลเล็กชันที่มีคำแนะนำนี้

คู่มือนี้เป็นส่วนหนึ่งของคอลเล็กชันคู่มือฉบับย่อที่คัดสรรมาแล้วซึ่งครอบคลุม เป้าหมายการพัฒนา Android ที่กว้างขึ้น

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

มีคำถามหรือความคิดเห็น

ไปที่หน้าคำถามที่พบบ่อยเพื่อดูคำแนะนำแบบรวดเร็ว หรือติดต่อเราเพื่อบอกความคิดเห็นของคุณ