רכיב להפעלת רטט

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

איור של הרכיבים של Haptic LRA

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

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

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

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

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 // Do not 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 // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

בתרשים הבא מוצגת צורת הגל שתואמת לקטעי הקוד שמוצגים למעלה.

גרף של צורת גל של קלט לפונקציית צעד

התאוצה התואמת מוצגת למטה:

תרשים של צורת הגל שנמדדה בפועל, שמציג יותר מעברים אורגניים בין רמות

שים לב שהתאוצה גדלה בהדרגה, לא בפתאומיות, בכל פעם שינוי צעד של משרעת בדפוס (למשל, ב-0 אלפיות שנייה, 150 אלפיות שנייה, 200 אלפיות שנייה, 250 אלפיות שנייה, 700 אלפיות השנייה). יש גם חריגה בכל שלב של שינוי משרעת, מופיע 'צלצול' שנמשך לפחות 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));

תרשים של צורת גל של קלט עם שלבים נוספים

תרשים של צורת גל שנמדדה, שמציג מעברים חלקים יותר

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

  • השתמשו באפקטים ובפרימיטיבים ברורים.

  • משרשרים אותם כדי ליצור אפקטים פיזיים חדשים.

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