Fondamenti UX per framework tattile

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 .

Principi dell'esperienza utente

Figura 1. Principi attuali

La tabella seguente elenca tutte le API aptiche disponibili.

API Metodi Anno aggiunto
android.view.HapticFeedbackConstants
  • CONTESTO_CLIC
  • CLOCK_TICK
  • CHIAVE_VIRTUALE
  • TASTIERA_TAP
  • PREMERE A LUNGO
Prima del 2016
  • TASTIERA_PRESS
  • TASTIERA_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFERMARE
  • RIFIUTARE
  • GESTO_INIZIO
  • GESTO_END
2020 (Android 11)
android.Visualizza
  • eseguireHapticFeedback()
Prima del 2016
android.os.Vibrator
  • vibrare()
  • haVibratore()
Prima del 2016
  • haAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • sonoPrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • creaUnoShot()
  • creaforma d'onda()
2017 (Android 8)
  • EFFETTO_TICK
  • EFFETTO_CLIC
  • EFFETTO_PESANTE_CLICK
  • EFFETTO_DOUBLE_CLICK
  • createPredefinito()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • aggiungiPrimitiva()
  • comporre()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannels disattivato()
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.

Premi e rilascia

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.

Haptics ricco

Figura 4. Aspetti tattili ricchi con texture scorrevole

Trascinando e scorrendo

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'

  1. 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.
  2. Usa VibrationEffect . createWaveform(timings[], amplitudes[], int repeat) .

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

Lunga vibrazione

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.

Coppia audio

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 o SoundPool .

    • 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 con MediaPlayer e SoundPool .
  • 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

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

    su false 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.
  • L'HAL del vibratore deve implementare il supporto del controllo esterno.

Aptica accoppiata audio

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.

Haptic Generator architecture

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.

  1. 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 .

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

  3. 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 .

  4. 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 .

  5. 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.

  6. 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.