רכיבי האקטואטור הנפוצים ביותר ליצירת רטט במכשירי Android הם רכיבי אקטואטור לינאריים בתהודה (LRA). רכיבי LRA מדמים את התחושה של לחיצה על לחצן במשטח זכוכית שלא מגיב. בדרך כלל, אות משוב ברור ותקיף של קליקים נמשך בין 10 ל-20 אלפיות שנייה. כך האינטראקציות של המשתמשים נראות טבעיות יותר. במקלדות וירטואליות, משוב הקליקים יכול להגדיל את מהירות ההקלדה ולצמצם את מספר השגיאות.
ל-LRA יש כמה תדרי תהודה נפוצים:
- לחלק מה-LRA היו תדרי תהודה בטווח של 200 עד 300 Hz, שתואמים לתדר שבו העור האנושי רגיש ביותר לתנודות. בדרך כלל, התחושה של הרטט בטווח התדרים הזה מתוארת כחלקה, חדה וחודרת.
- לדגמים אחרים של רמקול נייד יש תדרי תהודה נמוכים יותר, בסביבות 150 Hz. התחושה איכותית יותר, רכה יותר ומלאה יותר (במימד).
אם מתקבל אותו מתח קלט בשתי תדרים שונים, יכול להיות שהאמפליטודות של תפוקת הרטט יהיו שונות. ככל שהתדר רחוק יותר מתדר התהודה של ה-LRA, כך אמפליטודת הרטט שלו נמוכה יותר.
האפקטים ההדדיים של מכשיר נתון משתמשים גם במפעיל הרטט וגם בדרייבר שלו. מנהלי התקנים של משוב מגע שכוללים תכונות של מצב אוברדרייב ותכונות של בלימה פעילה יכולים לצמצם את זמן העלייה ואת הצלצול של רכיבי LRA, וכך להוביל לרטט מהיר וברור יותר.
האצת הפלט של הרטט
המיפוי של תדירות לתאוצה בפלט (FOAM) מתאר את תאוצת הפלט המקסימלית שניתן להשיג (ב-G שיא) בתדירות רטט נתונה (בהרץ). החל מגרסה Android 16 (רמת API 36), הפלטפורמה מספקת תמיכה מובנית במיפוי הזה באמצעות VibratorFrequencyProfile
. אפשר להשתמש בכיתה הזו, יחד עם ממשקי ה-API של המעטפות הבסיסיים והמתקדמים, כדי ליצור אפקטים של משוב מישוש.
לרוב המנועים מסוג LRA יש שיא יחיד ב-FOAM, בדרך כלל ליד תדר התהודה שלהם. בדרך כלל, ההאצה פוחתת באופן אקספוננציאלי ככל שהתדר חורג מהטווח הזה. העקומה עשויה להיות לא סימטרית, ויכול להיות שתופיע בה פסגה סביב תדר התהודה כדי להגן על המנוע מפני נזק.
בתרשים שלצידו מוצגת דוגמה ל-FOAM למנוע LRA.
סף לזיהוי על ידי אדם
סף הגילוי של תפיסת האדם מתייחס לתאוצה המינימלית של רטט שאדם יכול לזהות באופן מהימן. רמת הרטט משתנה בהתאם לתדירות הרטט.
בתרשים שלצידו מוצג סף הזיהוי של תפיסת המגע האנושית, בתאוצה, כפונקציה של תדירות זמנית. נתוני הסף הופכים מסף ההזזה שמוצג באיור 1 במאמר של Bolanowski Jr., S. J., et al.'s 1988 article, "Four channels mediate the mechanical aspects of touch.".
Android מטפלת באופן אוטומטי בערך הסף הזה ב-BasicEnvelopeBuilder
, ומאמתת שכל האפקטים משתמשים בטווח תדרים שמייצר אמפליטודות של רטט שעולות על ערך הסף לזיהוי בתפיסה האנושית ב-10 dB לפחות.
במדריך באינטרנט מוסבר בהרחבה על ההמרה בין אמפליטודת האצה לאמפליטודת העברה.
רמות האצה של רטט
התפיסה האנושית של עוצמת הרטט, שהיא מדד של תפיסה, לא גדלה באופן לינארי עם אמפליטודת הרטט, שהיא פרמטר פיזי. עוצמת הקול שמורגשת מאופיינת ברמת החישה (SL), שמוגדר כערך הדציבלים מעל סף הזיהוי באותה תדירות.
אפשר לחשב את אמפליטודת האצה התואמת של הרטט (ב-G שיא) באופן הבא:
...כאשר עוצמת המתח ב-dB היא הסכום של SL וסף הזיהוי – הערך שמוצג בציר האנכי בתרשים הסמוך – בתדר מסוים.
בתרשים הסמוך מוצגים רמות האצה של רטט ב-10, 20, 30, 40 ו-50 dB SL, לצד סף הזיהוי של תפיסת המגע האנושית (0 dB SL), בתור פונקציה של תדירות זמנית. הנתונים משוערים לפי איור 8 במאמר של Verrillo, R. המאמר של T. et al. משנת 1969, "Sensation magnitude of vibrotactile stimuli".
מערכת Android מטפלת בהמרה הזו באופן אוטומטי ב-BasicEnvelopeBuilder
, שמקבלת ערכים כעוצמות מנורמלות במרחב רמת החישה (dB SL) וממירה אותם לאולטרה-סאונד. לעומת זאת, הפונקציה WaveformEnvelopeBuilder
לא מחילה את ההמרה הזו, ובמקום זאת מקבלת ערכים כערכי אמפליטודה של תאוצה רגילה בפלט במרחב התאוצה (Gs). כשמעצבים או מפתחים חושבים על שינויים בעוצמת הרטט, הם מצפים שהעוצמה הנתפסת תעקוב אחרי מעטפת לינארית חלקית.
החלקת צורת הגל שמוגדרת כברירת מחדל במכשירים
כדי להמחיש את העניין, נבחן את האופן שבו תבנית גל מותאמת אישית מתנהגת במכשיר כללי:
Kotlin
val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
בתרשים הבא מוצגים צורת הגל של הקלט והתאוצה של הפלט בהתאם לקטע הקוד הקודם. שימו לב שהתאוצה עולה בהדרגה, ולא באופן פתאומי, בכל פעם שיש שינוי פתאומי באמפליטודה של התבנית – כלומר, ב-0ms, 150ms, 200ms, 250ms ו-700ms. יש גם חריגה מעל הערך הרצוי בכל שינוי שלב של האמפליטודה, ויש צלצול גלוי שנמשך לפחות 50 אלפיות השנייה כשאמפליטודת הקלט יורדת באופן פתאומי ל-0.
דפוס רטט משופר
כדי להימנע מתנודות יתר ולקצר את זמן הצלצול, צריך לשנות את האמפליטודות באופן הדרגתי יותר. בתרשים הבא מוצגים תרשים הגל והתאוצה של הגרסה המתוקנת:
Kotlin
val timings: LongArray = longArrayOf(
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Do not repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] {
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
};
int[] amplitudes = new int[] {
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
};
int repeatIndex = -1; // Do not repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
יצירת אפקטים מורכבים יותר של משוב מישוש
רכיבים אחרים בתגובה הולמת ללחיצה מורכבים יותר, ודורשים ידע מסוים ב-LRA שנעשה בו שימוש במכשיר. כדי לקבל את התוצאות הטובות ביותר, מומלץ להשתמש בצורות הגל המוכנות מראש ובקבועים שסופקו על ידי הפלטפורמה של המכשיר. כך תוכלו:
- ביצוע אפקטים ופרימיטיבים ברורים.
- משלבים אותם כדי ליצור אפקטים חדשים של משוב מישוש.
קבועים ופרימיטיבים של משוב מגע מוגדרים מראש יכולים להאיץ את העבודה שלכם מאוד בזמן יצירת אפקטים של משוב מגע באיכות גבוהה.