Base UX per framework tattile

Tutti i miglioramenti del framework Android basati sull'aptica sono guidati da una serie di principi UX che si stanno evolvendo di pari passo. I principi attuali implicano la sostituzione di vibrazioni vibranti con tattili chiari e l'esplorazione di tattili ricchi .

Principi UX

Figura 1. Principi attuali

La tabella seguente elenca tutte le API aptiche disponibili.

API Metodi Anno aggiunto
Android.view.HapticFeedbackConstants
  • CONTESTO_CLICK
  • CLOCK_TICK
  • VIRTUALE_KEY
  • KEYBOARD_TOP
  • PREMERE A LUNGO
Prima del 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFERMARE
  • RIFIUTARE
  • GESTO_START
  • GESTO_END
2020 (Android 11)
Android.View
  • eseguireHapticFeedback()
Prima del 2016
android.os.vibratore
  • vibrare()
  • ha vibratore()
Prima del 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefinito()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitivo()
  • comporre()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

Vibrazione rumorosa

Risalendo ai cercapersone e ai feature phone, le vibrazioni basate sul cicalino ERM di bassa qualità ma efficienti dal punto di vista energetico sono state utilizzate come sostituti degli squilli uditivi in ​​modalità silenziosa . I componenti hardware legacy che producono rumori udibili forti e sgradevoli possono danneggiare l'UX tattile fornendo impressioni di bassa qualità (ad esempio, un telefono economico e rotto).

Chiaro aptico

L' aptica 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 aptici chiari vengono generati come una singola entità (ad esempio, un effetto aptico per un evento di input).

Android mira a fornire una sensazione tattile chiara con sensazioni forti ma nitide piuttosto che sensazioni ronzanti o mollicce.

Le costanti tattili predefinite create per supportare tattili chiari 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

In VibrationEffect :

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

Costruire una conoscenza comune tra i produttori di dispositivi e gli sviluppatori è la chiave per aumentare la qualità complessiva degli aptici nell'ecosistema Android. Utilizzare l' elenco di controllo di base , la valutazione dell'hardware e il CDD . per saperne di più sull'implementazione aptica.

Premi e rilascia

Figura 3. Premere e rilasciare.

Ricco tattile

L'aptica ricca è una categoria di tattili in crescita che va oltre i singoli effetti basati sull'impulso. Android mira a supportare un aptico ricco con elevata componibilità e regolabilità con un livello di granularità fine. I seguenti casi d'uso sono supportati in Android 11 o versioni precedenti.

Ricco Haptics

Figura 4. Haptics ricco con texture scorrevole

Trascinamento e scorrimento

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 tattile fantasma), gli effetti tattili ripetuti sono preferibilmente nitidi e sottili.

Se l'effetto individuale è vivace piuttosto che nitido, è probabile che gli intervalli tra le ripetizioni vengano spazzati via. Il risultato è un lungo ronzio, piuttosto che più segnali discreti.

Se l'ampiezza non è abbastanza sottile, allora l'energia tattile percepita si accumula attraverso la ripetizione, risultando in una sensazione tattile straordinariamente forte alla fine della ripetizione.

Implementazione di una semplice texture tattile di superficie per i gesti di scorrimento e trascinamento

Usa CLOCK_TICK e TEXT_HANDLE_MOVE in HapticFeedbackConstants . Queste costanti predefiniscono le caratteristiche della ripetizione e dell'ampiezza.

Creare il tuo effetto

Per creare il tuo effetto, componi un disegno mettendo insieme sequenze di PRIMITIVE_CLICK e PRIMITIVE_TICK in VibrationEffect.Composition . È possibile regolare le caratteristiche della scala di ripetizione e ampiezza utilizzando addPrimitive(int primitiveID, float scale, int delay) . Il supporto si basa sulla capacità CAP_COMPOSE_EFFECTS dell'interfaccia HAL del vibratore .

Caso d'uso 2: vibrazione lunga con effetto di allentamento

La vibrazione lunga è una vibrazione di ampiezza regolare che passa da 0 all'ampiezza target. Vibrazioni lunghe possono generare tattili attenzionali facilmente percepibili. Tuttavia, una lunga vibrazione improvvisa può spaventare gli utenti in un ambiente tranquillo e spesso produce ronzii udibili. Per generare una vibrazione lunga più piacevole, applicare l'effetto di allentamento all'inizio della vibrazione lunga. Ciò produce una transizione graduale dell'ampiezza che si sviluppa verso l'ampiezza target.

Applicazione dell'effetto disinvolto

  1. Verifica le capacità hardware del controllo dell'ampiezza con android.os.Vibrator.hasAmplitudeControl() .

    • Il risultato deve essere true per produrre un effetto di allentamento con ampiezza variabile.
  2. Usa VibrationEffect . createWaveform(timings[], amplitudes[], int repeat) .

  3. Regolare la serie di timings[] e amplitudes[] per generare la curva di andamento, come mostrato nella Figura 6.

