Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
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.
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).
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.
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.
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.
Grenzwert für die haptische Wahrnehmung von Menschen.
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:
$$
Amplitude(G) = 10^{Amplitude(db)/20}
$$
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.
Vibrationsbeschleunigungsstufen
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:
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
valtimings:LongArray=longArrayOf(25,25,50,25,25,25,25,25,25,25,75,25,25,300,25,25,150,25,25,25)valamplitudes:IntArray=intArrayOf(38,77,79,84,92,99,121,143,180,217,255,170,85,0,85,170,255,170,85,0)valrepeatIndex=-1// Do not repeat.vibrator.vibrate(VibrationEffect.createWaveform(timings,amplitudes,repeatIndex))
Java
long[]timings=newlong[]{25,25,50,25,25,25,25,25,25,25,75,25,25,300,25,25,150,25,25,25};int[]amplitudes=newint[]{38,77,79,84,92,99,121,143,180,217,255,170,85,0,85,170,255,170,85,0};intrepeatIndex=-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 mit den vorgefertigten Wellenformen und den von der Plattform bereitgestellten Konstanten des Geräts. So haben Sie folgende Möglichkeiten:
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.
Alle Inhalte und Codebeispiele auf dieser Seite unterliegen den Lizenzen wie im Abschnitt Inhaltslizenz beschrieben. Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder seinen Tochtergesellschaften.
Zuletzt aktualisiert: 2025-07-27 (UTC).
[null,null,["Zuletzt aktualisiert: 2025-07-27 (UTC)."],[],[],null,["# Analyze vibration waveforms\n\nThe most common vibration actuators on Android devices are [linear resonant\nactuators (LRAs)](https://medium.com/@SomaticLabs/what-is-a-linear-resonant-actuator-81cc25f85779). LRAs simulate the feeling of a button click\non what is otherwise an unresponsive glass surface. A clear and crisp click\nfeedback signal typically lasts between 10 and 20 milliseconds in duration. This\nsensation makes user interactions feel more natural. For virtual keyboards, this\nclick feedback can increase typing speed and reduce errors.\n\nLRAs have a few common [resonant frequencies](https://en.wikipedia.org/wiki/Resonance#Examples):\n\n- Some LRAs had resonant frequencies in the 200 to 300 Hz range, which coincides with the frequency at which human skin is most sensitive to vibration. The sensation of vibrations at this frequency range are usually described as smooth, sharp, and penetrating.\n- Other models of LRAs have lower resonance frequencies, at around 150 Hz. The sensation is qualitatively softer and fuller (in dimension). \nComponents of a linear resonant actuator (LRA).\n\n\u003cbr /\u003e\n\nGiven the same input voltage at two different frequencies, the vibration output\namplitudes can be different. The further away the frequency is from the LRA's\nresonant frequency, the lower its vibration amplitude.\n\nA given device's haptic effects use both the vibration actuator and its driver.\nHaptic drivers that include overdrive and active braking features can reduce the\nrise time and ringing of LRAs, leading to a more responsive and clear vibration.\n\nVibrator output acceleration\n----------------------------\n\n\nThe frequency-to-output-acceleration mapping (FOAM) describes the maximum\nachievable output acceleration (in G peak) at a given vibration frequency (in\nHertz). Starting in Android 16 (API level 36), the platform provides built-in\nsupport for this mapping through the `VibratorFrequencyProfile`. You can use\nthis class, along with the [basic](/reference/android/os/VibrationEffect.BasicEnvelopeBuilder) and [advanced](/reference/android/os/VibrationEffect.WaveformEnvelopeBuilder) envelope APIs, to create\nhaptic effects.\n\nMost LRA motors have a single peak in their FOAM, typically near their resonant\nfrequency. Acceleration generally decreases exponentially as frequency deviates\nfrom this range. The curve may not be symmetrical and might feature a plateau\naround the resonant frequency to protect the motor from damage.\n\nThe adjacent plot shows an example FOAM for an LRA motor. \nExample FOAM for an LRA motor.\n\n\u003cbr /\u003e\n\n### Human perception detection threshold\n\n\nThe *human perception detection threshold* refers to the minimum acceleration of\na vibration that a person can reliably detect. This level varies based on the\nvibration frequency.\n\nThe adjacent plot shows the human haptic perception detection threshold, in\nacceleration, as a function of temporal frequency. The threshold data is\nconverted from displacement threshold in Figure 1 of Bolanowski Jr., S. J., et\nal.'s 1988 article,\n[\"Four channels mediate the mechanical aspects of touch.\"](https://pubmed.ncbi.nlm.nih.gov/3209773/).\n\nAndroid automatically handles this threshold in the `BasicEnvelopeBuilder`,\nwhich verifies that all effects use a frequency range that prodcues vibration\namplitudes that exceed the human perception detection threshold by at least\n10 dB. \nHuman haptic perception detection threshold.\n\n\u003cbr /\u003e\n\nAn online tutorial further explains the [conversion between acceleration\namplitude and displacement amplitude](https://www.tangerinex.com/tutorial-1).\n\n### Vibration acceleration levels\n\n\nHuman perception of vibration intensity, a *perception* measure, doesn't grow\nlinearly with vibration amplitude, a *physical* parameter. Perceived intensity\nis characterized by sensation level (SL), which is defined as a dB amount above\nthe detection threshold at the same frequency.\n\nThe corresponding vibration acceleration amplitude (in G peak) can be calculated\nas follows: \n$$ Amplitude(G) = 10\\^{Amplitude(db)/20} $$\n\n...where the amplitude dB is the sum of SL and detection threshold---the value\nalong the vertical axis in the adjacent plot---at a particular frequency.\n\nThe adjacent plot shows the vibration acceleration levels at 10, 20, 30, 40 and\n50 dB SL, along with the human haptic perception detection threshold (0 dB SL),\nas a function of temporal frequency. The data is estimated from Figure 8 in\nVerrillo, R. T., et al.'s 1969 article, [\"Sensation magnitude of vibrotactile\nstimuli.\"](https://link.springer.com/article/10.3758/BF03212793). \nVibration acceleration levels.\n\n\u003cbr /\u003e\n\nAndroid automatically handles this conversion in the `BasicEnvelopeBuilder`,\nwhich takes values as normalized intensities in the sensation level space (dB\nSL) and converts them to output acceleration. The `WaveformEnvelopeBuilder`, on\nthe other hand, doesn't apply this conversion and takes values as normalized\noutput acceleration amplitudes in the acceleration space (Gs) instead. The\nenvelope API assumes that, when a designer or developer thinks about changes in\nvibration strength, they expect the perceived intensity to follow a piecewise\nlinear envelope.\n\nDefault waveform smoothing on devices\n-------------------------------------\n\nFor illustration, consider how a custom waveform pattern behaves on a generic\ndevice: \n\n### Kotlin\n\n val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)\n val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)\n val repeatIndex = -1 // Don't repeat.\n\n vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))\n\n### Java\n\n long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };\n int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };\n int repeatIndex = -1 // Don't repeat.\n\n vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));\n\nThe following plots show the input waveform and output acceleration\ncorresponding to the preceding code snippets. Note that the acceleration\nincreases gradually, not suddenly, whenever there is a step change of amplitude\nin the pattern---that is, at 0ms, 150ms, 200ms, 250ms, and 700ms. There is also an\novershoot at each step change of amplitude, and there is visible ringing that\nlasts at least 50ms when the input amplitude suddenly drops to 0.\n\n\nPlot of step function input waveform. \nPlot of actual measured waveform, showing more organic transitions between levels.\n\n\u003cbr /\u003e\n\nImproved haptic pattern\n-----------------------\n\nTo avoid overshoot and reduce ringing time, change the amplitudes more\ngradually. The following shows the waveform and acceleration plots of the\nrevised version: \n\n### Kotlin\n\n val timings: LongArray = longArrayOf(\n 25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,\n 300, 25, 25, 150, 25, 25, 25\n )\n val amplitudes: IntArray = intArrayOf(\n 38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,\n 0, 85, 170, 255, 170, 85, 0\n )\n val repeatIndex = -1 // Do not repeat.\n\n vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))\n\n### Java\n\n long[] timings = new long[] {\n 25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,\n 300, 25, 25, 150, 25, 25, 25\n };\n int[] amplitudes = new int[] {\n 38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,\n 0, 85, 170, 255, 170, 85, 0\n };\n int repeatIndex = -1; // Do not repeat.\n\n vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));\n\n\nPlot of input waveform with additional steps. \nPlot of measured waveform, showing smoother transitions.\n\n\u003cbr /\u003e\n\nCreate more complex haptic effects\n----------------------------------\n\nOther elements in a satisfying click response are more intricate, requiring some\nknowledge of the LRA used in a device. For best results, use the device's\npre-fabricated waveforms and platform-provided constants, which let you do the\nfollowing:\n\n- Perform clear effects and [primitives](/develop/ui/views/haptics/custom-haptic-effects#primitives).\n- Concatenate them to compose new haptic effects.\n\nThese predefined haptic constants and primitives can greatly speed up your work\nwhile creating high-quality haptic effects."]]