מערכת Android תומכת במגוון מסכי מגע ומשטחי מגע, כולל טאבלטים עם מתקן דיגיטציה מבוסס-סטיילוס.
מסכי מגע הם מכשירי מגע שמשויכים למסך, כך שלמשתמש יש תחושה שהוא מבצע פעולות ישירות על הפריטים במסך.
משטחי מגע הם מכשירים עם מגע שלא משויכים למסך, כמו טאבלט דיגיטלי. לוחות מגע משמשים בדרך כלל לכוונון או למיקום עקיף מוחלט, או לשליטה בממשק המשתמש באמצעות תנועות.
במכשירי מגע יכולים להיות לחצנים שהפונקציות שלהם דומות ללחצני עכבר.
לפעמים אפשר לבצע פעולות במכשירי מגע באמצעות מגוון כלים שונים, כמו אצבעות או עט, בהתאם לטכנולוגיה של חיישן המגע.
לפעמים משתמשים במכשירי מגע כדי להטמיע מקשים וירטואליים. לדוגמה, במכשירי Android מסוימים, אזור החיישן של מסך המגע חורג מעבר לקצה המסך ומשמש למטרה כפולה כחלק ממקלדת עם חיישן מגע.
בגלל המגוון הגדול של מכשירי מגע, מערכת Android מסתמכת על מספר גדול של מאפייני תצורה כדי לתאר את המאפיינים ואת ההתנהגות הרצויה של כל מכשיר.
סיווג של מכשירי מגע
מכשיר קלט מסווג כמכשיר מגע רב-שכבתי אם מתקיימים שני התנאים הבאים:
- מכשיר הקלט מדווח על נוכחות של הצירים המוחלטים
ABS_MT_POSITION_X
ו-ABS_MT_POSITION_Y
. - מכשיר הקלט לא כולל לחצנים של שלט משחק. התנאי הזה פותר אי-בהירות במכשירי גיימפאד מסוימים שמדווחים על צירים עם קודים שמצטברים עם אלה של צירי MT.
מכשיר קלט מסווג כמכשיר מגע יחיד אם מתקיימים שני התנאים הבאים:
- מכשיר הקלט לא מסווג כמכשיר עם מגע רב-שכבתי. מכשיר קלט מסווג כמכשיר מגע יחיד או כמכשיר מגע מרובה, אף פעם לא בשני הסוגים.
- מכשיר הקלט מדווח על נוכחות הצירים המוחלטים
ABS_X
ו-ABS_Y
ועל נוכחות קוד המפתחBTN_TOUCH
.
כשמכשיר קלט מסווג כמכשיר מגע, נוכחות המפתחות הווירטואליים נקבעת על ידי ניסיון לטעון את קובץ המפה של המפתחות הווירטואליים של המכשיר. אם יש מפת מפתחות וירטואלית, גם קובץ הפריסה של המפתחות של המכשיר נטען. מידע על המיקום והפורמט של הקבצים האלה זמין במאמר [קובצי מפות מפתחות וירטואליות](#virtual-key-map-files).
לאחר מכן, המערכת טוענת את קובץ התצורה של מכשיר הקלט למכשיר המגע.
לכל מכשירי המגע המובנים צריכים להיות קובצי תצורה של מכשירי קלט. אם אין קובץ תצורה של מכשיר קלט, המערכת בוחרת תצורת ברירת מחדל שמתאימה למכשירי קצה מגע למטרות כלליות, כמו מסכי מגע או משטחי מגע חיצוניים מסוג USB או Bluetooth HID. הגדרות ברירת המחדל האלה לא מיועדות למסכי מגע מובנים, והן עלולות לגרום להתנהגות שגויה.
אחרי טעינת ההגדרות של מכשיר הקלט, המערכת מסווגת את מכשיר הקלט כמסך מגע, לוח מגע או מכשיר עכבר.
- מכשיר עם מסך מגע משמש לפעולות ישירות על אובייקטים במסך. המשתמש נוגע ישירות במסך, ולכן המערכת לא זקוקה לאמצעי עזר נוספים כדי לציין את האובייקטים שבהם מבצעים פעולות.
- מכשיר משטח מגע משמש כדי לספק לאפליקציה מידע על מיקום מוחלט של נגיעות באזור חיישן נתון. האפשרות הזו יכולה להיות שימושית לטאבלטים עם מתקן להמרת נתונים לאלקטרוניים.
- מכשיר סמן משמש לצורך מניפולציה עקיפה של אובייקטים במסך באמצעות סמן. האצבעות מתורגמות לתנועות של מצביע עם מגע במספר נקודות. כלים אחרים, כמו עטים, מפורשים באמצעות מיקומים מוחלטים. למידע נוסף, ראו תנועות עקיפות של סמן עם מגע רב-אצבעות.
הכללים הבאים משמשים לסיווג של מכשיר הקלט כמסך מגע, ללוח מגע או למכשיר צביעה.
- אם המאפיין
touch.deviceType
מוגדר, סוג המכשיר מוגדר כפי שצוין. - אם מכשיר הקלט מדווח על נוכחות של מאפיין הקלט
INPUT_PROP_DIRECT
(דרך ה-ioctlEVIOCGPROP
), סוג המכשיר מוגדר כ-מסך מגע. התנאי הזה מבוסס על ההנחה שמכשירי מגע עם קלט ישיר מחוברים למסך שמחובר גם כן. - אם מכשיר הקלט מדווח על נוכחות של מאפיין הקלט
INPUT_PROP_POINTER
(דרך ה-ioctlEVIOCGPROP
), סוג המכשיר מוגדר כ-pointer. - אם מכשיר הקלט מדווח על נוכחות של צירים יחסיים
REL_X
אוREL_Y
, סוג המכשיר מוגדר כ-touch pad. התנאי הזה פותר את אי-הבהירות לגבי התקני קלט שכוללים גם עכבר וגם משטח מגע. במקרה כזה, משטח המגע לא משמש לשליטה בסמן כי העכבר כבר שולט בו. - אחרת, סוג המכשיר מוגדר כ-pointer. ברירת המחדל הזו מבטיחה שמשטחי מגע שלא הוקצו למטרה מיוחדת אחרת ישמשו לשליטה בסמן.
לחצנים
לחצנים הם רכיבי בקרה אופציונליים שאפשר להשתמש בהם באפליקציות כדי לבצע פונקציות נוספות. לחצנים במכשירי מגע פועלים באופן דומה למקשי עכבר, והם משמשים בעיקר במכשירי מגע מסוג סמן או עם עט מגע.
יש תמיכה בלחצנים הבאים:
BTN_LEFT
: ממופה ל-MotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: ממופה ל-MotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: ממופה ל-MotionEvent.BUTTON_MIDDLE
.BTN_BACK
ו-BTN_SIDE
: ממופים אלMotionEvent.BUTTON_BACK
. לחיצה על הלחצן הזה גם יוצרת סינתזה של הקשה על מקש עם קוד המפתחKeyEvent.KEYCODE_BACK
.BTN_FORWARD
ו-BTN_EXTRA
: ממופים ל-MotionEvent.BUTTON_FORWARD
. לחיצה על הלחצן הזה גם יוצרת סינתזה של הקשה על מקש עם קוד המפתחKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: ממופה ל-MotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: ממופה ל-MotionEvent.BUTTON_TERTIARY
.
כלים וסוגים של כלים
כלי הוא אצבע, עט או מכשיר אחר שמשמש לאינטראקציה עם מכשיר המגע. חלק ממכשירי המגע יכולים להבדיל בין סוגים שונים של כלים.
במקומות אחרים ב-Android, כמו ב-API של MotionEvent
, לעיתים קרובות קוראים לכלי מצביע.
יש תמיכה בסוגי הכלים הבאים:
BTN_TOOL_FINGER
ו-MT_TOOL_FINGER
: ממופים ל-MotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
ו-MT_TOOL_PEN
: ממופים ל-MotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: ממופה ל-MotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: ממופה ל-MotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: ממופה ל-MotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: ממופה ל-MotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: ממופה ל-MotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: ממופה ל-MotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
וגםBTN_TOOL_QUADTAP
: מותאמים ל-MotionEvent.TOOL_TYPE_FINGER
.
שימוש בכלים בהעברה מעליהם לעומת שימוש בהם בהקשה
הכלים יכולים להיות במגע עם מכשיר המגע או בטווח שלו ולרחף מעליו. לא כל מכשירי המגע יכולים לזהות את נוכחות הכלי שמרחף מעל מכשיר המגע. אלה שכן, כמו מכשירי דיגיטיזציה מבוססי-RF של עטים, לעיתים קרובות יכולים לזהות מתי הכלי נמצא בטווח מוגבל של מכשיר הדיגיטיזציה.
הרכיב InputReader
מבדיל בין כלים למגע לכלים להעברת העכבר מעליהם. באופן דומה, דיווח על כלים למגע ועל כלים להחזקה מעל רכיבים באפליקציות מתבצע בדרכים שונות.
אירועי מגע בכלים מדווחים לאפליקציות כאירועי מגע באמצעות MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
ו-MotionEvent.ACTION_POINTER_UP
.
אירועי העברה מעל כלי מדווחים לאפליקציות כאירועי תנועה כלליים באמצעות MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
ו-MotionEvent.ACTION_HOVER_EXIT
.
דרישות להתקנת מנהל התקן של מכשיר מגע
- מנהלי התקנים של מכשירי מגע צריכים לרשום רק את הצירים ואת קודי המקשים של הצירים והלחצנים שהם תומכים בהם. רישום של צירים או קודי מפתחות שלא נתמכים עלול לבלבל את האלגוריתם של סיווג המכשיר או לגרום למערכת לזהות באופן שגוי את היכולות של המכשיר. לדוגמה, אם המכשיר מדווח על קוד המפתח
BTN_TOUCH
, המערכת מניחה ש-BTN_TOUCH
משמש תמיד כדי לציין אם הכלי נמצא במגע עם המסך. לכן, לא צריך להשתמש ב-BTN_TOUCH
כדי לציין שהכלי נמצא בטווח ופשוט מרחף מעליו. - במכשירים עם מגע יחיד נעשה שימוש באירועי הקלט הבאים של Linux:
ABS_X
: (חובה) דיווח על קואורדינטת X של הכלי.ABS_Y
: (חובה) דיווח על קו ה-Y של הכלי.ABS_PRESSURE
: (אופציונלי) דיווח על הלחץ הפיזי שמופעל על קצה הכלי או על עוצמת האות של מגע המגע.ABS_TOOL_WIDTH
: (אופציונלי) דיווח על שטח החתך או על הרוחב של מגע המגע או של הכלי עצמו.ABS_DISTANCE
: (אופציונלי) דיווח על המרחק של הכלי מהמשטח של מכשיר המגע.ABS_TILT_X
: (אופציונלי) דיווח על הטיה של הכלי מפני השטח של מכשיר המגע לאורך ציר X.ABS_TILT_Y
: (אופציונלי) דיווח על הטיה של הכלי מפני השטח של מכשיר המגע לאורך ציר ה-Y.BTN_TOUCH
: (חובה) מציין אם הכלי נמצא במגע עם המכשיר.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (אופציונלי) מצבי הלחצן של הדוחות.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (אופציונלי) דיווח על סוג הכלי.
- במכשירים עם מגע רב-משתמש נעשה שימוש באירועי הקלט הבאים ב-Linux:
ABS_MT_POSITION_X
: (חובה) דיווח על קואורדינטת X של הכלי.ABS_MT_POSITION_Y
: (חובה) דיווח על קו ה-Y של הכלי.ABS_MT_PRESSURE
: (אופציונלי) דיווח על הלחץ הפיזי שמופעל על קצה הכלי או על עוצמת האות של מגע המגע.ABS_MT_TOUCH_MAJOR
: (אופציונלי) דיווח על שטח החתך של מגע המגע, או על האורך של המאפיין הארוך יותר של מגע המגע.ABS_MT_TOUCH_MINOR
: (אופציונלי) האורך של המאפיין הקצר יותר של נקודת המגע. אין להשתמש בציר הזה אם הערך שלABS_MT_TOUCH_MAJOR
הוא מדידת שטח.ABS_MT_WIDTH_MAJOR
: (אופציונלי) דיווח על שטח החתך של הכלי עצמו, או על האורך של המאפיין הארוך ביותר של הכלי עצמו. אין להשתמש בציר הזה אלא אם אתם יודעים את המימדים של הכלי עצמו.ABS_MT_WIDTH_MINOR
: (אופציונלי) אורך המאפיין הקצר יותר של הכלי עצמו. אין להשתמש בציר הזה אםABS_MT_WIDTH_MAJOR
מדווח על מדידת שטח או אם המאפיינים של הכלי עצמו לא ידועים.ABS_MT_ORIENTATION
: (אופציונלי) דיווח על כיוון הכלי.ABS_MT_DISTANCE
: (אופציונלי) דיווח על המרחק של הכלי מהמשטח של מכשיר המגע.ABS_MT_TOOL_TYPE
: (אופציונלי) דיווח על סוג הכלי בתורMT_TOOL_FINGER
אוMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (אופציונלי) דיווח על מזהה המעקב של הכלי. מזהה המעקב הוא מספר שלם לא שלילי שרירותי, המשמש לזיהוי ולמעקב אחרי כל כלי בנפרד כשיש כמה כלים פעילים. לדוגמה, כשמספר אצבעות נוגעות במכשיר, צריך להקצות לכל אצבע מזהה מעקב ייחודי שמשמש כל עוד האצבע נוגעת במכשיר. אפשר להשתמש שוב במזהי המעקב כשהכלים המשויכים להם יוצאים מהטווח.ABS_MT_SLOT
: (אופציונלי) דיווח על מזהה החריץ של הכלי, כשמשתמשים בפרוטוקול המגע הרב-שכבתי של Linux 'B'. פרטים נוספים זמינים במסמכי התיעוד של פרוטוקול המגע הרב-שכבתי של Linux.BTN_TOUCH
: (חובה) מציין אם הכלי נמצא במגע עם המכשיר.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (אופציונלי) מצבי הלחצן של הדוחות.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (אופציונלי) דיווח על סוג הכלי.
- אם מוגדרים צירים גם לפרוטוקול של נקודת מגע אחת וגם לפרוטוקול של כמה נקודות מגע, המערכת משתמשת רק בצירים של כמה נקודות מגע ומתעלם מהצירים של נקודת מגע אחת.
הערכים המינימלי והמקסימלי של הצירים
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
ו-ABS_MT_POSITION_Y
מגדירים את גבולות האזור הפעיל של המכשיר ביחידות משטח ספציפיות למכשיר. במקרה של מסך מגע, האזור הפעיל מתאר את החלק במכשיר המגע שמכסה בפועל את המסך.במסך מגע, המערכת מבצעת באופן אוטומטי אינטרפולציה של מיקומי המגע שדווחו ביחידות של פני השטח כדי לקבל את מיקומי המגע בפיקסלים של המסך, לפי החישוב הבא:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
מסך מגע עשוי לדווח על נגיעות מחוץ לאזור הפעיל שדווח.
מגע שמתחיל מחוץ לאזור הפעיל לא מועבר לאפליקציות, אבל אפשר להשתמש בו למפתחות וירטואליים.
האפליקציות מקבלות דיווח על נגיעות שמתחילות בתוך האזור הפעיל, או על נגיעות שנכנסות לאזור התצוגה ויוצאות ממנו. כתוצאה מכך, אם מגע מתחיל בתוך גבולות האפליקציה ואז עובר מחוץ לאזור הפעיל, יכול להיות שהאפליקציה תקבל אירועי מגע עם קואורדינטות תצוגה שליליות או מחוץ לגבולות המסך. זו התנהגות צפויה.
מכשיר מגע אף פעם לא צריך לכוונן את קואורדינטות המגע לגבולות האזור הפעיל. אם מגע יוצא מהאזור הפעיל, צריך לדווח עליו כמגע מחוץ לאזור הפעיל, או לא לדווח עליו בכלל.
לדוגמה, אם האצבע של המשתמש נוגעת ליד הפינה הימנית העליונה של מסך המגע, יכול להיות שהיא תדווח על קואורדינטות של (minX, minY). אם האצבע ממשיכה לנוע מחוץ לאזור הפעיל, מסך המגע אמור להתחיל לדווח על קואורדינטות עם רכיבים קטנים מ-minX ו-minY, כמו (minX - 2, minY - 3), או להפסיק לדווח על המגע לגמרי. במילים אחרות, מסך המגע לא צריך לדווח על (minX, minY) כשאצבע המשתמש נוגעת באמת מחוץ לאזור הפעיל.
הצמדת קואורדינטות המגע לקצה המסך יוצרת גבול מלאכותי וקשה סביב קצה המסך, שמונעת מהמערכת לעקוב בצורה חלקה אחרי תנועות שנכנסות או יוצאות מגבולות אזור התצוגה.
הערכים שמדווחים על ידי
ABS_PRESSURE
אוABS_MT_PRESSURE
, אם הם מדווחים בכלל, חייבים להיות שונים מאפס כשהכלי נוגע במכשיר, ואפס במקרים אחרים כדי לציין שהכלי מרחף.דיווח על נתוני לחץ הוא אופציונלי, אבל מומלץ מאוד. אפליקציות יכולות להשתמש בנתוני הלחץ כדי להטמיע ציור רגיש ללחץ ואפקטים אחרים.
הערכים שמדווחים על ידי
ABS_TOOL_WIDTH
, ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
, ABS_MT_WIDTH_MAJOR
ו-ABS_MT_WIDTH_MINOR
צריכים להיות שונים מאפס כשהכלי נמצא במגע עם המכשיר, ואפס במקרים אחרים, אבל זה לא נדרש. לדוגמה, יכול להיות שמכשיר המגע יוכל למדוד את גודל המגע של האצבע, אבל לא את גודל המגע של עט הסtylus.הדיווח על נתוני הגודל הוא אופציונלי, אבל מומלץ מאוד. אפליקציות יכולות להשתמש בנתוני הלחץ כדי להטמיע ציור מותאם-גודל ואפקטים אחרים.
הערכים שמדווחים על ידי
ABS_DISTANCE
אוABS_MT_DISTANCE
אמורים להתקרב לאפס כשהכלי נוגע במכשיר. המרחק יכול להישאר שונה מאפס גם כשהכלי נמצא במגע ישיר. הערכים המדויקים שמדווחים תלויים באופן שבו החומרה מודדת את המרחק.דיווח על מידע לגבי המרחק הוא אופציונלי, אבל מומלץ למכשירים עם עט.
הערכים שמדווחים על ידי
ABS_TILT_X
ו-ABS_TILT_Y
צריכים להיות אפס כשהכלי ניצב למכשיר. אם הערך של השיפוע שונה מאפס, סימן שהכלי מוחזק בזווית.ההנחה היא שזוויות ההטיה בצירים X ו-Y מצוינות במעלות מהאנכי. נקודת המרכז (אנכית לחלוטין) ניתנת על ידי
(max + min) / 2
לכל ציר. ערכים קטנים יותר מנקודת המרכז מייצגים הטיה למעלה או שמאלה, וערכים גדולים יותר מנקודת המרכז מייצגים הטיה למטה או ימינה.הפונקציה
InputReader
ממירה את רכיבי ההטיה X ו-Y לזווית הטיה ┴ בטווח של 0 עדPI / 2
רדיאנים ולזווית כיוון מישורית בטווח של-PI
עדPI
רדיאנים. הייצוג הזה מאפשר לתאר את הכיוון באופן תואם לתיאור של נגיעות באצבע.דיווח על נתוני הטיה הוא אופציונלי, אבל מומלץ במכשירים עם עט.
אם סוג הכלי מדווח על ידי
ABS_MT_TOOL_TYPE
, הוא מחליף את כל המידע על סוג הכלי שמדווח על ידיBTN_TOOL_*
. אם אין כלל מידע על סוג הכלי, ברירת המחדל של סוג הכלי היאMotionEvent.TOOL_TYPE_FINGER
.הכלי נחשב פעיל על סמך התנאים הבאים:
כשמשתמשים בפרוטוקול של מגע יחיד, הכלי פעיל אם הערך של
BTN_TOUCH
אוBTN_TOOL_*
הוא 1.התנאי הזה מרמז שצריך להיות ב-
InputReader
לפחות מידע כלשהו על אופי הכלי, למשל אם הוא נמצא במגע, או לפחות סוג הכלי. אם לא זמין מידע, המערכת מניחה שהכלי לא פעיל (מחוץ לטווח).- כשמשתמשים בפרוטוקול המגע הרב-שכבתי 'A', הכלי פעיל בכל פעם שהוא מופיע בדוח הסנכרון האחרון. כשהכלי יפסיק להופיע בדוחות הסנכרון, הוא יפסיק להתקיים.
- כשמשתמשים בפרוטוקול המגע הרב-שכבתי 'B', הכלי פעיל כל עוד יש לו משבצת פעילה. כשהחריץ יתרוקן, הכלי לא יהיה קיים יותר.
- המערכת קובעת שכלי מסוים נמצא במצב 'הצבעה' על סמך התנאים הבאים:
- אם הכלי הוא
BTN_TOOL_MOUSE
אוBTN_TOOL_LENS
, הכלי לא מרחף, גם אם מתקיים אחד מהתנאים הבאים. - אם הכלי פעיל והנהג מדווח על נתוני לחץ, והלחץ המדווח הוא אפס, הכלי מרחף.
- אם הכלי פעיל והדרייבר תומך בקוד המפתח
BTN_TOUCH
ו-BTN_TOUCH
שווה לאפס, הכלי מרחף.
- אם הכלי הוא
InputReader
תומך בפרוטוקול 'A' ובפרוטוקול 'B' של מגע רב-משתמש. מומלץ להשתמש בפרוטוקול 'B' עבור מנהלי התקנים חדשים, אבל אפשר להשתמש בכל אחד מהם.החל מגרסה 4.0 של Android, יכול להיות שיהיה צורך לשנות את מנהלי המסך המגעי כדי לעמוד בדרישות של מפרט פרוטוקול הקלט של Linux.
יכול להיות שתצטרכו לבצע את השינויים הבאים:
כשכלי מסוים הופך ללא פעיל (האצבע עולה למעלה), הוא אמור להפסיק להופיע בדוחות סנכרון הבאים של מגע בכמה אצבעות. כשכל הכלים הופכים לא פעילים (כל האצבעות 'מורדות'), הנהג צריך לשלוח חבילה ריקה של דוח סנכרון, למשל
SYN_MT_REPORT
ואחריוSYN_REPORT
.בגרסאות קודמות של Android, אירועים של 'הקשה' דווחו על ידי שליחת ערך לחץ של 0. ההתנהגות הישנה לא הייתה תואמת למפרט של פרוטוקול הקלט של Linux, והיא לא נתמכת יותר.
יש לדווח על מידע לגבי לחץ פיזי או עוצמת אות באמצעות הערך
ABS_MT_PRESSURE
.בגרסאות קודמות של Android, נתוני הלחץ אוחזו מ-
ABS_MT_TOUCH_MAJOR
. ההתנהגות הישנה לא הייתה תואמת למפרט של פרוטוקול הקלט של Linux, והיא לא נתמכת יותר.- יש לדווח על נתוני גודל המגע באמצעות
ABS_MT_TOUCH_MAJOR
.בגרסאות קודמות של Android, נתוני הגודל אוחזו מ-
ABS_MT_TOOL_MAJOR
. ההתנהגות הישנה לא הייתה תואמת למפרט של פרוטוקול הקלט של Linux, והיא לא נתמכת יותר.
הפעלת מכשיר מגע
בהמשך מופיע סיכום קצר של הפעולה במכשיר מגע ב-Android.
EventHub
קורא אירועים גולמיים מהדרייברevdev
.InputReader
צורך את האירועים הגולמיים ומעדכן את המצב הפנימי לגבי המיקום והמאפיינים האחרים של כל כלי. הוא גם עוקב אחרי מצבי הלחצנים.- אם לחצתם על BACK או על FORWARD או שחררתם אותם,
InputReader
מודיע ל-InputDispatcher
על האירוע המרכזי. InputReader
קובע אם התרחשה הקשה על מקש וירטואלי. אם כן, הוא יעדכן אתInputDispatcher
לגבי האירוע המרכזי.InputReader
קובע אם המגע בוצע בתוך גבולות המסך. אם כן, הוא מודיע ל-InputDispatcher
על אירוע המגע.- אם אין כלים למגע אבל יש לפחות כלי אחד להחזקה מעל,
InputReader
מודיע ל-InputDispatcher
על אירוע ההחזקה מעל. - אם סוג מכשיר המגע הוא pointer,
InputReader
מבצע זיהוי תנועות של סמן, מזיז את הסמן ומאתר בהתאם, ומעדכן אתInputDispatcher
על אירוע הסמן. InputDispatcher
משתמש ב-WindowManagerPolicy
כדי לקבוע אם צריך לשלוח את האירועים ואם הם צריכים להעיר את המכשיר. לאחר מכן,InputDispatcher
מעביר את האירועים לאפליקציות המתאימות.
הגדרת מכשיר מגע
ההתנהגות של מכשיר מגע נקבעת לפי הצירים, הלחצנים, מאפייני הקלט, ההגדרה של מכשיר הקלט, מפת המפתחות הווירטואליים ופסי ההקלדה של המכשיר.
בקטעים הבאים מפורטים פרטים נוספים על הקבצים שמשתתפים בהגדרת המקלדת:
מאפיינים
המערכת מסתמכת על מאפייני תצורה רבים של מכשיר הקלט כדי להגדיר ולכייל את ההתנהגות של מכשיר המגע.
אחת הסיבות לכך היא שמנהלי ההתקנים של מכשירי מגע מדווחים לעיתים קרובות על המאפיינים של המגעים באמצעות יחידות ספציפיות למכשיר.
לדוגמה, במכשירי מגע רבים, אזור המגע נמדד באמצעות סולם פנימי ספציפי למכשיר, כמו המספר הכולל של צמתים בחיישני המגע שהופעלו על ידי המגע. ערך הגודל הגולמי הזה לא יהיה משמעותי לאפליקציות, כי הן יצטרכו לדעת על הגודל הפיזי ועל מאפיינים אחרים של צמתים של חיישנים במכשיר מגע.
המערכת משתמשת בפרמטרים של כיול שמקודדים בקובצי התצורה של מכשיר הקלט כדי לפענח, לשנות ולנרמל את הערכים שמדווחים על ידי מכשיר המגע, ולהציג אותם כמייצג סטנדרטי פשוט יותר שאפשר להבין באפליקציות.
מוסכמות בנושא תיעוד
למטרות תיעוד, אנחנו משתמשים במוסכמות הבאות כדי לתאר את הערכים שבהם המערכת משתמשת במהלך תהליך הבקרה.
ערכים גולמיים של צירים
הביטויים הבאים מייצגים את הערכים הגולמיים שמדווחים על ידי מנהל ההתקן של מכשיר המגע כאירועי EV_ABS
.
raw.x
- הערך של ציר
ABS_X
אוABS_MT_POSITION_X
. raw.y
- הערך של ציר
ABS_Y
אוABS_MT_POSITION_Y
. raw.pressure
- הערך של הציר
ABS_PRESSURE
אוABS_MT_PRESSURE
, או 0 אם הוא לא זמין. raw.touchMajor
- הערך של ציר
ABS_MT_TOUCH_MAJOR
, או 0 אם הוא לא זמין. raw.touchMinor
- הערך של ציר
ABS_MT_TOUCH_MINOR
, אוraw.touchMajor
אם הוא לא זמין. raw.toolMajor
- הערך של הציר
ABS_TOOL_WIDTH
אוABS_MT_WIDTH_MAJOR
, או 0 אם הוא לא זמין. raw.toolMinor
- הערך של ציר
ABS_MT_WIDTH_MINOR
, אוraw.toolMajor
אם הוא לא זמין. raw.orientation
- הערך של ציר
ABS_MT_ORIENTATION
, או 0 אם הוא לא זמין. raw.distance
- הערך של הציר
ABS_DISTANCE
אוABS_MT_DISTANCE
, או 0 אם הוא לא זמין. raw.tiltX
- הערך של ציר
ABS_TILT_X
, או 0 אם הוא לא זמין. raw.tiltY
- הערך של ציר
ABS_TILT_Y
, או 0 אם הוא לא זמין.
טווחי צירים גולמיים
הביטויים הבאים מציינים את גבולות הערכים הגולמיים. אפשר לקבל אותם על ידי קריאה ל-EVIOCGABS
ioctl לכל ציר.
raw.*.min
- הערך המינימלי המקיף של הציר הגולמי.
raw.*.max
- הערך המקסימלי המקיף של הציר הגולמי.
raw.*.range
- שווה ערך ל-
raw.*.max - raw.*.min
. raw.*.fuzz
- הדיוק של הציר הגולמי. לדוגמה, fuzz = 1 מרמז שהערכים מדויקים בטווח של +/- יחידה אחת.
raw.width
- הרוחב הכולל של אזור המגע, שווה ל-
raw.x.range + 1
. raw.height
- הגובה הכולל של אזור המגע, שווה ל-
raw.y.range + 1
.
טווחי פלט
הביטויים הבאים מציינים את המאפיינים של מערכת הקואורדינטות של הפלט. המערכת משתמשת באינטרפולציה לינארית כדי לתרגם את המידע על מיקום המגע מיחידות פני השטח שבהן משתמש מכשיר המגע ליחידות הפלט שמדווחות לאפליקציות, כמו פיקסלים במסך.
output.width
- רוחב הפלט. במסכי מגע (משויכים למסך), זהו רוחב המסך בפיקסלים. במשטחי מגע (לא משויכים למסך), רוחב הפלט שווה ל-
raw.width
, כלומר לא מתבצעת אינטרפולציה. output.height
- גובה הפלט. במסכי מגע (משויכים למסך), זהו גובה המסך בפיקסלים. במשטחי מגע (לא משויכים למסך), גובה הפלט שווה ל-
raw.height
, כלומר לא מתבצעת אינטרפולציה. output.diag
- אורך האלכסון של מערכת הקואורדינטות של הפלט, שווה ל-
sqrt(output.width ^2 + output.height ^2)
.
הגדרה בסיסית
המיפוי של קלט המגע משתמש במאפייני תצורה רבים בקובץ התצורה של מכשיר הקלט כדי לציין ערכי כיול. בטבלה הבאה מתוארים כמה מאפייני תצורה לשימוש כללי. כל שאר המאפיינים מתוארים בקטעים הבאים, יחד עם השדות שבהם הם משמשים לכיול.
touch.deviceType
הגדרה: touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
מציין את סוג מכשיר המגע.
-
אם הערך הוא
touchScreen
, מכשיר המגע הוא מסך מגע שמשויך למסך. -
אם הערך הוא
touchPad
, מכשיר המגע הוא לוח מגע שלא משויך למסך. -
אם הערך הוא
pointer
, מכשיר המגע הוא משטח מגע שלא משויך למסך, והתנועות שלו משמשות לתנועות עכבר עקיפות עם מגע רב-משתמש. -
אם הערך הוא
default
, המערכת מזהה באופן אוטומטי את סוג המכשיר בהתאם לאלגוריתם הסיווג.
בקטע סיווג מוסבר בהרחבה איך סוג המכשיר משפיע על ההתנהגות של מכשיר המגע.
בגרסאות Android 3 וגרסאות קודמות, המערכת הניחה שכל מכשירי המגע הם מסכי מגע.
touch.orientationAware
הגדרה: touch.orientationAware
= 0
| 1
המדיניות קובעת אם מכשיר המגע יגיב לשינויים בכיוון המסך.
-
אם הערך הוא
1
, מיקומי המגע שמדווחים על ידי מכשיר המגע מסתובבים בכל פעם שכיוון המסך משתנה. -
אם הערך הוא
0
, מיקומי המגע שמדווחים על ידי מכשיר המגע לא מושפעים משינויים בכיוון המסך.
ערך ברירת המחדל הוא 1
אם המכשיר כולל מסך מגע, ו-0
במקרים אחרים.
המערכת מבדילה בין מסכים ומסכי מגע פנימיים לחיצוניים. מסך מגע פנימי עם תמיכה בזיהוי כיוון מסתובב בהתאם לכיוון המסך הפנימי. מסך מגע חיצוני עם תמיכה בזיהוי כיוון מסתובב בהתאם לכיוון של המסך החיצוני.
התכונה 'זיהוי כיוון' משמשת לתמיכה בסיבוב של מסכי מגע במכשירים כמו Nexus One. לדוגמה, כשמסובבים את המכשיר בכיוון השעון ב-90 מעלות מהכיוון הטבעי שלו, המיקומים המוחלטים של המגעים ממופים מחדש כך שמגע בפינה הימנית העליונה של מערכת הקואורדינטות המוחלטת של מסך המגע מדווח כמגע בפינה הימנית העליונה של מערכת הקואורדינטות המסובבת של המסך. הסיבה לכך היא שמערכת הפעלה מדווחת על נגיעות באמצעות אותה מערכת קואורדינטות שבה האפליקציות משתמשות כדי לצייר את הרכיבים החזותיים שלהן.
לפני Honeycomb, המערכת הניחה שכל מכשירי המגע מזהים את הכיוון.
touch.gestureMode
הגדרה: touch.gestureMode
= pointer
| spots
|
default
מציין את מצב המצגת לתנועות של מצביע. מאפיין התצורה הזה רלוונטי רק כשמכשיר המגע הוא מסוג pointer.
-
אם הערך הוא
pointer
, התנועות במשטח המגע יוצגו באמצעות סמן שדומה לסמן של העכבר. -
אם הערך הוא
spots
, תנועות משטח המגע מוצגות באמצעות עוגן שמייצג את מרכז הכובד של התנועה וקבוצה של נקודות עגולות שמייצגות את המיקום של האצבעות השונות.
ערך ברירת המחדל הוא pointer
כשמאפיין הקלט INPUT_PROP_SEMI_MT
מוגדר, או spots
במקרה אחר.
השדות X ו-Y
השדות X ו-Y מספקים מידע על המיקום של מרכז אזור המגע.
חישוב
החישוב פשוט: מידע על המיקום מהדרייבר של המגע מומר באופן לינארי למערכת הקואורדינטות של הפלט.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
השדות touchMajor, touchMinor, toolMajor, toolMinor ו-size
השדות touchMajor
ו-touchMinor
מתארים את המימדים המשוערים של אזור המגע ביחידות פלט (פיקסלים).
השדות toolMajor
ו-toolMinor
מתארים את המימדים המשוערים של הכלי עצמו ביחידות פלט (פיקסלים).
השדה size
מתאר את הגודל המנורמלי של המגע ביחס למגע הגדול ביותר האפשרי שמכשיר המגע יכול לזהות. הגודל המנורמלי הקטן ביותר הוא 0.0 (אין מגע או אי אפשר למדוד אותו), והגודל המנורמלי הגדול ביותר הוא 1.0 (אזור החיישן רווי).
אם אפשר למדוד גם את האורך וגם את הרוחב המשוערים, בשדה touchMajor
מציינים את המאפיין הארוך יותר, ובשדה touchMinor
מציינים את המאפיין הקצר יותר של אזור המגע. כשאפשר למדוד רק את הקוטר המשוער של אזור המגע, השדות touchMajor
ו-touchMinor
זהים.
באופן דומה, השדה toolMajor
מציין את המאפיין הארוך יותר, והשדה toolMinor
מציין את המאפיין הקצר יותר של שטח החתך של הכלי.
אם גודל המגע לא זמין אבל גודל הכלי זמין, גודל הכלי מוגדר כגודל המגע. לעומת זאת, אם גודל הכלי לא זמין אבל גודל המגע זמין, גודל המגע מוגדר כגודל הכלי.
מכשירים עם מסך מגע מודדים או מדווחים על גודל המגע ועל גודל הכלי בדרכים שונות. ההטמעה הנוכחית תומכת בשלושה סוגים שונים של מדידות: קוטר, שטח ותיבה מתארת גיאומטרית ביחידות משטח.
הגדרה: touch.size.calibration
= none
|
geometric
| diameter
| area
| default
מציין את סוג המדידה שבו משתמש מנהל ההתקן של המגע כדי לדווח על גודל המגע ועל גודל הכלי.
-
אם הערך הוא
none
, הגודל מוגדר לאפס. -
אם הערך הוא
geometric
, ההנחה היא שהגודל צוין באותה יחידת שטח כמו המיקום, ולכן הוא עבר שינוי קנה מידה באותו אופן. -
אם הערך הוא
diameter
, ההנחה היא שהגודל יחסי לקוטר (רוחב) של המגע או הכלי. -
אם הערך הוא
area
, ההנחה היא שהגודל יחסי לאזור של המגע או הכלי. -
אם הערך הוא
default
, המערכת משתמשת בתיקוןgeometric
אם הצירraw.touchMajor
אוraw.toolMajor
זמין, אחרת היא משתמשת בתיקוןnone
.
touch.size.scale
הגדרה: touch.size.scale
= <a non-negative floating point number>
גורם קבוע לקביעת קנה מידה שמשמש לבדיקת התאמה.
ערך ברירת המחדל הוא 1.0
.
touch.size.bias
הגדרה: touch.size.bias
= <a non-negative floating point number>
הערך הזה מציין ערך הטיה קבוע שמשמש בתהליך התאמת המכשיר.
ערך ברירת המחדל הוא 0.0
.
touch.size.isSummed
הגדרה: touch.size.isSummed
= 0
| 1
האפשרות הזו קובעת אם המערכת תדווח על הגודל כסכום של הגדלים של כל אנשי הקשר הפעילים, או שתדווח על כל איש קשר בנפרד.
-
אם הערך הוא
1
, הגודל המדווח מחולק במספר אנשי הקשר לפני השימוש. -
אם הערך הוא
0
, המערכת משתמשת בגודל שדווח כפי שהוא.
ערך ברירת המחדל הוא 0
.
חלק ממכשירי המגע, במיוחד מכשירים מסוג 'Semi-MT', לא יכולים להבדיל בין המאפיינים האישיים של כמה אנשי קשר, ולכן הם מדווחים על מדידת גודל שמייצגת את השטח הכולל או את הרוחב שלהם. צריך להגדיר את המאפיין הזה לערך 1
רק במכשירים כאלה. אם יש לכם ספק, אפשר להגדיר את הערך הזה כ-0
.
חישוב
החישוב של השדות touchMajor
, touchMinor
, toolMajor
, toolMinor
ו-size
תלוי בפרמטרים של כיול שצוינו.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
שדה לחץ
השדה pressure
מתאר את הלחץ הפיזי המשוער שמופעל על מכשיר המגע כערך מנורמלי בין 0.0 (ללא מגע) ל-1.0 (לחץ רגיל).
לחץ אפס מציין שהכלי מרחף.
touch.pressure.calibration
הגדרה: touch.pressure.calibration
= none
|
physical
| amplitude
| default
מציין את סוג המדידה שדרכו מנהל ההתקן של המגע מדווח על הלחץ.
-
אם הערך הוא
none
, הלחץ לא ידוע ולכן הוא מוגדר ל-1.0 במגע ול-0.0 במרחק. -
אם הערך הוא
physical
, ההנחה היא שציר הלחץ מודד את עוצמת הלחץ הפיזית בפועל שמופעלת על משטח המגע. -
אם הערך הוא
amplitude
, ההנחה היא שציר הלחץ מודד את האמפליטודה של האות, שקשורה לגודל המגע וללחץ שמוחל. -
אם הערך הוא
default
, המערכת משתמשת בתיקוןphysical
אם ציר הלחץ זמין, אחרת היא משתמשת ב-none
.
touch.pressure.scale
הגדרה: touch.pressure.scale
= <a non-negative floating point number>
גורם קבוע לקביעת קנה מידה שמשמש לבדיקת התאמה.
ערך ברירת המחדל הוא 1.0 / raw.pressure.max
.
חישוב
החישוב של השדה pressure
תלוי בפרמטרים של כיול שצוינו.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
שדות הכיוון וההטיה
השדה orientation
מתאר את הכיוון של המגע והכלי כמדידה זוויתית. כיוון של 0
מציין שהציר הראשי מוצג אנכית, כיוון של -PI/2
מציין שהציר הראשי מוצג בצד ימין, וכיוון של PI/2
מציין שהציר הראשי מוצג בצד שמאל. כשמשתמשים בסטיילוס, אפשר לתאר את טווח הכיוון בעיגול מלא מ--PI
או מ-PI
.
השדה tilt
מתאר את ההטיה של הכלי כמדידה זוויתית.
הטיה של 0
מציינת שהכלי ניצב למשטח.
הטיה של PI/2
מציינת שהכלי מונח ישר על המשטח.
touch.orientation.calibration
הגדרה: touch.orientation.calibration
= none
|
interpolated
| vector
| default
מציין את סוג המדידה שדרכו מנהל ההתקן של המגע מדווח על הכיוון.
- אם הערך הוא
none
, הכיוון לא ידוע ולכן הוא מוגדר כ-0. - אם הערך הוא
interpolated
, הכיוון מחושב באופן לינארי כך שערך גולמי שלraw.orientation.min
ממופה לערך-PI/2
וערך גולמי שלraw.orientation.max
ממופה לערךPI/2
. הערך המרכזי של(raw.orientation.min + raw.orientation.max) / 2
ממופה ל-0
. - אם הערך הוא
vector
, הכיוון מפורש כוקטור דחוס שמכיל שני שדות של 4 סיביות עם סימן. הייצוג הזה משמש בחלקים של Atmel Object Based Protocol. לאחר פענוח, הווקטור מניב זווית כיוון ועוצמת ביטחון. עוצמת האמון משמשת לשינוי קנה המידה של פרטי הגודל, אלא אם הם גיאומטרים. - אם הערך הוא
default
, המערכת משתמשת בתיקוןinterpolated
אם ציר הכיוון זמין, אחרת היא משתמשת ב-none
.
חישוב
החישוב של השדות orientation
ו-tilt
תלוי בפרמטרים של כיול שצוינו ובקלט הזמין.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
שדה המרחק
השדה distance
מתאר את המרחק בין הכלי לבין פני המכשיר המגעי. ערך של 0.0 מציין מגע ישיר, וערכים גדולים יותר מצביעים על מרחק הולך וגדל מהמשטח.
touch.distance.calibration
הגדרה: touch.distance.calibration
= none
|
scaled
| default
מציין את סוג המדידה שדרייבר המגע משתמש בו כדי לדווח על המרחק.
-
אם הערך הוא
none
, המרחק לא ידוע ולכן הוא מוגדר כ-0. -
אם הערך הוא
scaled
, המרחק המדווח מוכפל בגורם קבוע של שינוי קנה מידה. -
אם הערך הוא
default
, המערכת משתמשת בתיקוןscaled
אם ציר המרחק זמין, אחרת היא משתמשת ב-none
.
touch.distance.scale
הגדרה: touch.distance.scale
= <a non-negative floating point number>
גורם קבוע לקביעת קנה מידה שמשמש לבדיקת התאמה.
ערך ברירת המחדל הוא 1.0
.
חישוב
החישוב של השדה distance
תלוי בפרמטרים של התאמת ה-calibration שצוינו.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
דוגמה
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
הערות לגבי תאימות
מאפייני ההגדרה של מכשירים עם מסך מגע השתנו באופן משמעותי ב-Android Ice Cream Sandwich 4.0. צריך לעדכן את כל קובצי התצורה של מכשירי הקלט למכשירי מגע כך שישתמשו במאפייני התצורה החדשים.
יכול להיות שגם צריך לעדכן את מנהלי ההתקנים של מכשירים מגע ישנים יותר.
קובצי מפות מפתחות וירטואליים
אפשר להשתמש במכשירי מגע כדי להטמיע מקשים וירטואליים.
יש כמה דרכים לעשות זאת, בהתאם ליכולות של בקר המגע. אפשר להגדיר ישירות חלק ממכשירי הבקרה המגעיים כך שיטמיעו מקשי מגע על ידי הגדרת מרשם קושחת. במקרים אחרים, רצוי לבצע את המיפוי מקווי הרוחב והאורך של המגע לקודי מפתחות בתוכנה.
כשמפתחות וירטואליים מיושמים בתוכנה, הליבה צריכה לייצא קובץ של מפת מפתחות וירטואליים שנקרא virtualkeys.<devicename>
כנכס של לוח. לדוגמה, אם שם מנהלי ההתקנים של מסך המגע הוא 'touchyfeely', הנתיב של קובץ המיפוי של המפתחות הווירטואליים צריך להיות /sys/board_properties/virtualkeys.touchyfeely
.
קובץ מפת מפתחות וירטואליים מתאר את הקואורדינטות ואת קודי המפתחות של Linux של המפתחות הווירטואליים במסך המגע.
בנוסף לקובץ המיפוי של המקשים הווירטואליים, צריך להיות קובץ תואם של פריסת המקשים וקובץ של מפת תווים של מקשים כדי למפות את קודי המקשים של Linux לקודי המקשים של Android, ולציין את סוג מכשיר המקלדת (בדרך כלל SPECIAL_FUNCTION
).
תחביר
קובץ של מפת מפתחות וירטואליים הוא קובץ טקסט פשוט שמכיל רצף של תיאורים של פריסות של מפתחות וירטואליים, מופרדים על ידי שורות חדשות או נקודתיים.
שורות התגובה מתחילות ב-'#' וממשיכות עד לסוף השורה.
כל מפתח וירטואלי מתואר על ידי 6 רכיבים שממופרדים בפסיקים:
0x01
: קוד גרסה. תמיד חייב להיות0x01
.- <Linux key code>: קוד המפתח של Linux למפתח הווירטואלי.
- <centerX>: קואורדינטת X בפיקסלים של מרכז המפתח הווירטואלי.
- <centerY>: קואורדינטת הפיקסל Y של מרכז המקש הווירטואלי.
- <width>: רוחב המקש הווירטואלי בפיקסלים.
- <height>: הגובה של המקש הווירטואלי בפיקסלים.
כל הקואורדינטות והגדלים מצוינים ביחס למערכת הקואורדינטות של המסך.
זהו קובץ של מפת מפתחות וירטואלית, שבו כל המידע כתוב בשורה אחת.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
אפשר גם לכתוב את אותו קובץ של מפת מפתחות וירטואליים בכמה שורות.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
בדוגמה שלמעלה, רזולוציית מסך המגע היא 480x800. לכן, לכל המקשים הווירטואליים יש קואורדינטה של 835 ב-<centerY>, שנמצאת מעט מתחת לאזור הגלוי של מסך המגע.
למפתח הראשון יש קוד סריקה של Linux 158
(KEY_BACK
), centerX 55
, centerY 835
, width 90
ו-height 55
.
דוגמה
קובץ של מפת מפתחות וירטואלית: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
קובץ פריסת המפתחות: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
קובץ מפת תווים של מפתח: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
תנועות עקיפות של סמן עם מגע במספר נקודות
במצב של סמן, המערכת מפרשת את התנועות הבאות:
- הקשה עם אצבע אחת: לחיצה.
- תנועה של אצבע אחת: הזזת הסמן.
- תנועה של אצבע אחת וגם לחיצות על לחצנים: גוררים את הסמן.
- תנועה של שתי אצבעות, שתי האצבעות זזות באותו כיוון: גוררים את האזור שמתחת לסמן באותו כיוון. הסמן עצמו לא זז.
- תנועה של שתי אצבעות, כששתי האצבעות נעות זו לזו או זו מזו בכיוונים שונים: כדי להזיז/לשנות את קנה המידה/לסובב את האזור שמסביב לסמן. הסמן עצמו לא זז.
- תנועה בכמה אצבעות: תנועה בצורה חופשית.
דחייה של Palm
החל מגרסה 13 של Android, המערכת יכולה לדחות באופן אוטומטי קלט מהכפות כשהמסגרת המובנית מופעלת. עדיין יש תמיכה בפתרונות פנימיים בהתאמה אישית, אבל יכול להיות שיהיה צורך לשנות אותם כדי להחזיר את הדגל TOOL_TYPE_PALM
כשמזוהה כף יד. המסגרת המובנית פועלת גם בשילוב עם פתרונות בהתאמה אישית.
המודל בפועל בוחן את 90 המילישניות הראשונות של נתוני התנועות, את סמן העכבר הנוכחי ואת הסימנים שמסביב, ולאחר מכן מחשב את המרחק של הנגיעות מקצה המסך.
לאחר מכן, המערכת קובעת, לפי כל מצביע, אילו מהצביעים הם כפות ידיים. הוא גם מתייחס לגודל של כל איש קשר, כפי שמדווח על ידי touchMajor
ו-touchMinor
. לאחר מכן, מסגרת Android מסירה את הצבעים שמסומנים ככפות הידיים מזרם המגע.
אם כבר נשלח למכשיר הפניה לאפליקציות, המערכת:
- (אם יש עוד מצביעים פעילים) מבטל את המצביע עם ההגדרות
ACTION_POINTER_UP
ו-FLAG_CANCELED
. - (אם זהו הסמן היחיד) ביטול הסמן באמצעות
ACTION_CANCEL
.
ממשק API ציבורי, MotionEvent.FLAG_CANCELED
, מציין שהאירוע הנוכחי לא אמור להפעיל פעולה של משתמש. הדגל הזה מוגדר גם ל-ACTION_CANCEL
וגם ל-ACTION_POINTER_UP
.
אם לא שלחתם את האות של כף היד לאפליקציות, המערכת פשוט משחררת את האות.
הפעלת דחיית כף היד
- ב-touch driver, משתמשים ב-מאקרו
input_abs_set_res
כדי להגדיר את הרזולוציות לשדות הבאים (היחידה היא pixels per mm):ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
התמיכה ב-
ABS_MT_TOUCH_MINOR
היא אופציונלית. עם זאת, אם המכשיר תומך בכך, צריך לוודא שהרזולוציה מוגדרת בצורה נכונה. - כדי לוודא שהשדות מוגדרים בצורה נכונה, מריצים את הפקודה:
$ adb shell getevent -li
- כדי להפעיל את התכונה במהלך זמן הריצה, מריצים את:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- מפעילים מחדש את התהליך
system_server
.$ adb shell stop && adb shell start
- מוודאים שב-
adb shell dumpsys input
מוצגים רכיבי דחייה של כף היד בתוךUnwantedInteractionBlocker
. אם לא, בודקים את היומנים שקשורים לקלט כדי למצוא רמזים לגבי ההגדרה השגויה.דוגמה:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - כדי להפעיל את התכונה באופן קבוע, מוסיפים את הפקודה המתאימה של sysprop לקובץ
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1