כל השיפורים במסגרת של Android שמבוססים על משוב מישוש מבוססים על קבוצה של עקרונות 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 באיכות נמוכה אבל יעיל מבחינת צריכת האנרגיה שימש כתחליף לצלצול קולי במצב שקט. רכיבי החומרה הקודמים שמפיקים רעשים חזקים ולא נעימים עלולים לפגוע בחוויית המשתמש החזותית על ידי העברת חשיפות באיכות נמוכה (לדוגמה, טלפון זול ופגום).
מגע ברור
רטט ברור תומך בתחושה של שינויים מפורטים במצב (לדוגמה, שינויים בינאריים במהלך תהליך ההפעלה/השבתה). בגלל אופי הפריסה הנפרדת, תחושות מגע ברורות נוצרות כישות יחידה (לדוגמה, אפקט מגע אחד לכל אירוע קלט).
המטרה של 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
EFFECT_CLICK
EFFECT_DOUBLE_CLICK
EFFECT_HEAVY_CLICK
EFFECT_TICK
שיתוף הידע בין יצרני המכשירים למפתחים הוא המפתח לשיפור האיכות הכוללת של משוב הרטט בסביבת Android. תוכלו להיעזר ברשימת המשימות הבסיסית, בבדיקת החומרה ובCDD כדי לקבל מידע נוסף על הטמעת משוב מגע.
איור 3. לחיצה ושחרור.
משוב פיזי עשיר
רטט עשיר היא קטגוריה הולכת וגדלה של רטט, שמעבר לאפקטים חד-פעמיים שמבוססים על דחפים. Android שואף לתמוך בהפעלות מגע עשירות עם יכולת מודולציה רבה ורמת פירוט גבוהה. התרחישים הבאים נתמכים ב-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) שקל לזהות. עם זאת, רטט ארוך פתאומי עלול להפחיד משתמשים בסביבה שקטה, ולעיתים קרובות הוא יוצר רעשי זמזום. כדי ליצור רטט ארוך נעים יותר, אפשר להשתמש באפקט 'התחלה מדורגת' בתחילת הרטט הארוך. כך מתקבל מעבר חלק של האמפליטודה שמתקרב לאמפליטודה היעד.
החלת אפקט ההתחלה האיטית
בודקים את יכולות החומרה של בקרת האמפליטודה באמצעות
android.os.Vibrator.hasAmplitudeControl()
.- כדי ליצור אפקט של תחילת תנועה איטית עם עוצמה משתנה, התוצאה צריכה להיות
true
.
- כדי ליצור אפקט של תחילת תנועה איטית עם עוצמה משתנה, התוצאה צריכה להיות
משתמשים ב-
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.משנים את הסדרה של
timings[]
ו-amplitudes[]
כדי ליצור את עקומת ההאצה, כפי שמתואר באיור 6.
איור 6. עקומה של רטט ארוך
תרחיש לדוגמה 3: משוב פיזי שמותאם לאודיו
רטט שמותאם לאודיו הוא דפוסי רטט שמתאימים לריקוד של האודיו כדי למשוך את תשומת הלב של המשתמש.
משוב פיזי שמקושר לאודיו: יתרונות
כדי להטמיע משוב מישוש משולב אודיו, משלבים משוב מישוש ברור עם רטט ארוך. התחושות החזקות אך הקצרות של משוב מישוש (haptic) מאפשרות ליצור דפוסים מוזיקליים מובחנים. בשילוב עם רמות הגירוי הגבוהות שמתקבלות מהרטט הארוך, הדבר עוזר למשוך את תשומת הלב של המשתמש.
חשוב להביא בחשבון את התבניות הקצביות של התחושות. אם אין תחושה של קצב, המשתמש תופס את התחושות החזוניות כרטטורים אקראיים, ונוטה להתעלם מהן.
איור 7. דוגמה למשוב חזותי-חושני (haptic) של אודיו
משוב פיזי שמקושר לאודיו: טיפים להטמעה
כדי להטמיע משוב מישוש שמקושר לאודיו, צריך הבנה בסיסית של הפעלת תוכן בערוצי אודיו ובערוצי משוב מישוש. חשוב לזכור את הדברים הבאים.
משתמשים ב-classes
MediaPlayer
אוSoundPool
.- נכסים בפורמט OGG עם מפתח מטא-נתונים מיוחד (
ANDROID_HAPTIC
ואחריו מספר ערוצים של משוב חישתי) מציינים את נוכחות הנתונים של המשוב החישתי ואת ההפעלה באמצעותMediaPlayer
ו-SoundPool
.
- נכסים בפורמט OGG עם מפתח מטא-נתונים מיוחד (
מציינים את התמיכה בהפעלת אודיו וברטט ב-
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
- משתמשים בפרופיל פלט עם ערוץ משוב haptics
כדי להפעיל את הערוץ הרטטני, משנים את הערך של
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
ל-false
.- כברירת מחדל, ערוצי המשוב החזותי מושבתים (
true
). - תרחישים לדוגמה כוללים צלצולים וצליל ממשק משתמש עם משוב והחזקות סינכרוניות.
- כברירת מחדל, ערוצי המשוב החזותי מושבתים (
ה-HAL של הרטט חייב ליישם תמיכה בשליטה חיצונית.
- להטמעות HIDL, משתמשים ב-
setExternalControl(bool enabled) generates (Status status)
. - להטמעות של AIDL, משתמשים ב-
void setExternalControl(in boolean enabled)
.
- להטמעות HIDL, משתמשים ב-
איור 8. הטמעת משוב מישוש (haptics) שמקושר לאודיו
משוב פיזי שמקושר לאודיו: מחולל משוב פיזי
HapticGenerator
הוא אפקט אודיו שנוסף ל-Android 12. הוא יכול ליצור נתונים של משוב מישוש מערוץ אודיו ולהפעיל אותם בזמן אמת כמשוב מישוש שמקושר לאודיו.
האפקט מוחל על AudioTrack
כפי שמתואר באיור 9.
איור 9. הארכיטקטורה של ה-Haptic Generator
כדי לוודא שהאלגוריתם של הגנרטורים ההדמיים יוצר הדמיות איכותיות, צריך להתאים את אלגוריתם היצירה למנוע הרטט של המכשיר על ידי שינוי הפרמטרים שמגדירים את שרשרת המסננים שהוא מחיל על צורות הגל של האודיו. בקטע הזה מתוארים הפרמטרים האלה בפירוט, ומוסבר איך להתאים אותם למפרט החומרה.
תדר רטט למסנן מסוג band-pass
תדר התהודה של הרטט הוא התדר שבו למפעיל ההרטט יש תפוקה מקסימלית. הפרמטר הזה מתאים את האנטי-רזונטור כדי לשטח באופן חלקי את פונקציית העברת התגובה, כדי לקבל רוחב פס רחב יותר. מסגרת Android מקשרת באופן אוטומטי את הערך הזה לפלט של שיטת ה-HAL של הרטט
IVibrator.getResonantFrequency
.ערך ברירת המחדל של הפרמטר הזה הוא 150Hz. אפשר לשנות את זה בקוד כאן.
עוצמת הנרמול למעטפה איטית
הפרמטר הזה קובע את החזקה בתקינה חלקית (בקרת רווח אוטומטית). ערך ברירת המחדל שלו הוא -0.8, כלומר 80% מהשינויים בטווח הדינמי מוסרים בשלב הזה של בקרת הגבר. אפשר לשנות את זה בקוד כאן.
גורם Q למסנן סינון תדרים
גורם האיכות של הרטט (גורם Q) נקבע על סמך שני פרמטרים:
Zero Q, גורם האיכות של האפסים במסנן החסימה של התדרים, שמבטל באופן חלקי את התהודה.
ערך Q של הציר, גורם האיכות של הצירים במסנן החסימה של התדרים.
היחס בין שני הערכים האלה מגביל את הדחיקה של התהודה כדי להגביר תדרים נמוכים יותר ולהרחיב את תגובת האלגוריתם. לדוגמה, ערכי ברירת המחדל של 8 עבור Q של אפס ו-4 עבור Q של מוט יוצרים יחס של 2, שמגביל את דיכוי התהודה בפקטור 2 (6dB). מסגרת Android מקשרת את שני הערכים לפלט של שיטת ה-HAL של הרטט
IVibrator.getQFactor
.אם ערכי ברירת המחדל לא מביאים בחשבון את הקטנת עוצמת המנוע במכשיר, מומלץ לשנות את שני הערכים בו-זמנית, ולהגדיל או להקטין את שניהם. היחס בין Q של אפס ל-Q של ציר צריך להיות גדול מ-1. אפשר לשנות את זה בקוד כאן.
תדירות הפינה של העיוות
תדר הפינה מיושם באמצעות מסנן מסוג 'מסנן תדר נמוך', שמפחית את הרטט ברמה נמוכה ומשפר את הרמה הגבוהה יותר באמצעות עיוות חזק. ערך ברירת המחדל הוא 300Hz. אפשר לשנות את זה בקוד כאן.
שיפור קלט וסף קוביה לעיוות
הפרמטרים האלה משמשים מסנן עיוות לא לינארי שמוחל על צורת הגל של הקלט, כדי להפחית את האמפליטודה של אותות התדר הנמוך ולהגביר את האמפליטודה של אותות התדר הגבוה.
- ערך ברירת המחדל של מקדם הגברה הקלט הוא 0.3.
- ערך ברירת המחדל של הסף של הקוביה הוא 0.1.
מומלץ לשנות את שני הערכים יחד. אפשר למצוא אותם בקוד כאן.
מידע נוסף על הפונקציה שחלה על המסנן הזה זמין כאן. כדי לקבל מידע נוסף על האופן שבו שני הפרמטרים האלה משפיעים על הפלט, מומלץ להציג תרשים של תגובות התדר של המסננים ולראות איך תגובות התדר משתנות עם ערכי פרמטרים שונים.
שיפור פלט לצורך עיוות
הפרמטר הזה קובע את אמפליטודת הרטט הסופית. זהו הגברה סופית שחלה אחרי מגביל רך שמגביל את אמפליטודות הרטט לפחות מ-1. ערך ברירת המחדל שלו הוא 1.5, ואפשר לשנות אותו בקוד כאן. אם הרטט עדין מדי, צריך להגדיל את הערך. אם אתם שומעים רעש מרעידת החומרה של המפעיל, הורידו את הערך.