Tutti i miglioramenti del framework Android basati sull'aptica sono guidati da una serie di principi UX che si evolvono allo stesso ritmo. I principi attuali prevedono la sostituzione delle vibrazioni rumorose con una sensazione tattile chiara e l'esplorazione di una sensazione tattile ricca .
Figura 1. Principi attuali
La tabella seguente elenca tutte le API aptiche disponibili.
API | Metodi | Anno aggiunto |
---|---|---|
android.view.HapticFeedbackConstants |
| Prima del 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.Visualizza |
| 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 vivace
Fin dai tempi dei cercapersone e dei feature phone, le vibrazioni basate su cicalino ERM di bassa qualità ma efficienti dal punto di vista energetico sono state utilizzate come sostituto dello squillo uditivo in modalità silenziosa . I componenti hardware legacy che producono rumori forti e sgradevoli possono danneggiare l'UX tattile fornendo impressioni di bassa qualità (ad esempio, un telefono economico e rotto).
Tattilità chiara
Una sensazione tattile chiara supporta la sensazione di cambiamenti di stato discreti (ad esempio, cambiamenti binari durante il processo di accensione/spegnimento). A causa della natura dell'affordance discreta , gli elementi aptici chiari vengono generati come una singola entità (ad esempio, un effetto tattile per un evento di input).
Android mira a fornire una sensazione tattile chiara con sensazioni forti ma acute piuttosto che sensazioni vivaci o molli.
Le costanti tattili predefinite create per supportare una sensazione tattile chiara includono quanto segue.
Nelle HapticFeedbackConstants
:
-
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
Nell'effetto VibrationEffect
:
-
EFFECT_CLICK
-
EFFECT_DOUBLE_CLICK
-
EFFECT_HEAVY_CLICK
-
EFFECT_TICK
Costruire una conoscenza comune tra produttori e sviluppatori di dispositivi è fondamentale per aumentare la qualità complessiva dell'aptica nell'ecosistema Android. Utilizzare l' elenco di controllo di base , la valutazione dell'hardware e la CDD . per saperne di più sull'implementazione tattile.
Figura 3. Pressione e rilascio.
Tattica ricca
La Rich Haptics è una categoria tattile in crescita che va oltre i singoli effetti basati sugli impulsi. Android mira a supportare aspetti tattili avanzati con elevata componibilità e regolabilità con un livello elevato di granularità. I seguenti casi d'uso sono supportati in Android 11 o versioni precedenti.
Figura 4. Aspetti tattili ricchi con texture scorrevole
Figura 5. Trascinamento e scorrimento
Caso d'uso 1: texture scorrevole
Se un effetto tattile viene ripetuto mentre il dito scorre su una superficie tattile (ad esempio, trascinando, scorrendo, esplorando la superficie con una trama aptica fantasma), gli effetti tattili ripetuti sono preferibilmente nitidi e sottili.
Se l'effetto individuale è vivace anziché nitido, è probabile che gli intervalli tra le ripetizioni vengano cancellati. Il risultato è un lungo ronzio, anziché molteplici segnali discreti.
Se l'ampiezza non è sufficientemente sottile, l'energia tattile percepita si accumula attraverso la ripetizione, risultando in un'esperienza tattile straordinariamente forte alla fine della ripetizione.
Implementa una semplice texture tattile 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 disegno unendo sequenze di PRIMITIVE_CLICK
e PRIMITIVE_TICK
in VibrationEffect.Composition
. È possibile 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 facilitato
La vibrazione lunga è una vibrazione di ampiezza uniforme che passa da 0 all'ampiezza target. Una lunga vibrazione può generare un'ottica attenzionale facilmente percepibile. Tuttavia, una vibrazione improvvisa e prolungata può spaventare gli utenti in un ambiente silenzioso e spesso produce ronzii udibili. Per generare una vibrazione lunga più piacevole, applicare l'effetto di facilitazione all'inizio della vibrazione lunga. Ciò produce una transizione graduale dell'ampiezza che si avvicina all'ampiezza target.
Applica l'effetto facilita'
Controlla le capacità hardware del controllo dell'ampiezza con
android.os.Vibrator.hasAmplitudeControl()
.- Il risultato deve essere
true
per produrre un effetto di facilitazione con ampiezza variabile.
- Il risultato deve essere
Usa
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Regolare la serie di
timings[]
eamplitudes[]
per generare la curva di facilità, come mostrato nella Figura 6.
Figura 6. Curva di adattamento delle vibrazioni lunghe
Caso d'uso 3: aptica accoppiata all'audio
Gli aspetti tattili accoppiati all'audio sono modelli tattili accoppiati al ritmo dell'audio per attirare l'attenzione dell'utente.
Aptica accoppiata audio: vantaggi
Per implementare l'aspetto tattile accoppiato all'audio, combina un'aspetto tattile chiaro con vibrazioni lunghe. Le sensazioni tattili forti ma brevi dell'ottica chiara forniscono schemi ritmici discreti. Se combinato con gli alti livelli di stimoli forniti dalla vibrazione lunga, questo fa un ottimo lavoro per attirare l'attenzione dell'utente.
È importante considerare gli schemi ritmici della sensazione. Se non c'è il senso del ritmo, l'utente percepisce le sensazioni tattili come ronzii casuali e tende a ignorarli.
Figura 7. Esempio di aspetti tattili della coppia audio
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 tattili. Tieni a mente le seguenti cose.
Utilizza le classi
MediaPlayer
oSoundPool
.- Le risorse in formato OGG con una chiave di metadati speciale (
ANDROID_HAPTIC
seguita da un numero di canali tattili) indicano la presenza di dati tattili e la riproduzione conMediaPlayer
eSoundPool
.
- Le risorse in formato OGG con una chiave di metadati speciale (
Indicare il supporto dell'aptica e della riproduzione 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 tattili, ricorda che i canali tattili sono presentati come canali aggiuntivi nei dati.
Esempio
Se la maschera del canale per il flusso di output è simile alla seguente:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Quindi ogni campione dovrebbe assomigliare a questo:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Utilizza un profilo di output con il canale aptico
Cambia
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
sufalse
per riprodurre il canale tattile.- Per impostazione predefinita, i canali tattili sono disattivati (
true
). - I casi d'uso includono suonerie e suoni dell'interfaccia utente con feedback e feedback tattili sincroni.
- Per impostazione predefinita, i canali tattili sono disattivati (
L'HAL del vibratore deve implementare il supporto del controllo esterno.
- Per le implementazioni HIDL , utilizzare
setExternalControl(bool enabled) generates (Status status)
. - Per le implementazioni AIDL , utilizzare
void setExternalControl(in boolean enabled)
.
- Per le implementazioni HIDL , utilizzare
Figura 8. Implementazione dell'aptica accoppiata all'audio
Aptica accoppiata audio: generatore tattile
HapticGenerator
è un effetto audio introdotto in Android 12 che può generare dati tattili da un canale audio e riprodurli in tempo reale come aptici accoppiati all'audio . L'effetto viene applicato alla AudioTrack
come descritto nella Figura 9.
Figura 9. Architettura del generatore aptico
Per assicurarti che l'algoritmo del tuo generatore aptico generi elementi tattili di alta qualità, sintonizza l'algoritmo di generazione sul motore del vibratore del dispositivo regolando i parametri che configurano la catena di filtri che applica alle forme d'onda audio. Questa sezione descrive questi parametri in dettaglio e spiega come adattarli alle specifiche hardware.
Frequenza di risonanza del filtro passa banda
La frequenza di risonanza del vibratore è la frequenza alla quale un attuatore tattile ha la massima potenza. Questo parametro regola un anti-risonatore per appiattire parzialmente la funzione di trasferimento della risposta, al fine di 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 per questo parametro è 150Hz . Questo può essere modificato nel codice qui .
Potere di normalizzazione per inviluppo lento
Questo parametro determina l'esponente nella normalizzazione parziale (controllo automatico del guadagno). Il suo valore predefinito è -0.8 , il che significa che l'80% della variazione della gamma dinamica viene rimossa da questa fase di controllo del guadagno. Questo può essere modificato nel codice qui .
Fattore Q per il filtro elimina banda
Il fattore di qualità del vibratore (fattore Q) è determinato da due parametri:
Lo Zero Q, il fattore di qualità degli zeri nel filtro elimina banda che annulla parzialmente la risonanza.
Il Pole Q, il fattore di qualità dei poli nel filtro elimina banda.
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 Zero Q e 4 per Pole Q producono un rapporto di 2 , limitando la soppressione della risonanza con un fattore di 2 (6 dB). Il framework Android collega entrambi i valori all'output del metodo HAL del vibratore
IVibrator.getQFactor
.Se i valori predefiniti non tengono conto dello smorzamento 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 dovrebbe essere maggiore di 1 . Questo può essere modificato nel codice qui .
Frequenza d'angolo per la distorsione
La frequenza angolare 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 . Questo 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 ingresso che smorza l'ampiezza dei segnali a frequenza più bassa e aumenta quelli a frequenza più alta.
- Il valore predefinito per il fattore di guadagno in ingresso è 0,3 .
- Il valore predefinito per la soglia del cubo è 0.1 .
Si consiglia di modificare entrambi i valori insieme. Possono essere trovati nel codice qui .
Per ulteriori informazioni sulla funzione applicata da questo filtro, fare riferimento all'implementazione disponibile qui . Per saperne di più su come questi due parametri influenzano l'uscita, consigliamo di tracciare le risposte in frequenza dei filtri e osservare come le risposte in frequenza cambiano con diversi valori dei parametri.
Guadagno in uscita per la distorsione
Questo parametro controlla l'ampiezza della vibrazione finale. È un guadagno finale applicato dopo un limitatore morbido che limita le ampiezze delle vibrazioni a meno di 1. Il suo valore predefinito è 1.5 e può essere modificato nel codice qui . Se la vibrazione è troppo lieve, aumentare il valore. Se si sente il rumore dell'hardware dell'attuatore, diminuire il valore.