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 deutliches Klickfeedbacksignal dauert in der Regel zwischen 10 und 20 Millisekunden. Dieser Effekt macht die Interaktionen der Nutzer 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).
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.
Vibrationsausgangsbeschleunigung
Die Zuordnung von Frequenz zu Ausgabebeschleunigung (Frequency-to-Output-Acceleration Mapping, FOAM) beschreibt die maximal erreichbare Ausgabebeschleunigung (in G-Peak) bei einer bestimmten Vibrationsfrequenz (in Hertz). Ab Android 16 (API-Level 36) bietet die Plattform über die VibratorFrequencyProfile
eine integrierte Unterstützung für diese Zuordnung. Sie können diese Klasse zusammen mit den einfachen und erweiterten Envelope APIs verwenden, um haptische Effekte zu erstellen.
Die meisten LRA-Motoren haben einen einzelnen Spitzenwert in ihrer FOAM, in der Regel in der Nähe ihrer Resonanzfrequenz. Die Beschleunigung nimmt in der Regel exponentiell ab, wenn die Frequenz von diesem Bereich abweicht. Die Kurve ist möglicherweise nicht symmetrisch und weist um die Resonanzfrequenz herum ein Plateau auf, um den Motor vor Schäden zu schützen.
Das nebenstehende Diagramm zeigt ein Beispiel für ein FOAM für einen LRA-Motor.
Grenzwert für die Erkennung durch Menschen
Der Schwellenwert für die menschliche Wahrnehmung bezieht sich auf die minimale Beschleunigung einer Vibration, die eine Person zuverlässig wahrnehmen kann. Dieser Wert variiert je nach Vibrationshäufigkeit.
Die nebenstehende Grafik zeigt den Erkennungsgrenzwert für die haptische Wahrnehmung von Menschen in Beschleunigung als Funktion der zeitlichen Frequenz. Die Grenzwertdaten werden aus dem Verschiebungsgrenzwert in Abbildung 1 von Bolanowski Jr., S. J. et al., 1988, Four channels mediate the mechanical aspects of touch.
Android prüft diesen Grenzwert automatisch in der BasicEnvelopeBuilder
. Dabei wird sichergestellt, dass alle Effekte einen Frequenzbereich verwenden, der Vibrationsamplituden erzeugt, die den Grenzwert für die menschliche Wahrnehmung um mindestens 10 dB überschreiten.
In einer Onlineanleitung wird die Umwandlung zwischen Beschleunigungsamplitude und Verschiebungsamplitude weiter erläutert.
Vibrationsbeschleunigungsstufen
Die menschliche Wahrnehmung der Vibrationsintensität, ein Wahrnehmungsmesswert, steigt nicht linear mit der Vibrationsamplitude, einem physikalischen Parameter. Die wahrgenommene Intensität wird durch den Sensationslevel (SL) gekennzeichnet, der als dB-Wert über dem Erkennungsgrenzwert bei derselben Frequenz definiert ist.
Die entsprechende Vibrationsbeschleunigungsamplitude (in G-Peak) kann so berechnet werden:
Dabei ist die Amplitude in Dezibel die Summe aus SL und dem Erkennungsgrenzwert – der Wert entlang der vertikalen Achse im nebenstehenden Diagramm – bei einer bestimmten Frequenz.
Das nebenstehende Diagramm zeigt die Vibrationsbeschleunigungsstufen bei 10, 20, 30, 40 und 50 dB SL sowie den menschlichen Wahrnehmungsgrenzwert für die haptische Wahrnehmung (0 dB SL) als Funktion der zeitlichen Frequenz. Die Daten wurden aus Abbildung 8 in Verrillo, R. T. et al., 1969, Sensation magnitude of vibrotactile stimuli.
Android führt diese Umwandlung automatisch in der BasicEnvelopeBuilder
durch, die Werte als normalisierte Intensitäten im Sinne des Sensation Level (dBSL) annimmt und in eine Ausgabebeschleunigung umwandelt. Bei WaveformEnvelopeBuilder
wird diese Umwandlung hingegen nicht angewendet und die Werte werden stattdessen als normalisierte Ausgabebeschleunigungsamplituden im Beschleunigungsraum (Gs) verwendet. Die Envelope API geht davon aus, dass Designer oder Entwickler, wenn sie über Änderungen der Vibrationsstärke nachdenken, davon ausgehen, dass die wahrgenommene Intensität einer stückweise linearen Envelope folgt.
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.
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));
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 mit den vorgefertigten Wellenformen und den von der Plattform bereitgestellten Konstanten des Geräts. 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.