Die häufigsten Vibrationsaktuatoren auf Android-Geräten sind lineare Resonanz aktuatoren (Linear Resonant Actuators, LRAs). LRAs simulieren das Gefühl eines Klicks auf eine ansonsten nicht reagierende Glasoberfläche. Ein klares und prägnantes Klick-Feedback-Signal dauert in der Regel zwischen 10 und 20 Millisekunden. Dadurch fühlen sich Nutzerinteraktionen natürlicher an. Bei virtuellen Tastaturen kann dieses Klick-Feedback die Tippgeschwindigkeit erhöhen und Fehler reduzieren.
LRAs haben einige gemeinsame Resonanzfrequenzen:
- Einige LRAs 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 sanft, scharf und durchdringend beschrieben.
- Andere LRA-Modelle 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 Amplituden der Vibrationsausgabe unterschiedlich sein. Je weiter die Frequenz von der Resonanzfrequenz des LRA entfernt ist, desto geringer ist die Vibrationsamplitude.
Die haptischen Effekte eines bestimmten Geräts verwenden sowohl den Vibrationsaktuator als auch seinen Treiber. Haptische Treiber mit Übersteuerungs- und aktiven Bremsfunktionen können die Anstiegszeit und das Klingeln von LRAs reduzieren, was zu einer reaktionsschnelleren und klareren Vibration führt.
Ausgangsbeschleunigung des Vibrators
Die Frequenz-zu-Ausgangsbeschleunigungs-Zuordnung (Frequency-to-Output-Acceleration Mapping, FOAM) beschreibt die maximal erreichbare Ausgangsbeschleunigung (in G-Spitze) bei einer bestimmten Vibrationsfrequenz (in Hertz). Ab Android 16 (API-Level 36) bietet die Plattform integrierte Unterstützung für diese Zuordnung über VibratorFrequencyProfile. Sie können diese Klasse zusammen mit den grundlegenden und erweiterten Hüllkurven-APIs verwenden, um haptische Effekte zu erstellen.
Die meisten LRA-Motoren haben einen einzelnen Peak in ihrer FOAM, in der Regel in der Nähe ihrer Resonanzfrequenz. Die Beschleunigung nimmt im Allgemeinen exponentiell ab, wenn die Frequenz von diesem Bereich abweicht. Die Kurve ist möglicherweise nicht symmetrisch und kann um die Resonanzfrequenz herum ein Plateau aufweisen, um den Motor vor Schäden zu schützen.
Die angrenzende Grafik zeigt eine Beispiel-FOAM für einen LRA-Motor.
Erkennungsgrenzwert für die menschliche Wahrnehmung
Der Erkennungsgrenzwert für die menschliche Wahrnehmung bezieht sich auf die Mindestbeschleunigung einer Vibration, die eine Person zuverlässig erkennen kann. Dieser Wert variiert je nach Vibrationsfrequenz.
Die angrenzende Grafik zeigt den Erkennungsgrenzwert für die haptische Wahrnehmung des Menschen in der Beschleunigung als Funktion der zeitlichen Frequenz. Die Grenzwertdaten wurden aus dem Grenzwert für die Verschiebung in Abbildung 1 des Artikels von Bolanowski Jr., S. J. et al. aus dem Jahr 1988, „Four channels mediate the mechanical aspects of touch.“, konvertiert.
Android verarbeitet diesen Grenzwert automatisch in BasicEnvelopeBuilder. Dabei wird geprüft, ob alle Effekte einen Frequenzbereich verwenden, der Vibrationsamplituden erzeugt, die den Erkennungsgrenzwert für die menschliche Wahrnehmung um mindestens 10 dB übersteigen.
In einem Online-Tutorial wird die Umrechnung zwischen Beschleunigungs amplitude und Verschiebungsamplitude näher erläutert.
Vibrationsbeschleunigungsstufen
Die menschliche Wahrnehmung der Vibrationsintensität, ein Wahrnehmungsmaß, wächst nicht linear mit der Vibrationsamplitude, einem physikalischen Parameter. Die wahrgenommene Intensität wird durch den Empfindungspegel (Sensation Level, SL) charakterisiert, der als dB-Wert über dem Erkennungsgrenzwert bei derselben Frequenz definiert ist.
Die entsprechende Vibrationsbeschleunigungsamplitude (in G-Spitze) kann so berechnet werden:
Dabei ist die Amplitude in dB die Summe aus SL und Erkennungsgrenzwert – der Wert entlang der vertikalen Achse in der angrenzenden Grafik – bei einer bestimmten Frequenz.
Die angrenzende Grafik zeigt die Vibrationsbeschleunigungsstufen bei 10, 20, 30, 40 und 50 dB SL sowie den Erkennungsgrenzwert für die haptische Wahrnehmung des Menschen (0 dB SL) als Funktion der zeitlichen Frequenz. Die Daten wurden aus Abbildung 8 im Artikel von Verrillo, R. T. et al. aus dem Jahr 1969, „Sensation magnitude of vibrotactile stimuli“, geschätzt.
Android verarbeitet diese Umrechnung automatisch in BasicEnvelopeBuilder. Dabei werden Werte als normalisierte Intensitäten im Empfindungspegelbereich (dB SL) verwendet und in die Ausgangsbeschleunigung umgewandelt. WaveformEnvelopeBuilder wendet diese Umrechnung dagegen nicht an und verwendet stattdessen Werte als normalisierte Ausgangsbeschleunigungsamplituden im Beschleunigungsbereich (Gs). Die Envelope-API geht davon aus, dass Designer oder Entwickler bei Änderungen der Vibrationsstärke erwarten, dass die wahrgenommene Intensität einer stückweise linearen Envelope folgt.
Standardmäßige Glättung der Wellenform auf Geräten
Zur Veranschaulichung betrachten wir, 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 Eingangswellenform und die Ausgangsbeschleunigung, die den vorherigen Code-Snippets entsprechen. Beachten Sie, dass die Beschleunigung allmählich und nicht plötzlich zunimmt, wenn sich die Amplitude im Muster ändert – also bei 0 ms, 150 ms, 200 ms, 250 ms und 700 ms. Bei jeder Änderung der Amplitude gibt es auch eine Überschwingung und ein sichtbares Klingeln, das mindestens 50 ms dauert, wenn die Eingangsamplitude plötzlich auf 0 sinkt.
Verbessertes haptisches Muster
Um Überschwingungen zu vermeiden und die Klingelzeit zu verkürzen, ändern Sie die Amplituden allmählicher. 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 Kenntnisse des in einem Gerät verwendeten LRA. Verwenden Sie für optimale Ergebnisse die vorgefertigten Wellenformen des Geräts und die von der Plattform bereitgestellten Konstanten. Damit können Sie Folgendes tun:
- Klare Effekte und Primitive ausführen.
- Sie verketten, um neue haptische Effekte zu erstellen.
Diese vordefinierten haptischen Konstanten und Primitive können Ihre Arbeit bei der Erstellung hochwertiger haptischer Effekte erheblich beschleunigen.