דחיית נגיעות של כף היד בסטיילוס

כשמשתמשים מציירים, כותבים או יוצרים אינטראקציה עם אפליקציה באמצעות סטיילוס, לפעמים הם נוגעים במסך בכף היד. יכול להיות שאירוע המגע ידווח לאפליקציה לפני שהמערכת תזהה את האירוע ותסיר אותו כמגע בטעות בכף היד.

זיהוי מגע של כף היד והתעלמות ממנו

האפליקציה צריכה לזהות אירועי מגע מיותרים ולהתעלם מהם. מערכת 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:

מאפשרים לאפליקציה לתמוך בחוויית משתמש אופטימלית בטאבלטים, במכשירים מתקפלים ובמכשירי ChromeOS.

יש לכם שאלות או משוב

אתם יכולים להיכנס לדף השאלות הנפוצות שלנו ולקרוא מדריכים מהירים, או ליצור איתנו קשר ולספר לנו מה דעתכם.