כשמשתמשים מציירים, כותבים או יוצרים אינטראקציה עם אפליקציה באמצעות סטיילוס, לפעמים הם נוגעים במסך בכף היד. יכול להיות שאירוע המגע ידווח לאפליקציה לפני שהמערכת תזהה את האירוע ותסיר אותו כמגע בטעות בכף היד.
זיהוי מגע של כף היד והתעלמות ממנו
האפליקציה צריכה לזהות אירועי מגע מיותרים ולהתעלם מהם. מערכת Android מבטלת נגיעה בכף היד על ידי שליחת אובייקט MotionEvent
לאפליקציה.
בודקים את אובייקטי
MotionEvent
שנשלחים לאפליקציה. משתמשים בממשקי ה-API שלMotionEvent
כדי לקבוע את מאפייני האירוע (פעולות ודגלים):- אירועים של מצביע יחיד – מחפשים את
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. ביטול התנועה
אחרי שמזהים מגע בכף היד, אפשר לבטל את האפקטים במסך של המחווה.
האפליקציה חייבת לשמור היסטוריה של פעולות המשתמשים כדי שאפשר יהיה לבטל קלט לא מכוון, כמו מגע של כף היד. לדוגמה לשימור היסטוריה, ראו הטמעת אפליקציית ציור בסיסית בקודלאב שיפור התמיכה בעט ב-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 13 ורמות API גבוהות יותר, ובאירועים עם נקודת מגע אחת בכל רמות ה-API.
אוספים שמכילים את המדריך הזה
המדריך הזה הוא חלק מהאוספים הבאים של מדריכים מהירים, שמכסים יעדים רחבים יותר לפיתוח Android: