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