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

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

האפליקציה צריכה לזהות אירועי מגע מיותרים ולהתעלם מהם. רמות API מ-Android 13 ומעלה מציינות מגעים של כף היד באופן שונה מכל רמות ה-API האחרות.

תוצאות

האפליקציה יכולה לזהות ולדחות מגעים של כף היד באירועים של כמה מצביעים ב-Android 13 וברמות API גבוהות יותר, ובאירועים של מצביע יחיד בכל רמות ה-API.

תאימות גרסאות

מגדירים את minSDK של הפרויקט לרמת API‏ 33 לאירועים של כמה מצביעים. אירועים של הצבעה בודדת נתמכים ברמות API.

פניות קשורות

ללא.

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

מערכת 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. ביטול התנועה

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

באפליקציה צריך להיות היסטוריה של פעולות המשתמשים, כדי שאפשר יהיה לבטל פעולות לא מכוונות כמו מגעים עם כף היד. דוגמה לאופן שמירת ההיסטוריה מופיעה במאמר Implement a basic drawing app (הטמעה של אפליקציית ציור בסיסית) ב-codelab בנושא Enhance stylus support in an Android app (שיפור התמיכה בסטיילוס באפליקציית 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:

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

יש לך שאלות או משוב?

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