Najczęściej spotykane na urządzeniach z Androidem siłowniki wibracyjne to liniowe rezonansowe siłowniki liniowe (LRA). LRAs symulują wrażenie kliknięcia przycisku na szklanej powierzchni, która normalnie nie reaguje na dotyk. Jasny i ostry sygnał sprzężenia zwrotnego kliknięcia trwa zwykle od 10 do 20 milisekund. Dzięki temu interakcje z użytkownikiem wydają się bardziej naturalne. W przypadku wirtualnych klawiatur ta funkcja może zwiększyć szybkość pisania i zmniejszyć liczbę błędów.
LRAs mają kilka wspólnych częstotliwości rezonansowych:
- Niektóre LRAs miały częstotliwości rezonansowe w zakresie 200–300 Hz, co zbiega się z częstotliwością, przy której ludzka skóra jest najbardziej wrażliwa na wibracje. Wrażenia z wibracji w tym zakresie częstotliwości są zwykle opisywane jako płynne, ostre i przenikliwe.
- Inne modele LRAs mają niższe częstotliwości rezonansowe, około 150 Hz. Wrażenie jest jakościowo bardziej miękkie i pełniejsze (w wymiarach).
Przy tym samym napięciu wejściowym o 2 różnych częstotliwościach amplitudy wyjścia wibracji mogą się różnić. Im większa odległość częstotliwości od częstotliwości rezonansowej LRA, tym mniejsza amplituda drgań.
Efekty haptyczne danego urządzenia korzystają zarówno z silnika wibracyjnego, jak i z sterownika. Sterowniki haptyczne, które obejmują funkcje overdrive i aktywnego hamowania, mogą skrócić czas narastania i dzwonienia w przypadku LRAs, co prowadzi do bardziej responsywnej i jasnej wibracji.
Domyślne wygładzanie krzywej na urządzeniach
Dla przykładu zobacz, jak niestandardowy wzór fali zachowuje się na urządzeniu ogólnym:
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));
Na wykresach poniżej widać sygnał wejściowy i przyspieszenie wyjściowe odpowiadające poprzedzającym fragmentom kodu. Pamiętaj, że przyspieszenie wzrasta stopniowo, a nie gwałtownie, gdy w wzorze występuje zmiana amplitudy o krok – czyli w 0 ms, 150 ms, 200 ms, 250 ms i 700 ms. Występuje też przeregulowanie przy każdej zmianie amplitudy, a także widoczne zjawisko zniekształceń, które trwa co najmniej 50 ms, gdy amplituda wejścia nagle spadnie do 0.
Ulepszona reakcja haptyczna
Aby uniknąć przesterowania i zredukować czas dzwonienia, zmień amplitudy w bardziej stopniowy sposób. Poniżej pokazano wykresy fali i przyspieszenia w zmienionej wersji:
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));
tworzenie bardziej złożonych efektów haptycznych.
Inne elementy wystarczającej odpowiedzi na kliknięcie są bardziej złożone i wymagają pewnej wiedzy o używanych na urządzeniu funkcjach LRA. Aby uzyskać najlepsze wyniki, użyj gotowych przebiegów fal na urządzeniu i konstant udostępnionych przez platformę, które umożliwiają wykonywanie tych czynności:
- Wykonuj czyste efekty i proste obiekty.
- Łącz je, aby tworzyć nowe efekty haptyczne.
Te wstępnie zdefiniowane statyczne i proste elementy haptyczne mogą znacznie przyspieszyć pracę przy tworzeniu wysokiej jakości efektów haptycznych.