אנדרואיד תומכת במגוון מסכי מגע ומשטחי מגע, כולל טאבלטים דיגיטליים מבוססי סטיילוס.
מסכי מגע הם מכשירי מגע המשויכים לתצוגה כך שלמשתמש יש רושם של מניפולציה ישירה של פריטים על המסך.
משטחי מגע הם מכשירי מגע שאינם משויכים לתצוגה, כגון טאבלט דיגיטלי. משטחי מגע משמשים בדרך כלל להצבעה או למיקום עקיף מוחלט או שליטה מבוססת מחוות של ממשק משתמש.
למכשירי מגע יכולים להיות כפתורים שתפקודיהם דומים ללחצני עכבר.
לפעמים ניתן לתפעל מכשירי מגע באמצעות מגוון כלים שונים כגון אצבעות או עט, בהתאם לטכנולוגיית חיישן המגע הבסיסית.
מכשירי מגע משמשים לפעמים ליישום מפתחות וירטואליים. לדוגמה, בחלק ממכשירי אנדרואיד, אזור החיישן של מסך המגע משתרע מעבר לקצה התצוגה ומשמש כחלק מלוח מקשים רגיש למגע.
בשל המגוון הגדול של מכשירי המגע, אנדרואיד מסתמכת על מספר רב של מאפייני תצורה כדי לתאר את המאפיינים וההתנהגות הרצויה של כל מכשיר.
גע בסיווג מכשיר
התקן קלט מסווג כהתקן רב-מגע אם מתקיימים שני התנאים הבאים:
- התקן הקלט מדווח על נוכחותם של הצירים המוחלטים
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
(דרךEVIOCGPROP
ioctl), אז סוג ההתקן מוגדר למסך מגע . מצב זה מניח שהתקני מגע קלט ישיר מחוברים לצג המחובר גם הוא. - אם התקן הקלט מדווח על נוכחות מאפיין הקלט
INPUT_PROP_POINTER
(דרךEVIOCGPROP
ioctl), אז סוג ההתקן שהוגדר למצביע . - אם התקן הקלט מדווח על נוכחות של הצירים היחסיים
REL_X
אוREL_Y
, אז סוג ההתקן מוגדר למשטח המגע . מצב זה פותר אי בהירות עבור התקני קלט המורכבים מעכבר ומשטח מגע כאחד. במקרה זה, משטח המגע אינו משמש לשליטה במצביע מכיוון שהעכבר כבר שולט בו. - אחרת, סוג ההתקן מוגדר למצביע . ברירת מחדל זו מבטיחה שמשטחי מגע שלא סומנו למטרה מיוחדת אחרת שולטים במצביע.
כפתורים
לחצנים הם פקדים אופציונליים שבהם יישומים יכולים להשתמש כדי לבצע פונקציות נוספות. כפתורים במכשירי מגע מתנהגים בדומה ללחצני עכבר והם משמשים בעיקר עם מכשירי מגע מסוג מצביע או עם סטיילוס.
הלחצנים הבאים נתמכים:
-
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
.
כלים וסוגי כלים
כלי הוא אצבע, חרט או מכשיר אחר המשמש לאינטראקציה עם מכשיר המגע. מכשירי מגע מסוימים יכולים להבחין בין סוגים שונים של כלים.
במקומות אחרים באנדרואיד, כמו ב- MotionEvent
API, כלי מכונה לעתים קרובות מצביע .
סוגי הכלים הבאים נתמכים:
-
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
כדי לציין שהכלי נמצא רק בטווח ומרחף. - התקני מגע בודד משתמשים באירועי הקלט הבאים של לינוקס:
-
ABS_X
: (נדרש) מדווח על קואורדינטת ה-X של הכלי. -
ABS_Y
: (REQUIRED) מדווח על קואורדינטת ה-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_DOUBLETAP
BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_TRIPLETAP
BTN_TOOL_QUADTAP
:( אופציונלי) מדווח על סוג הכלי .
-
- התקני ריבוי מגע משתמשים באירועי הקלט הבאים של לינוקס:
-
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 multi-touch לפרטים נוספים. -
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_DOUBLETAP
BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,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
צריכים להיות לא אפס כאשר הכלי נוגע במכשיר ואפס אחרת, אך זה לא נדרש. לדוגמה, ייתכן שמכשיר המגע יוכל למדוד את גודלם של אנשי קשר למגע אצבע אך לא למגע עם עט.מידע על גודל הדיווח הוא אופציונלי אך מומלץ בחום. אפליקציות יכולות להשתמש במידע לחץ כדי ליישם ציור רגיש לגודל ואפקטים אחרים.
הערכים שדווחו על ידי
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
צריך להיות לפחות מידע על אופי הכלי, בין אם הוא נוגע או לפחות סוג הכלי שלו. אם אין מידע זמין, ההנחה היא שהכלי אינו פעיל (מחוץ לטווח).- בעת שימוש בפרוטוקול multi-touch 'A', הכלי פעיל בכל פעם שהוא מופיע בדוח הסנכרון האחרון. כאשר הכלי מפסיק להופיע בדוחות סנכרון, הוא מפסיק להתקיים.
- בעת שימוש בפרוטוקול רב-מגע 'B', הכלי פעיל כל עוד יש לו חריץ פעיל. כשהחריץ התפנה, הכלי מפסיק להתקיים.
- נקבע שכלי מרחף בהתבסס על התנאים הבאים:
- אם הכלי הוא
BTN_TOOL_MOUSE
אוBTN_TOOL_LENS
, אז הכלי אינו מרחף, גם אם אחד מהתנאים הבאים מתקיים. - אם הכלי פעיל והנהג מדווח על מידע לחץ, והלחץ המדווח הוא אפס, אז הכלי מרחף.
- אם הכלי פעיל והנהג תומך בקוד מפתח
BTN_TOUCH
ול-BTN_TOUCH
יש ערך של אפס, אז הכלי מרחף.
- אם הכלי הוא
-
InputReader
תומך גם בפרוטוקול ריבוי מגע 'A' וגם 'B'. מנהלי התקנים חדשים צריכים להשתמש בפרוטוקול 'B' אבל אחד מהם עובד. החל מ-Android 4.0, ייתכן שיהיה צורך לשנות מנהלי התקנים של מסך מגע כדי לעמוד במפרט פרוטוקול הקלט של לינוקס.
ייתכן שיידרשו השינויים הבאים:
כאשר כלי אינו פעיל (האצבע עולה "מעלה"), הוא אמור להפסיק להופיע בדוחות סנכרון מרובה-מגע הבאים. כאשר כל הכלים הופכים ללא פעילים (כל האצבעות עולות "מעלה"), מנהל ההתקן צריך לשלוח חבילת דוח סנכרון ריקה, כגון
SYN_MT_REPORT
ואחריוSYN_REPORT
.גרסאות קודמות של אנדרואיד ציפו שאירועי "עלייה" ידווחו על ידי שליחת ערך לחץ של 0. ההתנהגות הישנה לא הייתה תואמת את מפרט פרוטוקול הקלט של לינוקס ואינה נתמכת עוד.
יש לדווח מידע על לחץ פיזי או חוזק האות באמצעות
ABS_MT_PRESSURE
.גרסאות קודמות של אנדרואיד אוחזרו מידע לחץ מ-
ABS_MT_TOUCH_MAJOR
. ההתנהגות הישנה לא הייתה תואמת למפרט פרוטוקול הקלט של לינוקס ואינה נתמכת עוד.- יש לדווח על פרטי גודל המגע באמצעות
ABS_MT_TOUCH_MAJOR
.גרסאות קודמות של Android אוחזרו מידע על גודל מ-
ABS_MT_TOOL_MAJOR
. ההתנהגות הישנה לא הייתה תואמת למפרט פרוטוקול הקלט של לינוקס ואינה נתמכת עוד.
תפעול מכשיר מגע
להלן סיכום קצר של פעולת מכשיר המגע באנדרואיד.
-
EventHub
קורא אירועים גולמיים ממנהל ההתקןevdev
. -
InputReader
צורך את האירועים הגולמיים ומעדכן מצב פנימי לגבי המיקום ומאפיינים אחרים של כל כלי. זה גם עוקב אחר מצבי כפתורים. - אם BACK או FORWARD נלחץ או שוחרר,
InputReader
מודיעInputDispatcher
על אירוע המפתח. -
InputReader
קובע אם התרחשה לחיצת מקש וירטואלית. אם כן, הוא מודיעInputDispatcher
על אירוע המפתח. -
InputReader
קובע אם המגע הופעל בתוך גבולות התצוגה. אם כן, הוא מודיעInputDispatcher
על אירוע המגע. - אם אין כלים לגעת אבל יש לפחות כלי ריחוף אחד,
InputReader
מודיעInputDispatcher
על אירוע הריחוף. - אם סוג התקן המגע הוא מצביע ,
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
, המערכת מזהה אוטומטית את סוג המכשיר בהתאם לאלגוריתם הסיווג.
עיין בסעיף סיווג לפרטים נוספים על האופן שבו סוג המכשיר משפיע על התנהגות מכשיר המגע.
באנדרואיד 3 ומטה, ההנחה הייתה שכל מכשירי המגע הם מסכי מגע.
touch.orientationAware
הגדרה: touch.orientationAware
= 0
| 1
מציין אם מכשיר המגע צריך להגיב לשינויי כיוון התצוגה.
אם הערך הוא
1
, מיקומי המגע המדווחים על ידי התקן המגע מסובבים בכל פעם שכיוון התצוגה משתנה.אם הערך הוא
0
, עמדות המגע המדווחות על ידי מכשיר המגע חסינות בפני שינויים בכיוון התצוגה.
ערך ברירת המחדל הוא 1
אם המכשיר הוא מסך מגע, 0
אחרת.
המערכת מבחינה בין מסכי ותצוגות מגע פנימיים וחיצוניים. מסך מגע פנימי המודע לכיוון מסובב על סמך כיוון התצוגה הפנימית. מסך מגע חיצוני המודע לכיוון מסובב על סמך כיוון התצוגה החיצונית.
מודעות להתמצאות משמשת לתמיכה בסיבוב של מסכי מגע במכשירים כמו Nexus One. לדוגמה, כאשר המכשיר מסובב עם כיוון השעון 90 מעלות מהכיוון הטבעי שלו, המיקומים המוחלטים של הנגיעות מסופים מחדש כך שמגע בפינה השמאלית העליונה של מערכת הקואורדינטות המוחלטת של מסך המגע מדווח כמגע בפינה השמאלית העליונה בפינה של מערכת הקואורדינטות המסובבת של התצוגה. זה נעשה כך שנגיעות מדווחות עם אותה מערכת קואורדינטות שבה משתמשים אפליקציות כדי לצייר את האלמנטים החזותיים שלהן.
לפני כוורת, כל מכשירי המגע היו מודעים להתמצאות.
touch.gestureMode
הגדרה: touch.gestureMode
= pointer
| spots
| default
מציין את מצב המצגת עבור מחוות מצביע. מאפיין תצורה זה רלוונטי רק כאשר התקן המגע הוא מסוג מצביע .
אם הערך הוא
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, שדות גודל
השדות 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
= <מספר נקודה צפה לא שלילי>
מציין גורם קנה מידה קבוע המשמש בכיול.
ערך ברירת המחדל הוא 1.0
.
מגע.הטיה.גודל
הגדרה: touch.size.bias
= <מספר נקודה צפה לא שלילי>
מציין ערך הטיה קבוע בשימוש בכיול.
ערך ברירת המחדל הוא 0.0
.
touch.size.isSummed
הגדרה: touch.size.isSummed
= 0
| 1
מציין אם הגודל מדווח כסכום הגדלים של כל אנשי הקשר הפעילים, או מדווח בנפרד עבור כל איש קשר.
אם הערך הוא
1
, הגודל המדווח מחולק במספר אנשי הקשר לפני השימוש.אם הערך הוא
0
, הגודל המדווח משמש כפי שהוא.
ערך ברירת המחדל הוא 0
.
מכשירי מגע מסוימים, במיוחד מכשירי "חצי-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
= none
| physical
| amplitude
| default
מציין את סוג המדידה המשמש את נהג המגע כדי לדווח על הלחץ.
אם הערך הוא
none
, הלחץ אינו ידוע ולכן הוא מוגדר ל-1.0 בעת נגיעה ו-0.0 בעת ריחוף.אם הערך הוא
physical
, ההנחה היא שציר הלחץ מודד את העוצמה הפיזית בפועל של הלחץ המופעל על משטח המגע.אם הערך הוא
amplitude
, מניחים שציר הלחץ מודד את משרעת האות, הקשורה לגודל המגע וללחץ המופעל.אם הערך הוא
default
, המערכת משתמשת בכיולphysical
אם ציר הלחץ זמין, אחרת משתמשתnone
.
סולם.לחץ.מגע
הגדרה: touch.pressure.scale
= <מספר נקודה צפה לא שלילי>
מציין גורם קנה מידה קבוע המשמש בכיול.
ערך ברירת המחדל הוא 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. כאשר הוא מפוענח, הווקטור מניב זווית אוריינטציה ועוצמת ביטחון. גודל הביטחון משמש לקנה מידה של מידע הגודל, אלא אם כן הוא גיאומטרי. - אם הערך הוא
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.Callibration
הגדרה: touch.distance.calibration
= none
| scaled
| default
מציין את סוג המדידה המשמש את מנהל התקן המגע כדי לדווח על המרחק.
אם הערך
none
, המרחק אינו ידוע ולכן הוא מוגדר ל- 0.אם הערך
scaled
, המרחק המדווח מוכפל על ידי גורם בקנה מידה קבוע.אם הערך הוא
default
, המערכת משתמשת בכיולscaled
אם ציר המרחק זמין, אחרת לא משתמשnone
.
touch.distance.scale
הגדרה: touch.distance.scale
= <a מספר נקודה צפה לא שלילית>
מציין גורם בקנה מידה קבוע המשמש בכיול.
ערך ברירת המחדל הוא 1.0
.
תַחשִׁיב
חישוב שדה distance
תלוי בפרמטרי הכיול שצוינו.
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
הערות תאימות
מאפייני התצורה של מכשירי מגע השתנו באופן משמעותי בסנדוויץ 'גלידת אנדרואיד 4.0. יש לעדכן את כל קבצי התצורה של מכשירי הקלט עבור התקני מגע כדי להשתמש במאפייני התצורה החדשים.
יתכן שיהיה צורך לעדכן מנהלי התקני מגע ישנים יותר.
קבצי מפת מפתח וירטואליים
מכשירי מגע משמשים לרוב ליישום מפתחות וירטואליים.
ישנן מספר דרכים לעשות זאת, תלוי ביכולותיו של בקר המגע. ניתן להגדיר ישירות את בקרי המגע ליישום מקשים רכים על ידי הגדרת רישומי קושחה. בפעמים אחרות רצוי לבצע את המיפוי מקואורדינטות מגע לקודי מפתח בתוכנה.
כאשר מיושמים מפתחות וירטואליים בתוכנה, על הגרעין לייצא קובץ מפת מפתחות וירטואלי הנקרא virtualkeys.<devicename>
כנכס לוח. לדוגמה, אם מנהלי התקני מסך המגע מדווחים על שמו כ"טעם ", אז קובץ מפת המפתח הווירטואלי חייב להיות על Path /sys/board_properties/virtualkeys.touchyfeely
.
קובץ מפת מפתח וירטואלי מתאר את הקואורדינטות ואת קודי המפתח של לינוקס של מפתחות וירטואליים במסך המגע.
בנוסף לקובץ מפת המפתח הווירטואלי, חייב להיות קובץ פריסת מקשים מתאים וקובץ מפת תווים מקשים כדי למפות את קודי המפתח לינוקס לקודי מקש אנדרואיד וכדי לציין את סוג התקן המקלדת (בדרך כלל SPECIAL_FUNCTION
).
תחביר
קובץ מפת מפתח וירטואלי הוא קובץ טקסט רגיל המורכב מרצף של תיאורי פריסת מפתח וירטואליים מופרדים על ידי NewLines או על ידי קולונים.
שורות התגובה מתחילות ב'-#'והמשיכו לסוף השורה.
כל מפתח וירטואלי מתואר על ידי 6 רכיבים המופעלים במעי הגס:
-
0x01
: קוד גרסה. חייב להיות תמיד0x01
. - <קוד מפתח לינוקס>: קוד המפתח לינוקס של המפתח הווירטואלי.
- <centerx>: קואורדינטת פיקסל X של מרכז המפתח הווירטואלי.
- <netery>: קואורדינטת ה- Y Pixel של מרכז המפתח הווירטואלי.
- <רוחב>: רוחב המפתח הווירטואלי בפיקסלים.
- <גובה>: גובה המפתח הווירטואלי בפיקסלים.
כל הקואורדינטות והגדלים מוגדרים מבחינת מערכת קואורדינטות התצוגה.
להלן קובץ מפת מקשים וירטואלי שנכתב כולם בשורה אחת.
# 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. בהתאם לכך, לכל המפתחות הווירטואליים יש קואורדינטת <nentery> של 835, שנמצאת מעט מתחת לאזור הנראה של מסך המגע.
במפתח הראשון יש קוד סריקה של לינוקס של 158
( KEY_BACK
), Centerx של 55
, מרכז 835
, רוחב 90
וגובה 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
/keylayout/touchyfeely.kl.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
קובץ מפת תווים מפתח: /system/usr/keychars/touchyfeely.kcm
/keychars/touchyfeely.kcm.
type SPECIAL_FUNCTION
מחוות מצביע מרובות מגע עקיפות
במצב מצביע המערכת מפרשת את המחוות הבאות:
- ברז על אצבע יחידה: לחץ על.
- תנועת אצבעות יחידה: הזז את המצביע.
- לחצן תנועת אצבע יחידה בלחץ: גרור את המצביע.
- שתי תנועת אצבעות שתי האצבעות נעות באותו כיוון: גרור את האזור מתחת למצביע בכיוון זה. המצביע עצמו לא זז.
- שתי תנועת אצבעות שתי האצבעות הנעות זו לזו או זו מזו בכיוונים שונים: מחבת/קנה מידה/סובבו את האזור המקיף את המצביע. המצביע עצמו לא זז.
- תנועת אצבעות מרובה: מחוות צורה חופשית.
דחיית דקלים
נכון לאנדרואיד 13, המערכת יכולה לדחות אוטומטית תשומות מכפות הידיים כאשר המסגרת המובנית מופעלת. פתרונות פנימיים, שנבנו בהתאמה אישית, עדיין נתמכים, אם כי יתכן שיהיה צורך לשנות אותם כדי להחזיר את הדגל TOOL_TYPE_PALM
כאשר מתגלה כף יד. המסגרת המובנית פועלת גם בשילוב עם פתרונות מותאמים אישית.
הדגם בפועל בוחן את 90 השניות הראשונות של נתוני המחווה, במצביע הנוכחי ובצביעות הסובבות, ואז שוקל כמה רחוק מקצה התצוגה הנגיעות. לאחר מכן הוא קובע, על בסיס מצביע, מי מהמצביעים הם כפות הידיים. זה גם לוקח בחשבון את גודל כל איש קשר, כפי שדווח על ידי touchMajor
ו- touchMinor
. מסגרת אנדרואיד מסלקת אז את המצביעים המסומנים ככפות ידיים מזרם המגע.
אם מצביע כבר נשלח לאפליקציות, אז המערכת:
- (אם ישנן מצביעים פעילים אחרים) מבטל את המצביע עם
ACTION_POINTER_UP
ו-FLAG_CANCELED
Set. - (אם זה המצביע היחיד) מבטל את המצביע עם
ACTION_CANCEL
.
ממשק API ציבורי, MotionEvent.FLAG_CANCELED
, מציין כי האירוע הנוכחי לא אמור להפעיל פעולת משתמש. דגל זה מוגדר הן עבור ACTION_CANCEL
והן ACTION_POINTER_UP
.
אם מצביע הדקל לא נשלח לאפליקציות, המערכת פשוט מפילה את המצביע.
אפשר דחיית כף היד
- במנהל התקן המגע שלך, השתמש במאקרו
input_abs_set_res
כדי להגדיר את הרזולוציות עבור השדות הבאים (יחידות הן פיקסלים למ"מ ):-
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