เมื่อผู้ใช้วาด เขียน หรือโต้ตอบกับแอปโดยใช้สไตลัส บางครั้งผู้ใช้อาจ สัมผัสหน้าจอด้วยฝ่ามือ ระบบอาจรายงานเหตุการณ์การแตะไปยังแอปของคุณก่อนที่ระบบจะจดจำและยกเลิกเหตุการณ์ดังกล่าวเป็นการแตะด้วยฝ่ามือโดยไม่ตั้งใจ
แอปต้องระบุเหตุการณ์การแตะที่ไม่เกี่ยวข้องและละเว้นเหตุการณ์เหล่านั้น Android 13 และ API ระดับที่สูงกว่าจะระบุการสัมผัสด้วยฝ่ามือแตกต่างจาก API ระดับอื่นๆ ทั้งหมด
ผลลัพธ์
แอปของคุณสามารถระบุและปฏิเสธการสัมผัสด้วยฝ่ามือสำหรับเหตุการณ์แบบหลายตัวชี้ใน API ระดับ Android 13 ขึ้นไป และสำหรับเหตุการณ์แบบตัวชี้เดียวใน API ทุกระดับ
ความเข้ากันได้ของเวอร์ชัน
ตั้งค่า minSDK ของโปรเจ็กต์เป็น API ระดับ 33 สำหรับเหตุการณ์แบบหลายนิ้ว
ระบบรองรับเหตุการณ์แบบพอยน์เตอร์เดียวในระดับ API
การขึ้นต่อกัน
ไม่มี
ระบุและไม่สนใจการสัมผัสด้วยฝ่ามือ
Android จะยกเลิกการสัมผัสด้วยฝ่ามือโดยการส่งออบเจ็กต์ MotionEvent ไปยังแอปของคุณ
ตรวจสอบออบเจ็กต์
MotionEventที่ส่งไปยังแอป ใช้MotionEventAPI เพื่อกำหนดพร็อพเพอร์ตี้เหตุการณ์ (การดำเนินการและค่าสถานะ)- เหตุการณ์แบบชี้เดียว - ตรวจหา
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(): รับออบเจ็กต์MotionEventMotionEvent#getActionMasked(): แสดงผลการดำเนินการที่เชื่อมโยงกับ เหตุการณ์การเคลื่อนไหวACTION_CANCEL: ค่าคงที่MotionEventที่บ่งบอกว่าควรเลิกทำการแตะACTION_POINTER_UP: ค่าคงที่MotionEventที่ระบุว่าเคอร์เซอร์ อื่นที่ไม่ใช่เคอร์เซอร์แรกได้เลิกสัมผัส (กล่าวคือ ไม่ได้สัมผัส หน้าจออุปกรณ์แล้ว)FLAG_CANCELED: ค่าคงที่MotionEventที่ระบุว่าตัวชี้ ที่เลื่อนขึ้นทำให้เกิดเหตุการณ์สัมผัสโดยไม่ตั้งใจ เพิ่มลงในเหตุการณ์ACTION_POINTER_UPและACTION_CANCELใน Android 13 (API ระดับ 33) ขึ้นไป
คอลเล็กชันที่มีคำแนะนำนี้
คู่มือนี้เป็นส่วนหนึ่งของคอลเล็กชันคู่มือฉบับย่อที่คัดสรรมาแล้ว ซึ่งครอบคลุมเป้าหมายการพัฒนา Android ในวงกว้างขึ้น