Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Gli attuatori di vibrazione più comuni sui dispositivi Android sono gli attuatori lineari a risonanza (LRA). I sensori LRA simulano la sensazione di un clic sul pulsante su una superficie di vetro altrimenti non reattiva. Un segnale di feedback sul clic chiaro e preciso dura in genere da 10 a 20 millisecondi. Questa sensazione rende le interazioni degli utenti più naturali. Per le tastiere virtuali, questo feedback con clic può aumentare la velocità di digitazione e ridurre gli errori.
Alcuni LRA avevano frequenze di risonanza nell'intervallo da 200 a 300 Hz, che coincide con la frequenza alla quale la pelle umana è più sensibile alle vibrazioni. La sensazione delle vibrazioni in questa gamma di frequenza viene solitamente
descritta come liscia, acuta e penetrante.
Altri modelli di ARL hanno frequenze di risonanza inferiori, intorno a 150 Hz. La sensazione è qualitativamente più morbida e piena (in termini di dimensioni).
Componenti di un attuatore lineare a risonanza (LRA).
Data la stessa tensione di ingresso a due frequenze diverse, le ampiezze di output della vibrazione possono essere diverse. Maggiore è la distanza della frequenza dalla frequenza di risonanza dell'LRA, minore è l'ampiezza della vibrazione.
Gli effetti aptico di un determinato dispositivo utilizzano sia l'attuatore di vibrazione sia il relativo driver.
I driver aptico che includono funzionalità di overdrive e frenata attiva possono ridurre il tempo di salita e il suono metallico degli LRA, garantendo una vibrazione più reattiva e chiara.
Accelerazione dell'uscita del vibratore
La mappatura della frequenza all'accelerazione in uscita (FOAM) descrive l'accelerazione in uscita massima (in G picco) raggiungibile a una determinata frequenza di vibrazione (in hertz). A partire da Android 16 (livello API 36), la piattaforma fornisce il supporto integrato per questa mappatura tramite VibratorFrequencyProfile. Puoi utilizzare
questa classe, insieme alle API envelope di base e avanzate, per creare
effetti aptico.
La maggior parte dei motori LRA ha un singolo picco nel FOAM, in genere vicino alla frequenza di risonanza. L'accelerazione diminuisce in genere in modo esponenziale man mano che la frequenza si discosta da questo intervallo. La curva potrebbe non essere simmetrica e presentare un plateau
intorno alla frequenza di risonanza per proteggere il motore da eventuali danni.
Il grafico adiacente mostra un esempio di FOAM per un motore LRA.
Esempio di FOAM per un motore LRA.
Soglia di rilevamento della percezione umana
La soglia di rilevamento della percezione umana si riferisce all'accelerazione minima di una vibrazione che una persona può rilevare in modo affidabile. Questo livello varia in base alla frequenza della vibrazione.
Il grafico adiacente mostra la soglia di rilevamento della percezione tattile umana, in accelerazione, in funzione della frequenza temporale. I dati di soglia vengono
convertiti dalla soglia di spostamento in Figura 1 di Bolanowski Jr., Numero J., et
al., articolo del 1988,
"Four channels mediate the mechanical aspects of touch.".
Android gestisce automaticamente questa soglia in BasicEnvelopeBuilder,
che verifica che tutti gli effetti utilizzino un intervallo di frequenza che produca vibrazioni
di ampiezza superiore alla soglia di rilevamento della percezione umana di almeno
10 dB.
Soglia di rilevamento della percezione aptica umana.
La percezione umana dell'intensità della vibrazione, una misura di percezione, non cresce linearmente con l'ampiezza della vibrazione, un parametro fisico. L'intensità percepita è caratterizzata dal livello di sensazione (SL), definito come un valore in dB superiore alla soglia di rilevamento alla stessa frequenza.
L'ampiezza dell'accelerazione della vibrazione corrispondente (in G picco) può essere calcolata come segue:
$$
Amplitude(G) = 10^{Amplitude(db)/20}
$$
...dove l'ampiezza in dB è la somma di SL e della soglia di rilevamento, ovvero il valore
lungo l'asse verticale nel grafico adiacente, a una determinata frequenza.
Il grafico adiacente mostra i livelli di accelerazione della vibrazione a 10, 20, 30, 40 e
50 dB SL, insieme alla soglia di rilevamento della percezione tattile umana (0 dB SL),
in funzione della frequenza temporale. I dati sono stimati dalla Figura 8 in
Verrillo, R. T., et al., 1969, "Sensation magnitude of vibrotactile
stimuli".
Livelli di accelerazione della vibrazione.
Android gestisce automaticamente questa conversione in BasicEnvelopeBuilder,
che prende i valori come intensità normalizzate nello spazio del livello di sensazione (dB
SL) e li converte in accelerazione in uscita. WaveformEnvelopeBuilder, invece, non applica questa conversione e prende i valori come le ampiezze dell'accelerazione in uscita normalizzate nello spazio di accelerazione (G). L'API envelope presuppone che, quando un designer o uno sviluppatore pensa alle variazioni dell'intensità della vibrazione, si aspetti che l'intensità percepita segua un'envelope lineare frazionata.
Appiattimento della forma d'onda predefinito sui dispositivi
A titolo esemplificativo, considera il comportamento di un pattern di forma d'onda personalizzato su un dispositivo generico:
I seguenti grafici mostrano l'onda di ingresso e l'accelerazione in uscita corrispondente agli snippet di codice precedenti. Tieni presente che l'accelerazione aumenta gradualmente, non improvvisamente, ogni volta che si verifica un cambiamento brusco dell'ampiezza nel pattern, ovvero a 0 ms, 150 ms, 200 ms, 250 ms e 700 ms. Inoltre, si verifica un overshoot a ogni variazione di passo dell'ampiezza ed è visibile un ringing che dura almeno 50 ms quando l'ampiezza di input scende improvvisamente a 0.
Grafico della forma d'onda di input della funzione a gradini.
Grafico della forma d'onda misurata effettiva, che mostra transizioni più organiche tra i livelli.
Schema aptico migliorato
Per evitare l'overshoot e ridurre il tempo di squillo, modifica le ampiezze in modo più graduale. Di seguito sono riportati i grafici dell'onda e dell'accelerazione della versione aggiornata:
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));
Grafico della forma d'onda di input con passaggi aggiuntivi.
Grafico della forma d'onda misurata, che mostra transizioni più fluide.
Creare effetti aptico più complessi
Altri elementi di una risposta soddisfacente ai clic sono più complessi e richiedono alcune conoscenze dell'LRA utilizzato in un dispositivo. Per risultati ottimali, utilizza le forme d'onda prefabbricate e le costanti fornite dalla piattaforma del dispositivo, che ti consentono di svolgere le seguenti operazioni:
Queste costanti e primitive aptica predefinite possono velocizzare notevolmente il tuo lavoro, nonché creare effetti aptica di alta qualità.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[null,null,["Ultimo aggiornamento 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."]]