Tutti i miglioramenti del framework Android basati sull'aptica sono basati su un insieme di principi UX in evoluzione allo stesso ritmo. I principi attuali prevedono la sostituzione della vibrazione vibrante con il feedback aptico chiaro e l'esplorazione del feedback aptico avanzato.
Figura 1. Principi attuali
La tabella seguente elenca tutte le API di aptica disponibili.
API | Metodi | 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 rumorosa
Per quanto riguarda i cercapersone e i feature phone, le vibrazioni ERM basate sul cicalino di bassa qualità, ma ad alta efficienza energetica, sono state utilizzate in sostituzione della suoneria in modalità silenziosa. I componenti hardware legacy che producono rumori acustici forti e sgradevoli possono danneggiare l'esperienza utente tattile generando impressioni di bassa qualità (ad esempio, uno smartphone economico rotto).
Feedback aptico chiaro
La tecnologia Clear haptics supporta la sensazione di cambiamenti di stato discreti (ad esempio, modifiche binarie durante la procedura di accensione/spegnimento). A causa della natura dell'attrattiva discreta, la tecnologia aptica chiara viene generata come una singola entità (ad esempio, un effetto aptico per un evento di input).
Android punta a offrire una tecnologia aptica chiara con sensazioni forti ma approssimative, anziché sensazioni vivaci o molli.
Le costanti aptica predefinite create per supportare l'aptica chiara includono quanto segue.
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
Sviluppare una conoscenza comune tra produttori e sviluppatori di dispositivi è fondamentale per aumentare la qualità complessiva della tecnologia aptica nell'ecosistema Android. Utilizza la lista di controllo di base, la valutazione dell'hardware e il CDD per scoprire di più sull'implementazione della tecnologia aptica.
Figura 3. Premere e rilasciare.
Feedback aptico avanzato
Ricordo tattile è una categoria di tecnologia aptica in crescita che va oltre i singoli effetti basati su impulsi. Android mira a supportare una tecnologia aptica avanzata con un'elevata componibilità e regolabilità con un livello di granularità. I seguenti casi d'uso sono supportati in Android 11 o versioni precedenti.
Figura 4. Sensibilità tattile avanzata con texture scorrevole
Figura 5. Trascinamenti e scorrimenti
Caso d'uso 1: trama scorrevole
Se un effetto aptico viene ripetuto mentre il dito scorre su una superficie touch (ad esempio trascinando, scorrendo, esplorando la superficie con una texture aptica fantasma), gli effetti aptico ripetuti sono preferibilmente nitidi e delicati.
Se l'effetto singolo è ronzante anziché nitido, è probabile che gli intervalli tra le ripetizioni vengano eliminati. Il risultato è un lungo ronzio, anziché più segnali distinti.
Se l'ampiezza non è abbastanza sottile, l'energia aptica percepita si accumula attraverso la ripetizione, producendo una tecnologia aptica incredibilmente forte al termine della ripetizione.
Implementa una semplice texture aptica della 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.
Creare un effetto personalizzato
Per creare il tuo effetto, componi un design concatenatendo sequenze di PRIMITIVE_CLICK
e PRIMITIVE_TICK
in VibrationEffect.Composition
.
Puoi regolare le caratteristiche della scala di ripetizione e 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 ease-in
La vibrazione lunga è una vibrazione con ampiezza uniforme che passa da 0 all'ampiezza di destinazione. La vibrazione lunga può generare una tecnologia dell'attenzione facilmente percepibile. Tuttavia, una vibrazione lunga e improvvisa può spaventare gli utenti in un ambiente silenzioso e spesso produce rumori di ronzio udibili. Per generare una vibrazione lunga più piacevole, applica l'effetto di facilitazione all'inizio della vibrazione lunga. Ciò produce una transizione di ampiezza uniforme che si sviluppa verso l'ampiezza di destinazione.
Applica l'effetto ease-in
Controlla le funzionalità hardware del controllo dell'ampiezza con
android.os.Vibrator.hasAmplitudeControl()
.- Il risultato deve essere
true
per produrre un effetto di transizione graduale con variazione di ampiezza.
- Il risultato deve essere
Utilizza
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Regola le serie di
timings[]
eamplitudes[]
per generare la curva di ease-in, come mostrato nella Figura 6.
Figura 6. Curva di aumento graduale della vibrazione lunga
Caso d'uso 3: feedback aptico con accoppiamento audio
L'aptica accoppiata all'audio sono pattern aptica accoppiati al ritmo dell'audio per attirare l'attenzione dell'utente.
Tecnologia aptica accoppiata all'audio: vantaggi
Per implementare la tecnologia aptica accoppiata all'audio, combina feedback aptico chiari con vibrazioni lunghe. Le sensazioni tattili forti ma brevi della tecnologia aptica chiara offrono pattern ritmici discreti. Se combinato con gli elevati livelli di stimoli forniti dalla vibrazione prolungata, è un ottimo modo per attirare l'attenzione di un utente.
È importante considerare i ritmi delle sensazioni. Se non c'è un senso di ritmo, l'utente percepisce le sensazioni tattili come vibrazioni casuali e tende a ignorarle.
Figura 7. Esempio di accoppiamento audio e tecnologia aptica
Tecnologia aptica con accoppiamento audio: suggerimenti per l'implementazione
L'implementazione dell'aptica accoppiata all'audio richiede una conoscenza di base della riproduzione dei contenuti sia dei canali audio che di quelli aptica. Tieni presente quanto segue.
Utilizza le classi
MediaPlayer
oSoundPool
.- Le risorse in formato OGG con una chiave dei metadati speciale
(
ANDROID_HAPTIC
seguita da un numero di canali aptico) indicano la presenza di dati aptico e la riproduzione conMediaPlayer
eSoundPool
.
- Le risorse in formato OGG con una chiave dei metadati speciale
(
Indica il supporto della tecnologia aptica e della riproduzione audio in
audio_policy_configuration.xml
.- Utilizza un profilo di output con il canale haptics
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - Per uno stream di output con canali aptici, ricorda che i canali aptici sono 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
Ogni sample dovrebbe avere il seguente aspetto:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Utilizza un profilo di output con il canale haptics
Cambia
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 e tecnologia aptica sincrona.
- Per impostazione predefinita, i canali aptici sono disattivati (
Vibrator HAL deve implementare il supporto di 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 8. Implementazione della tecnologia aptica accoppiata all'audio
Feedback aptico accoppiato all'audio: generatore aptico
HapticGenerator
è un effetto audio introdotto in Android 12 che può generare dati aptico da un canale audio e riprodurli in tempo reale come feedback aptico accoppiato all'audio.
L'effetto viene applicato al AudioTrack
come descritto nella Figura 9.
Figura 9. Architettura di Haptic Generator
Per assicurarti che l'algoritmo di generazione delle vibrazioni generi vibrazioni di alta qualità, sintonizza l'algoritmo di generazione sul motore del vibratore del dispositivo regolando i parametri che configurano la catena di filtri applicata alle forme d'onda audio. Questa sezione descrive in dettaglio questi parametri e spiega come ottimizzarli in base alle specifiche hardware.
Frequenza di risonanza per il filtro passa-banda
La frequenza di risonanza del vibratore è la frequenza a cui un attuatore aptico ha l'uscita massima. 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 HAL del vibratore
IVibrator.getResonantFrequency
.Il valore predefinito di questo parametro è 150 Hz. Questo valore può essere modificato nel codice qui.
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. Questo valore può essere modificato nel codice qui.
Fattore Q per il filtro passabanda
Il fattore di qualità del vibratore (fattore Q) è determinato da due parametri:
Il fattore di qualità zero degli zeri nel filtro passabanda che annulla parzialmente la risonanza.
Il Polo Q, il fattore di qualità dei poli nel filtro band-stop.
Il rapporto tra questi due valori limita la soppressione della risonanza per potenziare le frequenze più basse e ampliare la risposta dell'algoritmo. Ad esempio, i valori predefiniti di 8 per il Q zero e 4 per il Q polo 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 Vibrator HAL
IVibrator.getQFactor
.Se i valori predefiniti non tengono conto dello smorzamento della potenza del motore sul dispositivo, ti consigliamo di modificare entrambi i valori contemporaneamente e di aumentarli o diminuirli. Il rapporto tra Q zero e Q polo deve essere maggiore di 1. Questo valore può essere modificato nel codice qui.
Frequenza di angolo per la distorsione
La frequenza angolare viene applicata da un filtro passa-basso che elimina le vibrazioni di basso livello e migliora i livelli più alti utilizzando una distorsione cubica. Il valore predefinito è 300 Hz. Questo valore può essere modificato nel codice qui.
Guadagno dell'input e soglia del cubo per la distorsione
Questi parametri vengono utilizzati da un filtro di distorsione non lineare applicato alla forma d'onda di ingresso che attenua l'ampiezza dei segnali di frequenza più bassi e aumenta quelli di frequenza più alta.
- Il valore predefinito per il fattore di guadagno in ingresso è 0,3.
- Il valore predefinito della soglia del cubo è 0.1.
Ti consigliamo di modificare entrambi i valori contemporaneamente. Puoi trovarli nel codice qui.
Per ulteriori informazioni sulla funzione applicata da questo filtro, consulta l'implementazione disponibile qui. Per saperne di più su come questi due parametri influenzano l'output, ti consigliamo di tracciare le risposte in frequenza dei filtri e di osservare come cambiano le risposte in frequenza con diversi valori parametro.
Guadagno in uscita per la distorsione
Questo parametro controlla l'ampiezza della vibrazione finale. Si tratta di un guadagno finale applicato dopo un soft limiter che limita le ampiezze delle vibrazioni a meno di 1. Il valore predefinito è 1, 5 e può essere modificato nel codice qui. Se la vibrazione è troppo impercettibile, aumenta il valore. Se senti il rumore dell'hardware dell'attuatore, diminuisci il valore.