Analizowanie przebiegów wibracji

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).
Składają się one z poziomych elementów: pokrywy, płytki, magnesu środkowego, 2 magnetów bocznych, masy, 2 sprężyn, cewki, elastycznego obwodu, podstawy i kleju.
Elementy liniowego aktuatora rezonansowego (LRA).

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.

Wykres fali wejściowej funkcji krokowej.
Wykres rzeczywistej zmierzonej fali, pokazujący bardziej naturalne przejścia między poziomami.

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));

Wykres falki wejściowej z dodatkowymi krokami.
Wykres zmierzonego przebiegu fali, pokazujący łagodniejsze przejścia.

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.