בסיס חוויית המשתמש ל-framework הפיזי

כל השיפורים במסגרת של Android שמבוססים על משוב מישוש מבוססים על קבוצה של עקרונות 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)
  • אישור
  • דחייה
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()‎
לפני 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
לפני 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectivesSupported()
  • 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
  • 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.

לחיצה ושחרור

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

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

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

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

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

גרירה והחלקה

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

תרחיש לדוגמה 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[] כדי ליצור את עקומת ההקלות, כפי שמוצג באיור 6.

רטט ארוך

איור 6. עקומה של רטט ארוך

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

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

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

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

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

Audio Couple

איור 7. דוגמה למשוב חזותי-חושני (haptic) של אודיו

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

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

  • משתמשים ב-classes‏ 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 של הרטט חייב ליישם תמיכה בשליטה חיצונית.

משוב חזותי משולב עם אודיו

איור 8. הטמעת משוב מישוש (haptics) שמקושר לאודיו

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

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

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

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

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

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

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

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

  2. עוצמת הנרמול לאריזת אות איטית

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

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

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

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

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

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

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

  4. תדירות הפינה של העיוות

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

  5. סף קלט וסף קוביה לעיוות

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

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

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

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

  6. שיפור פלט לצורך עיוות

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