In diesem Dokument werden Linear Resonant Actuators (LRAs) als die gängigen Vibrationsaktuatoren auf Android-Geräten beschrieben. Es wird auf ihre Eigenschaften eingegangen, wie sie haptisches Feedback erzeugen und wie Sie mit Android-APIs effektive haptische Muster erstellen können. keywords_public: > Android-Haptik, haptische Aktuatoren, Linear Resonant Actuators, LRAs, Vibration, haptisches Feedback, VibratorFrequencyProfile, VibrationEffect, Android-Benutzeroberfläche
Die häufigsten Vibrationsaktoren auf Android-Geräten sind Linear Resonant Actuators (LRAs). LRAs simulieren das Gefühl eines Tastenklicks auf einer ansonsten nicht reagierenden Glasoberfläche. Ein deutliches und präzises Klicksignal 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 häufige 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. Vibrationen in diesem Frequenzbereich werden in der Regel als sanft, scharf und durchdringend beschrieben.
- Andere Modelle von LRAs haben niedrigere Resonanzfrequenzen, 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 Schwingungsamplitude.
Für die haptischen Effekte eines bestimmten Geräts werden sowohl der Vibrationsaktuator als auch sein Treiber verwendet. Haptische Treiber mit Overdrive- und aktivem Bremsen können die Anstiegszeit und das Klingeln von LRAs reduzieren, was zu einer reaktionsschnelleren und klareren Vibration führt.
Beschleunigung der Vibratorausgabe
Die Frequenz-zu-Ausgabe-Beschleunigungszuordnung (Frequency-to-Output-Acceleration Mapping, FOAM) beschreibt die maximal erreichbare Ausgabebeschleunigung (in G-Spitze) bei einer bestimmten Schwingungsfrequenz (in Hertz). Ab Android 16 (API-Level 36) bietet die Plattform integrierte Unterstützung für diese Zuordnung über die VibratorFrequencyProfile. Sie können diese Klasse zusammen mit den Envelope-APIs basic und advanced verwenden, um haptische Effekte zu erstellen.
Die meisten LRAs haben einen einzelnen Peak in ihrer FOAM, in der Regel in der Nähe ihrer Resonanzfrequenz. Die Beschleunigung nimmt in der Regel exponentiell ab, wenn die Häufigkeit 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.
Das angrenzende Diagramm zeigt ein Beispiel für die FOAM eines LRA-Motors.
Wahrnehmungsgrenzwert für Menschen
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.
Das angrenzende Diagramm zeigt die Erkennungsschwelle für die haptische Wahrnehmung des Menschen in Bezug auf die Beschleunigung als Funktion der zeitlichen Frequenz. Die Schwellenwertdaten werden aus dem Verschiebungs-Schwellenwert in Abbildung 1 von Bolanowski Jr. S. J., et al.'s 1988 article, "Four channels mediate the mechanical aspects of touch.".
Android verarbeitet diesen Grenzwert automatisch in der BasicEnvelopeBuilder, die dafür sorgt, dass alle Effekte einen Frequenzbereich verwenden, der Vibrationsamplituden erzeugt, die den Grenzwert für die menschliche Wahrnehmung um mindestens 10 dB überschreiten.
Vibrationsbeschleunigungsstufen
Die menschliche Wahrnehmung der Vibrationsintensität, ein Wahrnehmungsmaß, steigt nicht linear mit der Vibrationsamplitude, einem physikalischen Parameter. Die empfundene Intensität wird durch den Empfindungspegel (Sensation Level, SL) charakterisiert, der als dB-Betrag über der Erkennungsschwelle bei derselben Frequenz definiert ist.
Die entsprechende Schwingungsbeschleunigungsamplitude (in G-Spitze) kann so berechnet werden:
… wobei die Amplitude in dB die Summe aus Schallpegel und Erkennungsschwelle ist – der Wert auf der vertikalen Achse im angrenzenden Diagramm – bei einer bestimmten Frequenz.
Das angrenzende Diagramm zeigt die Vibrationsbeschleunigungspegel bei 10, 20, 30, 40 und 50 dB SL sowie die Erkennungsschwelle für die haptische Wahrnehmung des Menschen (0 dB SL) als Funktion der zeitlichen Frequenz. Die Daten wurden aus Abbildung 8 in Verrillo, R. geschätzt. T., et al.'s 1969 article, "Sensation magnitude of vibrotactile stimuli.".
Android übernimmt diese Umrechnung automatisch im BasicEnvelopeBuilder, das Werte als normalisierte Intensitäten im Empfindungspegelbereich (dB SL) entgegennimmt und in die Ausgabebeschleunigung umwandelt. Bei WaveformEnvelopeBuilder wird diese Umrechnung nicht angewendet. Stattdessen werden die Werte als normalisierte Ausgabebeschleunigungsamplituden im Beschleunigungsraum (G) verwendet. Bei der Envelope API wird davon ausgegangen, dass Designer oder Entwickler bei Änderungen der Vibrationsstärke erwarten, dass die wahrgenommene Intensität einem stückweise linearen Envelope folgt.
Standardmäßige Glättung der Wellenform auf Geräten
Hier sehen Sie, 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 Diagramme zeigen die Eingabe-Wellenform und die Ausgabebeschleunigung, die den vorherigen Code-Snippets entsprechen. Die Beschleunigung nimmt schrittweise und nicht plötzlich zu, wenn sich die Amplitude im Muster ändert, d. h. bei 0 ms, 150 ms, 200 ms, 250 ms und 700 ms. Bei jeder Amplitudenänderung gibt es auch ein Überschwingen und ein sichtbares Klingeln, das mindestens 50 ms dauert, wenn die Eingabeamplitude plötzlich auf 0 sinkt.
Verbessertes haptisches Muster
Um Überschwingen zu vermeiden und die Ausklingzeit zu verkürzen, sollten Sie die Amplituden schrittweise ändern. Unten sehen Sie die Wellenform- und Beschleunigungsdiagramme der überarbeiteten Version:
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 // Don't 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; // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
Komplexere haptische Effekte erstellen
Andere Elemente einer zufriedenstellenden Klickreaktion sind komplexer und erfordern Kenntnisse des im Gerät verwendeten LRA. Verwende für optimale Ergebnisse die vorgefertigten Wellenformen des Geräts und die von der Plattform bereitgestellten Konstanten. So kannst du Folgendes tun:
- Führen Sie klare Effekte und Primitive aus.
- Verketten Sie sie, um neue haptische Effekte zu erstellen.
Diese vordefinierten haptischen Konstanten und Primitiven können Ihre Arbeit beim Erstellen hochwertiger haptischer Effekte erheblich beschleunigen.