เมื่อผู้ใช้วาด เขียน หรือโต้ตอบกับแอปโดยใช้สไตลัส บางครั้งผู้ใช้อาจแตะหน้าจอด้วยฝ่ามือ ระบบอาจรายงานเหตุการณ์การสัมผัสไปยังแอปของคุณก่อนที่ระบบจะจดจำและปิดเหตุการณ์ดังกล่าวว่าเป็นเหตุการณ์การสัมผัสด้วยฝ่ามือโดยไม่ตั้งใจ
ระบุและละเว้นการสัมผัสด้วยฝ่ามือ
แอปต้องระบุเหตุการณ์การสัมผัสที่ไม่เกี่ยวข้องและละเว้นเหตุการณ์เหล่านั้น 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 ที่กว้างขึ้น ดังนี้
![](https://developer.android.com/static/images/quick-guides/collection-illustration.png?hl=th)