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