Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Les actionneurs de vibration les plus courants sur les appareils Android sont les actionneurs à résonance linéaire (LRA). Les LRA simulent la sensation d'un clic sur un bouton sur une surface en verre qui ne répondrait pas autrement. Un signal de retour sur clic clair et net dure généralement entre 10 et 20 millisecondes. Cette sensation rend les interactions des utilisateurs plus naturelles. Pour les claviers virtuels, ce retour de clic peut augmenter la vitesse de frappe et réduire les erreurs.
Certaines LRA présentaient des fréquences de résonance comprises entre 200 et 300 Hz, ce qui coïncide avec la fréquence à laquelle la peau humaine est la plus sensible aux vibrations. La sensation de vibrations dans cette plage de fréquences est généralement décrite comme douce, nette et pénétrante.
D'autres modèles de LRA ont des fréquences de résonance plus basses, autour de 150 Hz. La sensation est qualitativement plus douce et plus complète (en dimension).
Composants d'un actionneur linéaire à résonance (LRA).
Pour une même tension d'entrée à deux fréquences différentes, les amplitudes de sortie de vibration peuvent être différentes. Plus la fréquence est éloignée de la fréquence de résonance du LRA, plus son amplitude de vibration est faible.
Les effets haptiques d'un appareil donné utilisent à la fois l'actionneur de vibration et son pilote.
Les pilotes haptiques qui incluent des fonctionnalités d'overdrive et de freinage actif peuvent réduire le temps de montée et le sifflement des LRA, ce qui permet d'obtenir une vibration plus réactive et plus claire.
Accélération de la sortie du vibreur
La cartographie de la fréquence à l'accélération de sortie (FOAM) décrit l'accélération de sortie maximale (en G peak) à une fréquence de vibration donnée (en Hertz). À partir d'Android 16 (niveau d'API 36), la plate-forme prend en charge ce mappage de manière intégrée via le VibratorFrequencyProfile. Vous pouvez utiliser cette classe, ainsi que les API d'enveloppe de base et avancée, pour créer des effets haptiques.
La plupart des moteurs LRA présentent un seul pic dans leur FOAM, généralement près de leur fréquence de résonance. L'accélération diminue généralement de manière exponentielle à mesure que la fréquence s'écarte de cette plage. La courbe peut ne pas être symétrique et présenter un plateau autour de la fréquence de résonance pour protéger le moteur contre les dommages.
Le graphique adjacent montre un exemple de FOAM pour un moteur LRA.
Exemple de FOAM pour un moteur à courant alternatif.
Seuil de détection de la perception humaine
Le seuil de détection de la perception humaine fait référence à l'accélération minimale d'une vibration qu'une personne peut détecter de manière fiable. Ce niveau varie en fonction de la fréquence de vibration.
Le graphique adjacent montre le seuil de détection de la perception haptique humaine, en accélération, en fonction de la fréquence temporelle. Les données de seuil sont converties à partir du seuil de déplacement de la figure 1 de Bolanowski Jr., Numéro J., et al., "Four channels mediate the mechanical aspects of touch."
Android gère automatiquement ce seuil dans BasicEnvelopeBuilder, qui vérifie que tous les effets utilisent une plage de fréquences qui produit des amplitudes de vibration qui dépassent le seuil de détection de la perception humaine d'au moins 10 dB.
Seuil de détection de la perception haptique humaine.
La perception humaine de l'intensité des vibrations, une mesure de perception, n'augmente pas de manière linéaire avec l'amplitude des vibrations, un paramètre physique. L'intensité perçue est caractérisée par le niveau de sensation (SL), qui est défini comme une valeur en dB au-dessus du seuil de détection à la même fréquence.
L'amplitude d'accélération des vibrations correspondante (en G peak) peut être calculée comme suit:
$$
Amplitude(G) = 10^{Amplitude(db)/20}
$$
...où le dB d'amplitude est la somme de la SL et du seuil de détection (valeur sur l'axe vertical du graphique adjacent) à une fréquence donnée.
Le graphique adjacent montre les niveaux d'accélération des vibrations à 10, 20, 30, 40 et 50 dB SL, ainsi que le seuil de détection de la perception haptique humaine (0 dB SL), en fonction de la fréquence temporelle. Les données sont estimées à partir de la figure 8 de Verrillo, R. Article de T., et al. publié en 1969, "Sensation magnitude of vibrotactile stimuli."
Niveaux d'accélération du vibreur.
Android gère automatiquement cette conversion dans BasicEnvelopeBuilder, qui prend les valeurs comme des intensités normalisées dans l'espace de niveau de sensation (dB SL) et les convertit en accélération de sortie. En revanche, WaveformEnvelopeBuilder n'applique pas cette conversion et prend les valeurs comme amplitudes d'accélération de sortie normalisées dans l'espace d'accélération (G). L'API d'enveloppe suppose que, lorsqu'un concepteur ou un développeur réfléchit aux variations de l'intensité des vibrations, il s'attend à ce que l'intensité perçue suive une enveloppe linéaire par morceaux.
Lissage de la forme d'onde par défaut sur les appareils
Pour illustration, considérons le comportement d'un modèle de forme d'onde personnalisée sur un appareil générique:
Les graphiques suivants montrent la forme d'onde d'entrée et l'accélération de sortie correspondant aux extraits de code précédents. Notez que l'accélération augmente progressivement, et non brusquement, chaque fois qu'il y a un changement d'amplitude par palier dans le modèle, c'est-à-dire à 0 ms, 150 ms, 200 ms, 250 ms et 700 ms. Il y a également un dépassement à chaque changement d'amplitude par pas, et un sifflement visible qui dure au moins 50 ms lorsque l'amplitude d'entrée passe soudainement à 0.
Graphique de la forme d'onde d'entrée de la fonction échelon.
Graphique de la forme d'onde mesurée réelle, montrant des transitions plus naturelles entre les niveaux.
Amélioration du modèle haptique
Pour éviter les dépassements et réduire la durée de sonnerie, modifiez les amplitudes plus progressivement. Vous trouverez ci-dessous les graphiques de forme d'onde et d'accélération de la version révisée:
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));
Graphique de la forme d'onde d'entrée avec étapes supplémentaires.
Graphique de la forme d'onde mesurée, montrant des transitions plus fluides.
Créer des effets haptiques plus complexes
D'autres éléments d'une réponse satisfaisante au clic sont plus complexes et nécessitent une certaine connaissance de la LRA utilisée dans un appareil. Pour de meilleurs résultats, utilisez les formes d'onde préfabriquées de l'appareil et les constantes fournies par la plate-forme, qui vous permettent de faire ce qui suit:
Concaténez-les pour composer de nouveaux effets haptiques.
Ces constantes et primitives haptiques prédéfinies peuvent considérablement accélérer votre travail tout en créant des effets haptiques de haute qualité.
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/27 (UTC).
[null,null,["Dernière mise à jour le 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."]]