Elementi di base dell'esperienza utente per il framework aptico

Tutti i miglioramenti del framework Android basati sull'aptica sono basati su un insieme di principi UX in evoluzione allo stesso ritmo. I principi attuali prevedono la sostituzione della vibrazione vibrante con il feedback aptico chiaro e l'esplorazione del feedback aptico avanzato.

Principi UX

Figura 1. Principi attuali

La tabella seguente elenca tutte le API di aptica disponibili.

API Metodi Anno di aggiunta
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • BATTITO_OROLOGIO
  • VIRTUAL_KEY
  • TASTIERA_TAP
  • LONG_PRESS
Prima del 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFERMA
  • RIFIUTA
  • 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
  • setHapticChannelsSilentd()
2019 (Android 10)

Vibrazione rumorosa

Per quanto riguarda i cercapersone e i feature phone, le vibrazioni ERM basate sul cicalino di bassa qualità, ma ad alta efficienza energetica, sono state utilizzate in sostituzione della suoneria 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'attrattiva discreta, la tecnologia aptica chiara viene generata come una singola entità (ad esempio, un effetto aptico per un evento di input).

Android punta a offrire una tecnologia aptica chiara con sensazioni forti ma approssimative, anziché sensazioni vivaci o molli.

Le costanti aptica predefinite create per supportare l'aptica chiara includono quanto segue.

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

Sviluppare una conoscenza comune tra produttori e sviluppatori di dispositivi è fondamentale per aumentare la qualità complessiva della tecnologia aptica 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.

Stampa e comunica

Figura 3. Premere e rilasciare.

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 una tecnologia aptica avanzata con un'elevata componibilità e regolabilità con un livello di granularità. I seguenti casi d'uso sono supportati in Android 11 o versioni precedenti.

Tecnologia aptica avanzata

Figura 4. Sensibilità tattile avanzata con texture scorrevole

Trascinamento e scorrimento

Figura 5. Trascinamenti e scorrimenti

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 è abbastanza sottile, l'energia aptica percepita si accumula attraverso la ripetizione, producendo una tecnologia aptica incredibilmente forte al termine 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. La vibrazione lunga può generare una tecnologia dell'attenzione facilmente percepibile. 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 facilitazione 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

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

  3. Regola le serie di timings[] e amplitudes[] per generare la curva di ease-in, come mostrato nella Figura 6.

Vibrazione lunga

Figura 6. Curva di aumento graduale della vibrazione lunga

Caso d'uso 3: feedback aptico con accoppiamento 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.

Coppia audio

Figura 7. Esempio di accoppiamento audio e tecnologia aptica

Tecnologia aptica con accoppiamento 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 o SoundPool.

    • 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 con MediaPlayer e SoundPool.
  • 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 aptici, ricorda che i canali aptici sono 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

  • Cambia 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 e tecnologia aptica sincrona.
  • Vibrator HAL deve implementare il supporto di controllo esterno.

Tecnologia aptica audio accoppiata

Figura 8. Implementazione della tecnologia aptica accoppiata all'audio

Feedback aptico accoppiato all'audio: generatore aptico

HapticGenerator è un effetto audio introdotto 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.

Architettura di Haptic Generator

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 in dettaglio questi parametri e spiega come ottimizzarli in base alle specifiche hardware.

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

  2. 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. Questo valore può essere modificato nel codice qui.

  3. 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 annulla parzialmente la risonanza.

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

    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 dello smorzamento della potenza del motore sul dispositivo, ti consigliamo di modificare entrambi i valori contemporaneamente e di aumentarli o diminuirli. Il rapporto tra Q zero e Q polo deve essere maggiore di 1. Questo valore può essere modificato nel codice qui.

  4. Frequenza di angolo per la distorsione

    La frequenza angolare viene applicata da un filtro passa-basso che elimina le vibrazioni di basso livello e migliora i livelli più alti utilizzando una distorsione cubica. Il valore predefinito è 300 Hz. Questo valore può essere modificato nel codice qui.

  5. Guadagno dell'input 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 attenua l'ampiezza dei segnali di frequenza più bassi e aumenta quelli di frequenza più alta.

    • Il valore predefinito per il fattore di guadagno in ingresso è 0,3.
    • Il valore predefinito della 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 saperne di più su come questi due parametri influenzano l'output, ti consigliamo di tracciare le risposte in frequenza dei filtri e di osservare come cambiano le risposte in frequenza con diversi valori parametro.

  6. 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 rumore dell'hardware dell'attuatore, diminuisci il valore.