Basi UX per il framework aptico

Tutti i miglioramenti del framework Android basati sulla tecnologia aptica sono guidati da un insieme di principi UX che si evolvono alla stessa velocità. I principi attuali prevedono la sostituzione della vibrazione intensa con una vibrazione nitida e l'esplorazione della vibrazione ricca.

Principi UX

Figura 1. Principi attuali.

La tabella seguente elenca tutte le API aptiche disponibili:

API Metodi e costanti Anno di aggiunta
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
Prima del 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Prima del 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
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
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

Vibrazione ronzante

A partire dai cercapersone e dai feature phone, le vibrazioni basate su cicalino con massa rotante eccentrica (ERM) a bassa qualità ma efficienti dal punto di vista energetico sono state utilizzate come sostituto della suoneria uditiva in modalità silenziosa. I componenti hardware legacy che producono rumori udibili forti e sgradevoli possono danneggiare l'esperienza utente aptica fornendo impressioni di bassa qualità (ad esempio, uno smartphone economico e rotto).

Cancella feedback aptico

Clear Haptics supporta la sensazione di cambiamenti di stato discreti (ad esempio, cambiamenti binari durante il processo di accensione e spegnimento). A causa della natura dell'affordance discreta, vengono generate vibrazioni chiare come singola entità (ad esempio, un effetto aptico per ogni evento di input).

Android mira a fornire un feedback aptico chiaro con sensazioni forti ma nitide, piuttosto che sensazioni vibranti o molli.

Le costanti aptiche predefinite create per supportare l'aptica chiara includono i seguenti elementi.

In 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

Creare una conoscenza comune tra i produttori di dispositivi e gli sviluppatori è fondamentale per migliorare la qualità complessiva dell'aptica nell'ecosistema Android. Utilizza l'elenco di controllo di base, la valutazione dell'hardware e la CDD per scoprire di più sull'implementazione aptica.

Premi e rilascia

Figura 2. Premere e rilasciare.

Tecnologia aptica avanzata

L'aptica avanzata è una categoria di aptica in crescita che va oltre i singoli effetti basati sugli impulsi. Android mira a supportare l'aptica avanzata con elevata componibilità e regolabilità con un livello di granularità elevato. I seguenti casi d'uso sono supportati in Android 11 o versioni precedenti.

Tecnologia aptica avanzata

Figura 3. Feedback aptico ricco con texture scorrevole.

Trascinamento e scorrimento

Figura 4. Trascinamento e scorrimento.

Caso d'uso 1: texture scorrevole

Se un effetto aptico viene ripetuto mentre il dito scorre su una superficie di tocco (ad esempio, trascinamento, scorrimento, esplorazione della superficie con una texture aptica fantasma), gli effetti aptici ripetuti sono preferibilmente nitidi e sottili.

Se l'effetto individuale è confuso anziché nitido, è probabile che gli intervalli tra le ripetizioni vengano eliminati. Il risultato è una vibrazione lunga, anziché più segnali discreti.

Se l'ampiezza non è abbastanza sottile, l'energia aptica percepita si accumula con la ripetizione, con conseguente aptica estremamente forte alla fine della ripetizione.

Implementare una texture aptica 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 design unendo sequenze di PRIMITIVE_CLICK e PRIMITIVE_TICK in VibrationEffect.Composition. Puoi 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 di accelerazione iniziale

La vibrazione lunga è una vibrazione di ampiezza uniforme che passa da 0 all'ampiezza target. La vibrazione lunga può generare una risposta aptica percepibile. Tuttavia, una vibrazione lunga e improvvisa può spaventare gli utenti in un ambiente silenzioso e spesso produce ronzii udibili. Per generare una vibrazione lunga più piacevole, applica l'effetto di accelerazione all'inizio della vibrazione lunga. In questo modo si ottiene una transizione di ampiezza graduale che aumenta fino all'ampiezza target.

Applica l'effetto di accelerazione iniziale

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

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

  3. Regola la serie di timings[] e amplitudes[] per generare la curva di accelerazione, come mostrato nella Figura 5.

Vibrazione lunga

Figura 5. Curva di accelerazione della vibrazione lunga.

Caso d'uso 3: aptica accoppiata all'audio

La tecnologia aptica accoppiata all'audio è costituita da pattern aptici accoppiati al ritmo dell'audio per attirare l'attenzione dell'utente.

