בסיס חוויית המשתמש למסגרת של משוב מישוש

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

עקרונות UX

איור 1. העקרונות הנוכחיים.

בטבלה הבאה מפורטים כל ממשקי ה-API הזמינים של אפקטים מישושיים:

API שיטות וקבועים שנת ההוספה
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
לפני 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
‫2017 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
‫2020 (Android 11)
android.View
  • performHapticFeedback()
לפני 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
לפני 2016
  • hasAmplitudeControl()
‫2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
‫2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
‫2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
‫2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
‫2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
‫2019 (Android 10)

רטט חזק

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

הסרת משוב הפטי

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

מטרת Android היא לספק תחושות מישוש ברורות וחזקות, אבל לא תחושות רוטטות או מטושטשות.

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

In HapticFeedbackConstants:

  • CLOCK_TICK
  • CONFIRM
  • CONTEXT_CLICK
  • GESTURE_END
  • GESTURE_START
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • KEYBOARD_TAP
  • LONG_PRESS
  • REJECT
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY
  • VIRTUAL_KEY_RELEASE

In VibrationEffect:

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

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

לחיצה ושחרור

איור 2. לחיצה ושחרור.

משוב פיזי עשיר

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

משוב פיזי עשיר

איור 3. משוב פיזי עשיר עם מרקם חלק.

גרירה והחלקה

איור 4. גרירה והחלקה.

תרחיש שימוש 1: החלקת מרקם

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

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

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

הטמעה של מרקם הפטי למשטח עבור מחוות החלקה וגרירה

שימוש ב-CLOCK_TICK וב-TEXT_HANDLE_MOVE ב-HapticFeedbackConstants. הקבועים האלה מגדירים מראש את המאפיינים של החזרה והאמפליטודה.

יצירת אפקט משלכם

כדי ליצור אפקט משלכם, יוצרים עיצוב על ידי שרשור רצפים של PRIMITIVE_CLICK ו-PRIMITIVE_TICK ב-VibrationEffect.Composition. אפשר לשנות את המאפיינים של החזרה ואת קנה המידה של האמפליטודה באמצעות addPrimitive(int primitiveID, float scale, int delay). התמיכה מבוססת על היכולת CAP_COMPOSE_EFFECTS של ממשק ה-HAL של הרטט.

תרחיש שימוש 2: רטט ארוך עם אפקט של התחלה חלקה

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

הוספת אפקט של האצה הדרגתית

  1. בודקים את יכולות החומרה של בקרת עוצמת הקול באמצעות android.os.Vibrator.hasAmplitudeControl().

    • התוצאה צריכה להיות true כדי ליצור אפקט של האצה הדרגתית עם אמפליטודה משתנה.
  2. משתמשים ב-VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).

  3. משנים את סדרת הערכים של timings[] ו-amplitudes[] כדי ליצור את עקומת ההאצה, כמו שמוצג באיור 5.

רטט ארוך

איור 5. עקומת רטט ארוכה עם האצה הדרגתית.

תרחיש שימוש 3: משוב פיזי שמשולב עם אודיו

משוב פיזי שמשולב עם אודיו הם דפוסי משוב פיזי שמשולבים עם קצב האודיו כדי למשוך את תשומת הלב של המשתמש.

משוב הפטי שמשולב באודיו: היתרונות

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

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

זוג אודיו

איור 6. דוגמה למשוב הפטי שמשולב עם אודיו.

משוב פיזי שמשולב עם אודיו: טיפים להטמעה

