Tutti i miglioramenti del framework Android basati sulla tecnologia aptica sono guidati da un insieme di principi UX che si evolvono alla stessa velocità. I principi attuali prevedono la sostituzione della vibrazione intensa con una vibrazione nitida e l'esplorazione della vibrazione ricca.
Figura 1. Principi attuali.
La tabella seguente elenca tutte le API aptiche disponibili:
API | Metodi e costanti | Anno di aggiunta |
---|---|---|
android.view.HapticFeedbackConstants |
|
Prima del 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.View |
|
Prima del 2016 |
android.os.Vibrator |
|
Prima del 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.os.VibrationEffect |
|
2017 (Android 8) |
|
2019 (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 (Android 11) |
android.media.AudioAttributes.Builder |
|
2019 (Android 10) |
Vibrazione ronzante
A partire dai cercapersone e dai feature phone, le vibrazioni basate su cicalino con massa rotante eccentrica (ERM) a bassa qualità ma efficienti dal punto di vista energetico sono state utilizzate come sostituto della suoneria uditiva in modalità silenziosa. I componenti hardware legacy che producono rumori udibili forti e sgradevoli possono danneggiare l'esperienza utente aptica fornendo impressioni di bassa qualità (ad esempio, uno smartphone economico e rotto).
Cancella feedback aptico
Clear Haptics supporta la sensazione di cambiamenti di stato discreti (ad esempio, cambiamenti binari durante il processo di accensione e spegnimento). A causa della natura dell'affordance discreta, vengono generate vibrazioni chiare come singola entità (ad esempio, un effetto aptico per ogni evento di input).
Android mira a fornire un feedback aptico chiaro con sensazioni forti ma nitide, piuttosto che sensazioni vibranti o molli.
Le costanti aptiche predefinite create per supportare l'aptica chiara includono i seguenti elementi.
CLOCK_TICK
CONFIRM
CONTEXT_CLICK
GESTURE_END
GESTURE_START
KEYBOARD_PRESS
KEYBOARD_RELEASE
KEYBOARD_TAP
LONG_PRESS
REJECT
TEXT_HANDLE_MOVE
VIRTUAL_KEY
VIRTUAL_KEY_RELEASE
In
VibrationEffect
:
EFFECT_CLICK
EFFECT_DOUBLE_CLICK
EFFECT_HEAVY_CLICK
EFFECT_TICK
Creare una conoscenza comune tra i produttori di dispositivi e gli sviluppatori è fondamentale per migliorare la qualità complessiva dell'aptica nell'ecosistema Android. Utilizza l'elenco di controllo di base, la valutazione dell'hardware e la CDD per scoprire di più sull'implementazione aptica.
Figura 2. Premere e rilasciare.
Tecnologia aptica avanzata
L'aptica avanzata è una categoria di aptica in crescita che va oltre i singoli effetti basati sugli impulsi. Android mira a supportare l'aptica avanzata con elevata componibilità e regolabilità con un livello di granularità elevato. I seguenti casi d'uso sono supportati in Android 11 o versioni precedenti.
Figura 3. Feedback aptico ricco con texture scorrevole.
Figura 4. Trascinamento e scorrimento.
Caso d'uso 1: texture scorrevole
Se un effetto aptico viene ripetuto mentre il dito scorre su una superficie di tocco (ad esempio, trascinamento, scorrimento, esplorazione della superficie con una texture aptica fantasma), gli effetti aptici ripetuti sono preferibilmente nitidi e sottili.
Se l'effetto individuale è confuso anziché nitido, è probabile che gli intervalli tra le ripetizioni vengano eliminati. Il risultato è una vibrazione lunga, anziché più segnali discreti.
Se l'ampiezza non è abbastanza sottile, l'energia aptica percepita si accumula con la ripetizione, con conseguente aptica estremamente forte alla fine della ripetizione.
Implementare una texture aptica di superficie per i gesti di scorrimento e trascinamento
Utilizza CLOCK_TICK
e TEXT_HANDLE_MOVE
in HapticFeedbackConstants
.
Queste costanti predefiniscono le caratteristiche di ripetizione e ampiezza.
Crea il tuo effetto
Per creare il tuo effetto, componi un design unendo sequenze
di PRIMITIVE_CLICK
e PRIMITIVE_TICK
in VibrationEffect.Composition
.
Puoi regolare le caratteristiche della ripetizione e della scala di ampiezza
utilizzando addPrimitive(int primitiveID, float scale, int delay)
. Il supporto si basa sulla funzionalità CAP_COMPOSE_EFFECTS
dell'interfaccia HAL del vibratore.
Caso d'uso 2: vibrazione lunga con effetto di accelerazione iniziale
La vibrazione lunga è una vibrazione di ampiezza uniforme che passa da 0 all'ampiezza target. La vibrazione lunga può generare una risposta aptica percepibile. Tuttavia, una vibrazione lunga e improvvisa può spaventare gli utenti in un ambiente silenzioso e spesso produce ronzii udibili. Per generare una vibrazione lunga più piacevole, applica l'effetto di accelerazione all'inizio della vibrazione lunga. In questo modo si ottiene una transizione di ampiezza graduale che aumenta fino all'ampiezza target.
Applica l'effetto di accelerazione iniziale
Controlla le funzionalità hardware del controllo dell'ampiezza con
android.os.Vibrator.hasAmplitudeControl()
.- Il risultato deve essere
true
per produrre un effetto di accelerazione con ampiezza variabile.
- Il risultato deve essere
Usa
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Regola la serie di
timings[]
eamplitudes[]
per generare la curva di accelerazione, come mostrato nella Figura 5.
Figura 5. Curva di accelerazione della vibrazione lunga.
Caso d'uso 3: aptica accoppiata all'audio
La tecnologia aptica accoppiata all'audio è costituita da pattern aptici accoppiati al ritmo dell'audio per attirare l'attenzione dell'utente.
Tecnologia aptica accoppiata all'audio: vantaggi
Per implementare l'aptica accoppiata all'audio, combina l'aptica chiara con vibrazioni lunghe. Le sensazioni aptiche forti ma brevi dell'aptica nitida offrono pattern ritmici discreti. In combinazione con gli elevati livelli di stimoli forniti dalla vibrazione lunga, questo metodo attira molto bene l'attenzione dell'utente.
È importante considerare i pattern ritmici della sensazione. Se non c'è un senso del ritmo, l'utente percepisce le sensazioni aptiche come vibrazioni casuali e tende a ignorarle.
Figura 6. Esempio di tecnologia aptica per la coppia audio.
Tecnologia aptica accoppiata all'audio: suggerimenti per l'implementazione
L'implementazione dell'aptica accoppiata all'audio richiede una conoscenza di base della riproduzione dei contenuti dei canali audio e aptici. Tieni presente quanto segue:
Utilizza le classi
MediaPlayer
oSoundPool
.- Le risorse in formato OGG con una chiave di metadati speciale
(
ANDROID_HAPTIC
seguita da un numero di canali aptici) indicano la presenza di dati aptici e la riproduzione conMediaPlayer
eSoundPool
.
- Le risorse in formato OGG con una chiave di metadati speciale
(
Indica il supporto della riproduzione aptica e audio in
audio_policy_configuration.xml
.- Utilizza un profilo di output con il canale aptico
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - Per un flusso di output con canali aptici, ricorda che i canali aptici vengono presentati come canali aggiuntivi nei dati.
Esempio
Se la maschera del canale per lo stream di output è simile alla seguente:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Quindi, ogni campione dovrebbe avere il seguente aspetto:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Utilizza un profilo di output con il canale aptico
Modifica
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
infalse
per riprodurre il canale aptico.- Per impostazione predefinita, i canali aptici sono disattivati (
true
). - I casi d'uso includono suonerie e suoni dell'interfaccia utente con feedback aptico e sincrono.
- Per impostazione predefinita, i canali aptici sono disattivati (
L'HAL Vibrator deve implementare il supporto del controllo esterno.
- Per le implementazioni HIDL, utilizza
setExternalControl(bool enabled) generates (Status status)
. - Per le implementazioni AIDL, utilizza
void setExternalControl(in boolean enabled)
.
- Per le implementazioni HIDL, utilizza
Figura 7. Implementare la tecnologia aptica accoppiata all'audio.
Tecnologia aptica accoppiata all'audio: HapticGenerator
HapticGenerator
è un effetto audio introdotto in Android 12 che
può generare dati aptici da un canale audio e riprodurli in tempo reale come
aptica accoppiata all'audio. L'effetto viene applicato a AudioTrack
come
illustrato nella Figura 8:
Figura 8. Architettura del generatore aptico.
Questa visualizzazione dell'architettura mostra dove viene applicato Haptic Generator al flusso audio utente in entrata prima che venga inviato all'HAL audio. Il generatore
viene applicato dopo che AudioMixer
divide i dati audio e aptici e prima di qualsiasi
altro effetto audio. Il suo output sostituisce tutti i dati aptici precedenti nel
flusso.
Per assicurarti che l'algoritmo del generatore aptico generi aptica di alta qualità, ottimizza l'algoritmo di generazione per il motore vibratore del dispositivo regolando i parametri che configurano la catena di filtri che applica alle forme d'onda audio. Questa sezione descrive questi parametri nel dettaglio e spiega come regolarli in base alle specifiche hardware.
Frequenza di risonanza per il filtro passa banda
La frequenza di risonanza del vibratore è la frequenza alla quale un attuatore aptico ha la massima potenza. Questo parametro regola un antirisonatore per appiattire parzialmente la funzione di trasferimento della risposta, in modo da ottenere una larghezza di banda più ampia. Il framework Android collega automaticamente questo valore all'output del metodo Vibrator HAL
IVibrator.getResonantFrequency
.Il valore predefinito di questo parametro è 150 Hz. Puoi modificarlo nel codice.
Potenza di normalizzazione per la busta lenta
Questo parametro determina l'esponente nella normalizzazione parziale (controllo automatico del guadagno). Il valore predefinito è -0,8, il che significa che l'80% della variazione della gamma dinamica viene rimosso da questo passaggio di controllo del guadagno. Puoi modificarlo nel codice.
Fattore Q per il filtro passa banda
Il fattore di qualità del vibratore (fattore Q) è determinato da due parametri:
Zero Q, il fattore di qualità degli zeri nel filtro passa banda che annulla parzialmente la risonanza
Il Q del polo, il fattore di qualità dei poli nel filtro passa banda
Il rapporto tra questi due valori limita la soppressione della risonanza per aumentare le frequenze più basse e ampliare la risposta dell'algoritmo. Ad esempio, i valori predefiniti di 8 per Zero Q e 4 per Pole Q producono un rapporto di 2, limitando la soppressione della risonanza di un fattore 2 (6 dB). Il framework Android collega entrambi i valori all'output del metodo HAL Vibrator
IVibrator.getQFactor
.Se i valori predefiniti non tengono conto dell'attenuazione della forza del motore nel tuo dispositivo, ti consigliamo di modificare entrambi i valori contemporaneamente e di aumentarli o diminuirli entrambi. Il rapporto tra Zero Q e Pole Q deve essere maggiore di 1. Puoi modificarlo nel codice.
Frequenza di taglio per la distorsione
La frequenza di taglio viene applicata da un filtro passa-basso che sopprime le vibrazioni di basso livello e migliora i livelli più alti utilizzando una distorsione cubica. Il valore predefinito è 300 Hz. Puoi modificarlo nel codice.
Guadagno di ingresso e soglia del cubo per la distorsione
Questi parametri vengono utilizzati da un filtro di distorsione non lineare applicato alla forma d'onda di input che attenua l'ampiezza dei segnali a bassa frequenza e aumenta l'ampiezza dei segnali a frequenza più elevata.
- Il valore predefinito per il fattore di guadagno dell'input è 0,3.
- Il valore predefinito per la soglia del cubo è 0,1.
Ti consigliamo di modificare entrambi i valori contemporaneamente. Puoi trovarli nel codice.
Per ulteriori informazioni sulla funzione applicata da questo filtro, consulta l'implementazione nel codice.
Per scoprire di più su come questi due parametri influenzano l'output, ti consigliamo di tracciare i grafici delle risposte in frequenza dei filtri e di osservare come cambiano le risposte in frequenza con diversi valori dei parametri.
Guadagno di output per la distorsione
Questo parametro controlla l'ampiezza della vibrazione finale. È un guadagno finale applicato dopo un soft limiter che limita le ampiezze di vibrazione a un valore inferiore a 1. Il valore predefinito è 1, 5 e puoi modificarlo nel codice.
Se la vibrazione è troppo leggera, aumenta il valore. Se senti il rumore dell'attuatore, diminuisci il valore.