Vibrazione lunga

Figura 6. Curva di allentamento vibrazioni lunghe

Caso d'uso 3: aptico accoppiato audio

Gli aptici accoppiati all'audio sono schemi tattili accoppiati al ritmo dell'audio per attirare l'attenzione dell'utente.

Tattili accoppiati audio: vantaggi

Per implementare l'aptica accoppiata all'audio, combina l'aptica chiara con vibrazioni lunghe. Le sensazioni tattili forti ma brevi di tattili chiari 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 delle sensazioni. Se non c'è il senso del ritmo, l'utente percepisce le sensazioni tattili come ronzii casuali e tende a ignorarle.

Coppia audio

Figura 7. Esempio di coppia audio aptica

Aptici accoppiati audio: suggerimenti per l'implementazione

L'implementazione della tecnologia aptica accoppiata all'audio richiede una conoscenza di base della riproduzione dei contenuti dei canali audio e aptici. Tieni a mente le seguenti cose.

  • Usa le classi MediaPlayer o SoundPool .

    • Gli asset in formato OGG con una speciale chiave di metadati ( ANDROID_HAPTIC seguito da un numero di canali aptici) indicano la presenza di dati aptici e la riproduzione con MediaPlayer e SoundPool .
  • Indicare il supporto di aptici e riproduzione audio in audio_policy_configuration.xml .

    • Utilizzare un profilo di destinazione con canale AUDIO_CHANNEL_OUT_HAPTIC_A|B .
    • Per un flusso di output con canali aptici, ricorda che i canali aptici sono presentati come canali aggiuntivi nei dati.

    Esempio

    Se la maschera del canale per il flusso di output è simile a questa:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    Quindi ogni campione dovrebbe assomigliare a questo:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • Modifica AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)

    su false per riprodurre il canale aptico.

    • Per impostazione predefinita, i canali aptici sono silenziati ( true ).
    • I casi d'uso includono suonerie e suoni dell'interfaccia utente con feedback e feedback sincroni.
  • Il vibratore HAL deve implementare un supporto di controllo esterno.

Aptici accoppiati audio

Figura 8. Implementazione della tecnologia aptica accoppiata all'audio

Aptici accoppiati audio: Generatore aptico

HapticGenerator è un effetto audio introdotto in Android 12 in grado di generare dati aptici da un canale audio e riprodurli in tempo reale come aptici accoppiati con audio . L'effetto viene applicato AudioTrack come descritto nella Figura 9.

Haptic Generator architecture

Figura 9. Architettura del generatore aptico

Per assicurarti che l'algoritmo del tuo generatore tattile generi tattili di alta qualità, sintonizza l'algoritmo di generazione sul motore vibratorio 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 regolarli in base alle specifiche hardware.

  1. Frequenza di risonanza per 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, al fine di 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 per questo parametro è 150Hz . Questo può essere modificato nel codice qui .

  2. Potenza 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 .

  3. Fattore Q per filtro band-stop

    Il fattore di qualità del vibratore (fattore Q) è determinato da due parametri:

    • Lo Zero Q, il fattore di qualità degli zeri nel filtro band-stop che annulla parzialmente la risonanza.

    • Il Pole Q, il fattore di qualità dei poli nel filtro band-stop.

    Il rapporto di questi due valori limita la soppressione della risonanza al fine di 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 Vibrator HAL IVibrator.getQFactor .

    Se i valori predefiniti non tengono conto dello smorzamento della potenza del motore nel dispositivo, si consiglia di modificare entrambi i valori contemporaneamente e di aumentarli o di diminuirli entrambi. Il rapporto tra Zero Q e Polo Q dovrebbe essere maggiore di 1 . Questo può essere modificato nel codice qui .

  4. Frequenza d'angolo per distorsione

    La frequenza d'angolo è 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 .

  5. Guadagno di ingresso e soglia del cubo per la distorsione

    Questi parametri sono 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. Si possono trovare 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, si consiglia di tracciare le risposte in frequenza dei filtri e osservare come le risposte in frequenza cambiano con valori di parametro diversi.

  6. Guadagno in uscita per distorsione

    Questo parametro controlla l'ampiezza della vibrazione finale. È un guadagno finale applicato dopo un limitatore morbido che limita le ampiezze di vibrazione a meno di 1. Il suo valore predefinito è 1.5 e può essere modificato nel codice qui . Se la vibrazione è troppo sottile, aumentare il valore. Se si sente il tintinnio dell'hardware dell'attuatore, diminuire il valore.