מכשירי מגע

Android תומך במגוון מסכי מגע ומשטחי מגע, כולל טאבלטים עם מתקן דיגיטציה מבוסס-סטיילוס.

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

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

במכשירי מגע יכולים להיות לחצנים שהפונקציות שלהם דומות ללחצני עכבר.

לפעמים אפשר לבצע פעולות במכשירי מגע באמצעות מגוון כלים שונים, כמו אצבעות או עט, בהתאם לטכנולוגיה של חיישן המגע.

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

בגלל המגוון הגדול של מכשירי מגע, מערכת Android מסתמכת על מספר גדול של מאפייני תצורה כדי לתאר את המאפיינים ואת ההתנהגות הרצויה של כל מכשיר.

סיווג של מכשירי מגע

מכשיר קלט מסווג כמכשיר מגע רב-שכבתי אם מתקיימים שני התנאים הבאים:

  • מכשיר הקלט מדווח על נוכחות של הצירים המוחלטים ABS_MT_POSITION_X ו-ABS_MT_POSITION_Y.
  • במכשיר לקליטת נתונים אין לחצנים של בקר משחקים. התנאי הזה פותר אי בהירות לגבי לוחות משחקים מסוימים שמדווחים על צירים עם קודים שחופפים לאלה של הצירים MT.

מכשיר קלט מסווג כמכשיר מגע יחיד אם מתקיימים שני התנאים הבאים:

  • מכשיר הקלט לא מסווג כמכשיר עם מגע רב-שכבתי. מכשיר קלט מסווג כמכשיר מגע יחיד או כמכשיר מגע מרובה, אף פעם לא בשני הסוגים.
  • מכשיר הקלט מדווח על נוכחות הצירים המוחלטים ABS_X ו-ABS_Y ועל נוכחות קוד המפתח BTN_TOUCH.

כשמכשיר קלט מסווג כמכשיר מגע, נוכחות המפתחות הווירטואליים נקבעת על ידי ניסיון לטעון את קובץ המפה של המפתחות הווירטואליים של המכשיר. אם יש מפת מפתח וירטואלי זמינה, גם קובץ פריסת המפתחות של המכשיר נטען. מידע על המיקום והפורמט של הקבצים האלה זמין במאמר [קובצי מפות מפתחות וירטואליות](#virtual-key-map-files).

בשלב הבא המערכת טוענת את קובץ התצורה של מכשיר המגע.

לכל מכשירי המגע המובנים צריכים להיות קובצי תצורה של מכשירי קלט. אם אין קובץ תצורה של מכשיר הקלט, המערכת בוחרת תצורת ברירת מחדל שמתאימה למכשירי קצה מגע למטרות כלליות, כמו מסכי מגע או משטחי מגע חיצוניים מסוג USB או HID של Bluetooth. הגדרות ברירת המחדל האלה לא מיועדות למסכי מגע מובנים, והן עלולות לגרום להתנהגות שגויה.

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

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

הכללים הבאים משמשים לסיווג של מכשיר הקלט כמסך מגע, כמשטח מגע או כמכשיר צביעה.

  • אם המאפיין touch.deviceType מוגדר, סוג המכשיר מוגדר כפי שצוין.
  • אם המכשיר לקליטת נתונים מדווח על נוכחות מאפיין הקלט INPUT_PROP_DIRECT (באמצעות ה-ioctl EVIOCGPROP), סוג המכשיר מוגדר כמסך מגע. התנאי הזה מבוסס על ההנחה שמכשירי מגע עם קלט ישיר מחוברים למסך שמחובר גם כן.
  • אם מכשיר הקלט מדווח על נוכחות של מאפיין הקלט INPUT_PROP_POINTER (דרך ה-ioctl‏ EVIOCGPROP), סוג המכשיר מוגדר כ-pointer.
  • אם המכשיר לקליטת נתונים מדווח על נוכחות הצירים היחסיים REL_X או REL_Y, סוג המכשיר מוגדר כלוח מגע. התנאי הזה פותר את אי-הבהירות לגבי התקני קלט שכוללים גם עכבר וגם משטח מגע. במקרה כזה, משטח המגע לא משמש לשליטה בסמן כי העכבר כבר שולט בו.
  • אחרת, סוג המכשיר מוגדר כ-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.

כלים של העברת העכבר לעומת מגע

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

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

הפעלת מכשיר מגע

בהמשך מוצג סיכום קצר של פעולת מכשיר המגע ב-Android.

  1. EventHub קורא אירועים גולמיים מהדרייבר evdev.
  2. InputReader צורך את האירועים הגולמיים ומעדכן את המצב הפנימי לגבי המיקום והמאפיינים האחרים של כל כלי. הוא גם עוקב אחרי מצבי הלחצנים.
  3. אם לחצתם על BACK או על FORWARD או שחררתם אותם, InputReader מודיע ל-InputDispatcher על האירוע המרכזי.
  4. InputReader קובע אם הייתה הקשה על מקש וירטואלי. אם כן, הוא יעדכן את InputDispatcher לגבי האירוע המרכזי.
  5. InputReader קובע אם המגע בוצע בתוך גבולות המסך. אם כן, היא תשלח התראה ל-InputDispatcher על אירוע המגע.
  6. אם אין כלים למגע אבל יש לפחות כלי אחד להחזקה מעל, InputReader מודיע ל-InputDispatcher על אירוע ההחזקה מעל.
  7. אם סוג מכשיר המגע הוא pointer, InputReader מבצע זיהוי תנועות של סמן, מזיז את הסמן ומאתר בהתאם, ומעדכן את InputDispatcher על אירוע הסמן.
  8. האפליקציה 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 וגרסאות קודמות של Android, המערכת הניחה שכל המכשירים עם מסך מגע הם מסכי מגע.

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 תלוי בפרמטרים של כיול שצוינו.

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, באמצע 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.

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.

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

הפעלת דחיית כף היד

  1. ב-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 היא אופציונלית. עם זאת, אם המכשיר תומך בכך, חשוב לוודא שהרזולוציה מוגדרת בצורה נכונה.

  2. כדי לוודא שהשדות מוגדרים בצורה תקינה, מריצים את הפקודה:
        $ adb shell getevent -li
    
  3. כדי להפעיל את התכונה במהלך זמן הריצה, מריצים את:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. מפעילים מחדש את התהליך system_server.
         $ adb shell stop && adb shell start
        
  5. מוודאים שיש בדוח 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: {}
    
  6. כדי להפעיל את התכונה באופן קבוע, מוסיפים את הפקודה המתאימה של sysprop לקובץ init**rc:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

מקורות מידע נוספים