Vibrationswellenformen analysieren

Die gängigsten Vibrationsaktoren auf Android-Geräten sind lineare Resonanzsaktoren (LRAs). LRAs simulieren das Gefühl eines Tastenklicks auf einer ansonsten nicht reagierenden Glasoberfläche. Ein klares und präzises Klickfeedbacksignal dauert in der Regel zwischen 10 und 20 Millisekunden. Dadurch wirken Nutzerinteraktionen natürlicher. Bei virtuellen Tastaturen kann dieses Klickfeedback die Tippgeschwindigkeit erhöhen und Fehler reduzieren.

LRAs haben einige gängige Resonanzfrequenzen:

  • Einige LRA hatten Resonanzfrequenzen im Bereich von 200 bis 300 Hz, was mit der Frequenz übereinstimmt, bei der die menschliche Haut am empfindlichsten auf Vibrationen reagiert. Die Vibrationen in diesem Frequenzbereich werden in der Regel als weich, scharf und durchdringend beschrieben.
  • Andere Modelle von LRA haben niedrigere Resonanzfrequenzen von etwa 150 Hz. Das Gefühl ist qualitativ weicher und voller (in der Dimension).
Die Komponenten sind von oben nach unten eine Abdeckung, eine Platte, ein mittlerer Magnet, zwei seitliche Magnete, eine Masse, zwei Federn, eine Spule, eine flexible Leiterplatte, eine Basis und ein Klebstoff.
Komponenten eines linearen ResonanzAntriebs (LRA).

Bei gleicher Eingangsspannung bei zwei verschiedenen Frequenzen können die Vibrationsausgabeamplituden unterschiedlich sein. Je weiter die Frequenz von der Resonanzfrequenz des LRA entfernt ist, desto niedriger ist die Vibrationsamplitude.

Für die haptischen Effekte eines bestimmten Geräts werden sowohl der Vibrationsaktor als auch sein Treiber verwendet. Haptische Treiber mit Übersteuerungs- und aktiven Bremsfunktionen können die Anlaufzeit und das Klingeln von LRA verringern, was zu einer reaktionsschnelleren und klareren Vibration führt.

Standardmäßige Wellenformglättung auf Geräten

Zur Veranschaulichung sehen wir uns an, wie sich ein benutzerdefiniertes Wellenformmuster auf einem generischen Gerät verhält:

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

Die folgenden Grafiken zeigen die Eingabewellenform und die Ausgabebeschleunigung, die den vorherigen Code-Snippets entsprechen. Die Beschleunigung steigt nicht plötzlich, sondern allmählich an, wenn es zu einer sprunghaften Änderung der Amplitude im Muster kommt, also bei 0 ms, 150 ms, 200 ms, 250 ms und 700 ms. Außerdem gibt es bei jeder Stufenänderung der Amplitude einen Überschwinger und ein sichtbares Überschwingen, das mindestens 50 ms dauert, wenn die Eingangsamplitude plötzlich auf 0 fällt.

Darstellung der Eingabewellenform der Schrittfunktion.
Diagramm der tatsächlich gemessenen Wellenform mit natürlicheren Übergängen zwischen den Ebenen.

Verbessertes haptisches Muster

Ändern Sie die Amplituden schrittweise, um Überschwinger zu vermeiden und die Klingelzeit zu verkürzen. Im Folgenden sind die Wellenform- und Beschleunigungsdiagramme der überarbeiteten Version zu sehen:

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

Darstellung der Eingabewellenform mit zusätzlichen Schritten.
Aufgezeichnete Wellenform mit glatteren Übergängen.

Komplexere haptische Effekte erstellen

Andere Elemente einer zufriedenstellenden Klickreaktion sind komplexer und erfordern einige Kenntnisse über die LRA, die auf einem Gerät verwendet wird. Die besten Ergebnisse erzielen Sie, wenn Sie die vordefinierten Wellenformen und die von der Plattform bereitgestellten Konstanten des Geräts verwenden. So haben Sie folgende Möglichkeiten:

  • Verwenden Sie klare Effekte und Primitive.
  • Sie können sie kombinieren, um neue haptische Effekte zu erstellen.

Mit diesen vordefinierten haptischen Konstanten und Primitiven können Sie Ihre Arbeit erheblich beschleunigen und gleichzeitig hochwertige haptische Effekte erzielen.