Tecnologia aptica accoppiata all'audio: vantaggi

Per implementare l'aptica accoppiata all'audio, combina l'aptica chiara con vibrazioni lunghe. Le sensazioni aptiche forti ma brevi dell'aptica nitida offrono pattern ritmici discreti. In combinazione con gli elevati livelli di stimoli forniti dalla vibrazione lunga, questo metodo attira molto bene l'attenzione dell'utente.

È importante considerare i pattern ritmici della sensazione. Se non c'è un senso del ritmo, l'utente percepisce le sensazioni aptiche come vibrazioni casuali e tende a ignorarle.

Audio Couple

Figura 6. Esempio di tecnologia aptica per la coppia audio.

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 dei canali audio e aptici. Tieni presente quanto segue:

  • 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 aptici) indicano la presenza di dati aptici e la riproduzione con MediaPlayer e SoundPool.
  • Indica il supporto della riproduzione aptica e 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 aptici, ricorda che i canali aptici 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

    Quindi, ogni campione dovrebbe avere il seguente aspetto:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • Modifica AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) in false 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 aptico e sincrono.
  • L'HAL Vibrator deve implementare il supporto del controllo esterno.

Tecnologia aptica accoppiata all'audio

Figura 7. Implementare la tecnologia aptica accoppiata all'audio.

Tecnologia aptica accoppiata all'audio: HapticGenerator

HapticGenerator è un effetto audio introdotto in Android 12 che può generare dati aptici da un canale audio e riprodurli in tempo reale come aptica accoppiata all'audio. L'effetto viene applicato a AudioTrack come illustrato nella Figura 8:

Architettura del generatore aptico

Figura 8. Architettura del generatore aptico.

Questa visualizzazione dell'architettura mostra dove viene applicato Haptic Generator al flusso audio utente in entrata prima che venga inviato all'HAL audio. Il generatore viene applicato dopo che AudioMixer divide i dati audio e aptici e prima di qualsiasi altro effetto audio. Il suo output sostituisce tutti i dati aptici precedenti nel flusso.

Per assicurarti che l'algoritmo del generatore aptico generi aptica di alta qualità, ottimizza l'algoritmo di generazione per il motore vibratore del dispositivo regolando i parametri che configurano la catena di filtri che applica alle forme d'onda audio. Questa sezione descrive questi parametri nel dettaglio e spiega come regolarli in base alle specifiche hardware.

  • Frequenza di risonanza per il 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, in modo da 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 di questo parametro è 150 Hz. Puoi modificarlo nel codice.

  • 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. Puoi modificarlo nel codice.

  • Fattore Q per il filtro passa banda

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

    • Zero Q, il fattore di qualità degli zeri nel filtro passa banda che annulla parzialmente la risonanza

    • Il Q del polo, il fattore di qualità dei poli nel filtro passa banda

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

    Se i valori predefiniti non tengono conto dell'attenuazione 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 deve essere maggiore di 1. Puoi modificarlo nel codice.

  • 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ù alti utilizzando una distorsione cubica. Il valore predefinito è 300 Hz. Puoi modificarlo nel codice.

  • Guadagno di 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 bassa frequenza e aumenta l'ampiezza dei segnali a frequenza più elevata.

    • Il valore predefinito per il fattore di guadagno dell'input è 0,3.
    • Il valore predefinito per la soglia del cubo è 0,1.

    Ti consigliamo di modificare entrambi i valori contemporaneamente. Puoi trovarli nel codice.

    Per ulteriori informazioni sulla funzione applicata da questo filtro, consulta l'implementazione nel codice.

    Per scoprire di più su come questi due parametri influenzano l'output, ti consigliamo di tracciare i grafici delle risposte in frequenza dei filtri e di osservare come cambiano le risposte in frequenza con diversi valori dei parametri.

  • Guadagno di output per la distorsione

    Questo parametro controlla l'ampiezza della vibrazione finale. È un guadagno finale applicato dopo un soft limiter che limita le ampiezze di vibrazione a un valore inferiore a 1. Il valore predefinito è 1, 5 e puoi modificarlo nel codice.

    Se la vibrazione è troppo leggera, aumenta il valore. Se senti il rumore dell'attuatore, diminuisci il valore.