כל השיפורים ב-Android framework שקשורים למשוב מישוש מבוססים על סדרה של עקרונות UX שמתפתחים באותו קצב. העקרונות הנוכחיים כוללים החלפה של רטט חזק במשוב פיזי ברור, ושימוש במשוב פיזי עשיר.
איור 1. העקרונות הנוכחיים.
בטבלה הבאה מפורטים כל ממשקי ה-API הזמינים של אפקטים מישושיים:
API | שיטות וקבועים | שנת ההוספה |
---|---|---|
android.view.HapticFeedbackConstants |
|
לפני 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.View |
|
לפני 2016 |
android.os.Vibrator |
|
לפני 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.os.VibrationEffect |
|
2017 (Android 8) |
|
2019 (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 (Android 11) |
android.media.AudioAttributes.Builder |
|
2019 (Android 10) |
רטט חזק
מאז הביפרים והטלפונים הניידים הפשוטים, נעשה שימוש ברטטים מבוססי-זמזם של מסה מסתובבת אקסצנטרית (ERM) שהם באיכות נמוכה אבל חסכוניים באנרגיה, כתחליף לצלצול ששומעים במצב שקט. רכיבי חומרה מדור קודם שמפיקים רעשים חזקים ולא נעימים עלולים לפגוע בחוויית המשתמש של המישוש על ידי יצירת רושם באיכות נמוכה (לדוגמה, טלפון זול או מקולקל).
הסרת המשוב הפיזי
תמיכה בתחושות מישוש ברורות מאפשרת להרגיש שינויים נפרדים במצב (לדוגמה, שינויים בינאריים במהלך תהליך ההפעלה והכיבוי). בגלל האופי של האפשרות discrete, נוצרות תחושות מישוש ברורות כישות אחת (לדוגמה, אפקט מישוש אחד לכל אירוע קלט).
מטרת Android היא לספק תחושות מישוש ברורות וחזקות, אבל חדות, ולא תחושות רוטטות או מטושטשות.
קבועים מוגדרים מראש של משוב הפטי שנוצרו כדי לתמוך במשוב הפטי ברור כוללים את הרכיבים הבאים.
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 לאמפליטודת היעד. רטט ארוך יכול ליצור תחושות מישוש מורגשות שמושכות את תשומת הלב. עם זאת, רטט ארוך ופתאומי עלול להבהיל משתמשים בסביבה שקטה, ולעתים קרובות הוא יוצר רעשי זמזום שנשמעים. כדי ליצור רטט ארוך נעים יותר, כדאי להחיל את אפקט ההאצה בתחילת הרטט הארוך. כך נוצר מעבר חלק בין עוצמות, שמתגבר בהדרגה עד לעוצמה הרצויה.
הוספת אפקט של האצה הדרגתית
בודקים את יכולות החומרה של בקרת עוצמת הקול באמצעות
android.os.Vibrator.hasAmplitudeControl()
.- התוצאה צריכה להיות
true
כדי ליצור אפקט של האצה הדרגתית עם אמפליטודה משתנה.
- התוצאה צריכה להיות
משתמשים ב-
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.משנים את סדרת הערכים של
timings[]
ו-amplitudes[]
כדי ליצור את עקומת ההאצה, כמו שמוצג באיור 5.
איור 5. עקומת האצה של רטט ארוך.
תרחיש שימוש 3: משוב פיזי שמשולב עם אודיו
תחושות מישוש שמשולבות עם אודיו הן דפוסי תחושות מישוש שמשולבים עם קצב האודיו כדי למשוך את תשומת הלב של המשתמש.
משוב הפטי שמשולב עם אודיו: יתרונות
כדי להטמיע רטט שמשולב עם אודיו, משלבים רטט ברור עם רטטים ארוכים. תחושות המישוש החזקות אך הקצרות שמתקבלות ממישוש ברור יוצרות דפוסים נפרדים וקצביים. בשילוב עם רמות גבוהות של גירויים שנוצרים מרטט ארוך, התכונה הזו מצליחה מאוד למשוך את תשומת הלב של המשתמש.
חשוב להתייחס לדפוסי התחושה הקצביים. אם אין תחושה של קצב, המשתמש תופס את התחושות ההפטיות כזמזומים אקראיים, ונוטה להתעלם מהן.
איור 6. דוגמה להעברת תחושה באמצעות רטט שמשולב עם אודיו.
משוב פיזי שמשולב עם אודיו: טיפים להטמעה
כדי להטמיע רטט שמשולב עם אודיו, צריך להבין את ההפעלה של תוכן בערוצי אודיו ורטט. חשוב לזכור:
משתמשים בכיתות
MediaPlayer
אוSoundPool
.- נכסים בפורמט OGG עם מפתח מטא-נתונים מיוחד (
ANDROID_HAPTIC
ואחריו מספר הערוצים של המשוב המישוש) מציינים את הנוכחות של נתוני משוב מישוש והפעלה עםMediaPlayer
ו-SoundPool
.
- נכסים בפורמט OGG עם מפתח מטא-נתונים מיוחד (
מציינים תמיכה במשוב פיזי ובהפעלת אודיו ב-
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 של הרטט צריך לתמוך בשליטה חיצונית.
- להטמעות של HIDL, משתמשים ב-
setExternalControl(bool enabled) generates (Status status)
. - להטמעות של AIDL, משתמשים ב-
void setExternalControl(in boolean enabled)
.
- להטמעות של HIDL, משתמשים ב-
איור 7. הטמעה של תחושות מישוש שמשולבות עם אודיו.
משוב פיזי שמשולב עם אודיו: HapticGenerator
HapticGenerator
הוא אפקט אודיו שהוצג ב-Android 12. הוא יכול ליצור נתונים הפטיים מערוץ אודיו ולהפעיל אותם בזמן אמת כתחושות הפטיות שמשולבות באודיו. האפקט מוחל על AudioTrack
כמו באיור 8:
איור 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, ואפשר לשנות אותו בקוד.
אם הרטט חלש מדי, מגדילים את הערך. אם שומעים רעש של רכיב המפעיל, צריך להקטין את הערך.