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

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

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

ב-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

ב-VibrationEffect:

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

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

לחיצה ושחרור

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

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

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

החלת אפקט ההתחלה האיטית

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

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

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

רטט ארוך

איור 5. עקומה של רטט ארוך עם תחילת רטט איטית.

תרחיש לדוגמה 3: משוב פיזי שמקושר לאודיו

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

משוב חזותי שמקושר לאודיו: יתרונות

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

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

Audio Couple

איור 6. דוגמה להפעלת משוב מישוש (haptics) עם אודיו.

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

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

  • משתמשים ב-classes‏ MediaPlayer או SoundPool.

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

    • משתמשים בפרופיל פלט עם ערוץ משוב haptics‏ 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. הטמעת משוב מישוש (haptic) שמקושר לאודיו.

משוב פיזי שמקושר לאודיו: HapticGenerator

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

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

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

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

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

  • תדר רטט למסנן מסוג band-pass

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

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

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

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

  • גורם Q למסנן סינון תדרים

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

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

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

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

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

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

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

  • שיפור קלט וסף קובייה לעיוות

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

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

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

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

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

  • שיפור פלט לצורך עיוות

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

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