Tutti i miglioramenti del framework Android basati sull'aptica sono guidati da un insieme di principi UX in evoluzione allo stesso ritmo. I principi attuali prevedono la sostituzione della vibrazione rumorosa 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 vibrante
Fin dai pager e dai feature phone, le vibrazioni ERM sulla base di buzzer di bassa qualità, ma a basso consumo energetico, sono state utilizzate come sostituti del suono 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'affordance discreta, le vibrazioni chiare vengono generate come una singola entità (ad esempio, un effetto aptico per un evento di input).
L'obiettivo di Android è offrire un'esperienza tattile chiara con sensazioni forti, ma nitide, anziché vibrazioni o sensazioni confuse.
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
La creazione di una conoscenza comune tra produttori di dispositivi e sviluppatori è fondamentale per migliorare la qualità complessiva dell'esperienza tattile 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. Premendo e rilasciando.
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 un'esperienza tattile avanzata con elevata composabilità e regolabilità e un livello di granularità elevato. I seguenti scenari di utilizzo sono supportati in Android 11 o versioni precedenti.
Figura 4. Sensibilità tattile avanzata con texture scorrevole
Figura 5. Trascinamento e scorrimento
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 è sufficientemente sottile, l'energia aptica percepita si accumula con la ripetizione, con un risultato di vibrazioni estremamente forti alla fine 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. Una vibrazione lunga può generare haptics di attenzione facilmente percepibili. 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 transizione 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)
.Modifica la serie di
timings[]
eamplitudes[]
per generare la curva di transizione graduale, come mostrato nella Figura 6.
Figura 6. Curva di aumento graduale della vibrazione lunga
Caso d'uso 3: feedback aptico accoppiato all'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 accoppiata all'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 a feedback aptico, ricorda che questi canali 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
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 aptico 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 aptico sono disattivati (
L'HAL Vibratore 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 8. Implementazione della tecnologia aptica accoppiata all'audio
Feedback aptico accoppiato all'audio: generatore aptico
HapticGenerator
è un effetto audiointrodotto 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 questi parametri in dettaglio 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 l'envelope lento
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 cancella parzialmente la risonanza.
Il fattore di qualità Q dei poli nel filtro passabanda.
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 dell'attenuazione della potenza del motore nel tuo dispositivo, ti consigliamo di modificare entrambi i valori contemporaneamente e di aumentarli entrambi o diminuirli entrambi. Il rapporto tra Q zero e Q polo deve essere maggiore di 1. Questo valore può essere modificato nel codice qui.
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ù elevati utilizzando una distorsione cubica. Il valore predefinito è 300 Hz. Questo valore può essere modificato nel codice qui.
Guadagno in 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 frequenza inferiore e aumenta quelli a frequenza superiore.
- Il valore predefinito per il fattore di guadagno in ingresso è 0,3.
- Il valore predefinito per la 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 scoprire di più su come questi due parametri influiscono sull'output, consigliamo di tracciare le risposte in frequenza dei filtri e di osservare come queste risposte cambiano con valori parametro diversi.
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 hardware dell'attuatore tremolare, riduci il valore.