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.
Le LRA hanno alcune frequenze di risonanza comuni:
- 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).
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.
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.
Un tutorial online spiega ulteriormente la conversione tra l'ampiezza dell'accelerazione e l'ampiezza del dislocamento.
Livelli di accelerazione delle vibrazioni
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:
...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".
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:
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));
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.
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
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));
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:
- Esegui effetti e primitive chiari.
- Concatenali per comporre nuovi effetti aptico.
Queste costanti e primitive aptica predefinite possono velocizzare notevolmente il tuo lavoro, nonché creare effetti aptica di alta qualità.