כדי להטמיע רטט שמשולב עם אודיו, צריך להבין איך מתבצעת השמעה של תוכן בערוצי אודיו ובערוצי רטט. חשוב לזכור:

  • אפשר להשתמש בכיתות MediaPlayer או SoundPool.

    • נכסים בפורמט OGG עם מפתח מטא-נתונים מיוחד (ANDROID_HAPTIC ואחריו מספר הערוצים של המשוב המישוש) מציינים את הנוכחות של נתוני משוב מישוש והפעלה עם MediaPlayer ו-SoundPool.
  • צריך לציין תמיכה במשוב פיזי ובהפעלת אודיו ב-audio_policy_configuration.xml.

    • שימוש בפרופיל פלט עם ערוץ משוב מישוש AUDIO_CHANNEL_OUT_HAPTIC_A|B.
    • במקרה של מקור פלט עם ערוצים הפטיים, חשוב לזכור שהערוצים ההפטיים מוצגים כערוצים נוספים בנתונים.

    דוגמה

    אם מסכת הערוצים של זרם הפלט נראית כך:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    כל דוגמה צריכה להיראות כך:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • כדי להפעיל את הערוץ של המשוב המישושי, משנים את AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) ל-false.

    • כברירת מחדל, הערוצים של משוב הפטי מושתקים (true).
    • תרחישי שימוש לדוגמה: צלצולים וצלילי ממשק משתמש עם תגובה משובצת ותגובה הפטית.
  • שכבת ה-HAL של הרטט חייבת לתמוך בשליטה חיצונית.

משוב הפטי שמשולב עם אודיו

איור 7. הטמעה של משוב פיזי שמשולב עם אודיו.

משוב פיזי שמשולב עם אודיו: HapticGenerator

HapticGenerator הוא אפקט אודיו שהוצג ב-Android 12. הוא יכול ליצור נתונים הפטיים מערוץ אודיו ולהפעיל אותם בזמן אמת כמשוב הפטי שמשולב באודיו. האפקט מוחל על AudioTrack כמו באיור 8:

ארכיטקטורה של Haptic Generator

איור 8. ארכיטקטורת Haptic Generator.

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

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

  • תדר תהודה למסנן פס

    תדר התהודה של המנגנון ליצירת רטט הוא התדר שבו למפעיל הפטי יש תפוקה מקסימלית. הפרמטר הזה משנה את ההתנגדות של הרכיב נגד התהודה כדי לשטח חלקית את פונקציית ההעברה של התגובה, וכך להרחיב את רוחב הפס. מסגרת Android מקשרת באופן אוטומטי את הערך הזה לפלט של שיטת ה-Vibrator HAL‏ IVibrator.getResonantFrequency.

    ערך ברירת המחדל של הפרמטר הזה הוא 150 Hz. אפשר לשנות את הערך הזה בקוד.

  • עוצמת הנרמול למעטפה איטית

    הפרמטר הזה קובע את המעריך בנורמליזציה החלקית (בקרת עוצמת קול אוטומטית). ערך ברירת המחדל שלו הוא ‎-0.8, כלומר 80% מהשינוי בטווח הדינמי מוסר על ידי שלב בקרת ההגברה הזה. אפשר לשנות את זה בקוד.

  • גורם Q למסנן פס חסימה

    גורם האיכות של הרטט (גורם Q) נקבע לפי שני פרמטרים:

    • ה-Zero Q, גורם האיכות של האפסים בפילטר band-stop שמבטל חלקית את התהודה

    • Pole Q, גורם האיכות של הקטבים במסנן פס החסימה

    היחס בין שני הערכים האלה מגביל את דיכוי התהודה כדי להגביר תדרים נמוכים ולהרחיב את התגובה של האלגוריתם. לדוגמה, ערכי ברירת המחדל של 8 עבור Zero Q ושל 4 עבור Pole Q יוצרים יחס של 2, שמגביל את דיכוי התהודה בפקטור של 2 (6 dB). מסגרת Android מקשרת בין שני הערכים לפלט של שיטת Vibrator HAL‏ IVibrator.getQFactor.

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

  • תדירות הפינה לעיוות

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

  • הגברת עוצמת האות בכניסה וסף עוצמת האות בכניסה להגברה של עיוותים

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

    • ערך ברירת המחדל של גורם ההגברה של הקלט הוא 0.3.
    • ערך ברירת המחדל של סף הקובייה הוא 0.1.

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

    מידע נוסף על הפונקציה שמוחלת על ידי המסנן הזה זמין בהטמעה בקוד.

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

  • הגברת הפלט לעיוות

    הפרמטר הזה קובע את אמפליטודת הרטט הסופית. זהו רווח סופי שמוחל אחרי מגביל רך שמגביל את אמפליטודות הרטט לפחות מ-1. ערך ברירת המחדל הוא 1.5, ואפשר לשנות אותו בקוד.

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