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

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

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

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

מטרת 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. לחיצה ושחרור.

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

תחושות מישוש עשירות הן קטגוריה מתפתחת של תחושות מישוש שחורגת מאפקטים שמבוססים על דחף יחיד. מערכת 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • הגברת עוצמת הקלט וסף הקוביה לעיוות

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

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

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

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

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

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

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

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