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

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

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

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

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

    • เหตุการณ์เคอร์เซอร์เดี่ยว - ตรวจสอบ 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. กำหนดการดำเนินการและ Flag ของเหตุการณ์

ตรวจสอบ 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) ขึ้นไป

ผลลัพธ์

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

คอลเล็กชันที่มีคู่มือนี้

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

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

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

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