สไตลัสเป็นเครื่องมือที่มีประสิทธิภาพและสร้างสรรค์อย่างยิ่ง แต่เมื่อผู้ใช้วาด เขียน หรือโต้ตอบกับแอปโดยใช้สไตลัส บางครั้งผู้ใช้อาจสัมผัสหน้าจอด้วยฝ่ามือ ระบบอาจรายงานเหตุการณ์การสัมผัสไปยังแอปของคุณก่อนที่ระบบจะจดจำและยกเลิกเหตุการณ์ดังกล่าวว่าเป็นการสัมผัสฝ่ามือโดยไม่ตั้งใจ
แนวทางปฏิบัติแนะนำ
แอปของคุณต้องระบุและละเว้นเหตุการณ์การสัมผัสที่ไม่เกี่ยวข้อง ใน Jetpack
Compose คุณสามารถเข้าถึง MotionEvent ของ Android ที่อยู่เบื้องหลังได้จาก
PointerEvent ตรวจสอบ MotionEvent สำหรับ ACTION_CANCEL ซึ่ง
บ่งชี้ว่าควรหยุดท่าทางสัมผัสและอาจต้องย้อนกลับ ใน
Android 13 (API ระดับ 33) ขึ้นไป ให้ตรวจสอบแฟล็ก FLAG_CANCELED
ในเหตุการณ์ ACTION_CANCEL และ ACTION_POINTER_UP ซึ่งเป็น
สัญญาณที่ชัดเจนว่าการสัมผัสนั้นไม่ได้ตั้งใจ เช่น การสัมผัสฝ่ามือ
ส่วนผสม
Modifier.pointerInput(): ตัวปรับแต่ง Compose ที่ใช้ประมวลผลการป้อนข้อมูลด้วยตัวชี้PointerEvent: แสดงถึงเหตุการณ์ตัวชี้ใน Compose ซึ่งมีการเปลี่ยนแปลงอย่างน้อย 1 รายการPointerEvent.motionEvent: พร็อพเพอร์ตี้ส่วนขยายที่ให้สิทธิ์เข้าถึงMotionEventของ Android ที่อยู่เบื้องหลัง (อาจเป็น Null)MotionEvent: แสดงถึงเหตุการณ์การสัมผัสและการเคลื่อนไหว มีข้อมูลที่จำเป็นในการพิจารณาว่าควรละเว้นเหตุการณ์หรือไม่ACTION_CANCEL: ค่าคงที่MotionEventที่บ่งชี้ว่าท่าทางสัมผัสถูกยกเลิกแล้ว ควรหยุดท่าทางสัมผัสและอาจต้องย้อนกลับACTION_POINTER_UP: ค่าคงที่MotionEventที่บ่งชี้ว่าตัวชี้อื่นที่ไม่ใช่ตัวชี้แรกยกขึ้น (นั่นคือ ปล่อยการสัมผัสกับหน้าจออุปกรณ์)FLAG_CANCELED: ค่าคงที่MotionEventที่บ่งชี้ว่าตัวชี้ที่ยกขึ้นทำให้เกิดเหตุการณ์การสัมผัสโดยไม่ตั้งใจ เพิ่มลงในเหตุการณ์ACTION_POINTER_UPและACTION_CANCELใน Android 13 (API ระดับ 33) ขึ้นไป
ขั้นตอน
ตรวจสอบออบเจ็กต์ MotionEvent ที่ส่งไปยังแอปของคุณ ใช้ API ของ MotionEvent เพื่อกำหนดลักษณะของเหตุการณ์ ดังนี้
- เหตุการณ์ตัวชี้เดียว \- ตรวจสอบ
ACTION_CANCELซึ่งบ่งชี้ว่าควรหยุดท่าทางสัมผัส ใน Android 13 ขึ้นไป ให้ตรวจสอบFLAG_CANCELEDด้วยเพื่อยืนยันว่าการสัมผัสไม่ได้ตั้งใจ - เหตุการณ์ตัวชี้หลายตัว \- ใน Android 13 ขึ้นไป ให้ตรวจสอบ
ACTION_POINTER_UPและFLAG_CANCELEDเพื่อระบุการสัมผัสโดยไม่ตั้งใจ
ตอบสนองต่อเหตุการณ์เหล่านี้โดยหยุดท่าทางสัมผัสและย้อนกลับการเปลี่ยนแปลงชั่วคราว
1. รับออบเจ็กต์เหตุการณ์การเคลื่อนไหว
ใช้ Modifier.pointerInput เพื่อประมวลผลการป้อนข้อมูลด้วยตัวชี้ใน Composable ภายในขอบเขตการป้อนข้อมูลด้วยตัวชี้ ให้ใช้ awaitPointerEventScope และ awaitPointerEvent เพื่อรับเหตุการณ์ และดึงข้อมูล MotionEvent ของ Android ที่อยู่เบื้องหลังโดยใช้พร็อพเพอร์ตี้ motionEvent ดังนี้
import androidx.compose.ui.input.pointer.pointerInput Box( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { awaitPointerEventScope { while (true) { val event = awaitPointerEvent() val motionEvent = event.motionEvent if (motionEvent != null) { // Process motion event. } } } } )
2. กำหนดการดำเนินการและแฟล็กของเหตุการณ์
ตรวจสอบ MotionEvent สำหรับ ACTION_CANCEL ซึ่งบ่งชี้ถึงเหตุการณ์ตัวชี้เดียวใน API ทุกระดับ ใน Android 13 ขึ้นไป ให้ตรวจสอบ ACTION_POINTER_UP สำหรับ FLAG_CANCELED ดังนี้
import androidx.compose.ui.input.pointer.pointerInput Box( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { awaitPointerEventScope { while (true) { val event = awaitPointerEvent() val motionEvent = event.motionEvent ?: continue when (motionEvent.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 && (motionEvent.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED ) { // Process canceled multi-pointer motion event for Android 13 and higher. } } } } } } )
3. เลิกทำท่าทางสัมผัส
เมื่อระบุการสัมผัสฝ่ามือได้แล้ว คุณจะเลิกทำเอฟเฟกต์บนหน้าจอของท่าทางสัมผัสได้
แอปของคุณต้องเก็บประวัติการดำเนินการของผู้ใช้ไว้เพื่อให้เลิกทำอินพุตที่ไม่ตั้งใจ เช่น การสัมผัสฝ่ามือได้ ดูตัวอย่างได้ที่ Implement a basic drawing app ใน Enhance stylus support in an Android app Codelab
ผลลัพธ์
ตอนนี้แอปของคุณสามารถระบุและปฏิเสธการสัมผัสฝ่ามือสำหรับเหตุการณ์ตัวชี้หลายตัวใน API ระดับ Android 13 ขึ้นไป และสำหรับเหตุการณ์ตัวชี้เดียวใน API ทุกระดับได้แล้ว
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมได้ที่
- ฟีเจอร์และ API ของ Android 13 \- การปฏิเสธการสัมผัสฝ่ามือที่ได้รับการปรับปรุง
- คู่มือนักพัฒนาซอฟต์แวร์
- ฟีเจอร์ขั้นสูงของสไตลัส
- ส่วนการปฏิเสธการสัมผัสฝ่ามือของ Input compatibility on large screens
- Codelab \- Enhance stylus support in an Android app