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