Base de UX para framework tátil

Todas as melhorias do framework do Android criadas em torno de haptics são orientadas por um conjunto de princípios de UX que estão evoluindo em uma taxa igual. Os princípios atuais envolvem substituir a vibração zumbido por sensoriamento tátil claro e explorar sensoriamento tátil rico.

Princípios da UX

Figura 1. Princípios atuais

A tabela a seguir lista todas as APIs de haptics disponíveis.

API Métodos Ano da adição
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
Antes de 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRMAR
  • RECUSAR
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Antes de 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
Antes de 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)

Vibração de zumbido

Desde os pagers e os feature phones, as vibrações baseadas em zumbidos de ERM de baixa qualidade, mas com eficiência energética, foram usadas como substitutos para o toque auditivo no modo silencioso. Os componentes de hardware legados que produzem ruídos altos e desagradáveis podem prejudicar a UX tátil ao gerar impressões de baixa qualidade (por exemplo, um smartphone barato e quebrado).

Limpar retorno tátil

Os sensores táteis claros oferecem suporte à sensação de mudanças de estado discretas (por exemplo, mudanças binárias durante o processo de ligar/desligar). Devido à natureza da affordance discreta, as hápticas claras são geradas como uma única entidade (por exemplo, um efeito háptico por evento de entrada).

O objetivo do Android é oferecer retorno tátil claro com sensações fortes, mas nítidas, em vez de sensações que sejam barulhentas ou indefinidas.

As constantes táteis predefinidas criadas para oferecer suporte a haptics claros incluem as seguintes.

Em 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

Em VibrationEffect:

  • EFFECT_CLICK
  • EFFECT_DOUBLE_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_TICK

Criar conhecimento comum entre fabricantes de dispositivos e desenvolvedores é fundamental para aumentar a qualidade geral das vibrações no ecossistema Android. Use a lista de verificação básica, a avaliação de hardware e o CDD para saber mais sobre a implementação de retorno tátil.

Pressione e solte

Figura 3. Pressionando e soltando.

Retorno tátil avançado

Haptics avançados é uma categoria de haptics em crescimento que vai além dos efeitos baseados em impulso único. O objetivo do Android é oferecer suporte a haptics avançados com alta composibilidade e capacidade de ajuste com um nível fino de granularidade. Os seguintes casos de uso são compatíveis com o Android 11 ou versões anteriores.

Retorno tátil avançado

Figura 4. Sensação tátil avançada com textura deslizante

Arrastar e deslizar

Figura 5. Arrastar e deslizar

Caso de uso 1: textura deslizante

Se um efeito háptico for repetido enquanto o dedo desliza sobre uma superfície de toque (por exemplo, arrastando, deslizando, explorando a superfície com textura háptica fantasma), os efeitos hápticos repetidos serão preferencialmente nítidos e sutis.

Se o efeito individual for ruído em vez de nítido, os intervalos entre as repetições provavelmente serão apagados. O resultado é um zumbido longo, em vez de vários sinais discretos.

Se a amplitude não for sutil o suficiente, a energia háptica percebida vai aumentar com a repetição, resultando em uma resposta háptica extremamente forte no final da repetição.

Implementar uma textura háptica simples para gestos de deslizar e arrastar

Use CLOCK_TICK e TEXT_HANDLE_MOVE em HapticFeedbackConstants. Essas constantes predefinem características de repetição e amplitude.

Criar seu próprio efeito

Para criar seu próprio efeito, crie um design unindo sequências de PRIMITIVE_CLICK e PRIMITIVE_TICK em VibrationEffect.Composition. É possível ajustar as características da repetição e da escala de amplitude usando addPrimitive(int primitiveID, float scale, int delay). O suporte depende da capacidade CAP_COMPOSE_EFFECTS da interface HAL do vibrador.

Caso de uso 2: vibração longa com efeito de facilidade

A vibração longa é uma vibração de amplitude suave que faz a transição de 0 para a amplitude de destino. A vibração longa pode gerar haptics de atenção fácilmente perceptíveis. No entanto, uma vibração longa e repentina pode assustar os usuários em um ambiente tranquilo e, muitas vezes, produz ruídos audíveis. Para gerar uma vibração longa mais agradável, aplique o efeito de transição suave no início da vibração longa. Isso produz uma transição de amplitude suave que se desenvolve em direção à amplitude de destino.

Aplicar o efeito de aceleração

  1. Verifique os recursos de hardware do controle de amplitude com android.os.Vibrator.hasAmplitudeControl().

    • O resultado precisa ser true para produzir o efeito de facilidade com amplitude variável.
  2. Use VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).

  3. Ajuste a série de timings[] e amplitudes[] para gerar a curva de transição suave, conforme mostrado na Figura 6.

Vibração longa

Figura 6. Curva de transição suave de vibração longa

Caso de uso 3: háptica acoplada ao áudio

Os efeitos táteis combinados com áudio são padrões táteis combinados com o ritmo do áudio para chamar a atenção do usuário.

Háptica acoplada a áudio: benefícios

Para implementar a resposta tátil combinada com áudio, combine respostas tátil claras com vibrações longas. As sensações táteis fortes, mas curtas, de haptics claras oferecem padrões rítmicos discretos. Quando combinado com os altos níveis de estímulos que a vibração longa oferece, isso ajuda a chamar a atenção do usuário.

É importante considerar os padrões rítmicos da sensação. Se não houver um sentido de ritmo, o usuário vai perceber as sensações táteis como zumbidos aleatórios e vai tender a ignorá-las.

Pares de áudio

Figura 7. Exemplo de retorno tátil de áudio acoplado

Retorno tátil acoplado a áudio: dicas para implementação

A implementação de retorno tátil acoplado ao áudio requer um entendimento básico da reprodução de conteúdo dos canais de áudio e retorno tátil. Tenha em mente o seguinte.

  • Use as classes MediaPlayer ou SoundPool.

    • Recursos no formato OGG com uma chave de metadados especial (ANDROID_HAPTIC seguida por um número de canais de retorno tátil) indicam a presença de dados de retorno tátil e reprodução com MediaPlayer e SoundPool.
  • Indicação de suporte a retorno tátil e reprodução de áudio em audio_policy_configuration.xml.

    • Use um perfil de saída com o canal de retorno tátil AUDIO_CHANNEL_OUT_HAPTIC_A|B.
    • Para um stream de saída com canais hápticos, lembre-se de que os canais hápticos são apresentados como canais extras nos dados.

    Exemplo

    Se a máscara de canal do stream de saída tiver esta aparência:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    Então, cada amostra vai ficar assim:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • Mude AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) para false para reproduzir o canal de retorno tátil.

    • Por padrão, os canais hápticos estão desativados (true).
    • Os casos de uso incluem toques e sons da interface com feedback e haptics síncronos.
  • A HAL do vibrador precisa implementar o suporte ao controle externo.

Retorno tátil acoplado a áudio

Figura 8. Implementar háptica acoplada a áudio

Retorno tátil acoplado a áudio: gerador tátil

HapticGenerator é um efeito de áudio introduzido no Android 12 que pode gerar dados táteis de um canal de áudio e reproduzi-los em tempo real como táteis acoplados a áudio. O efeito é aplicado ao AudioTrack conforme descrito na Figura 9.

Arquitetura do gerador de primitivos táteis

Figura 9. Arquitetura do gerador de primitivos táteis

Para garantir que o algoritmo do gerador de retorno tátil gere retornos tátil de alta qualidade, ajuste o algoritmo de geração ao motor do vibrador do dispositivo ajustando os parâmetros que configuram a cadeia de filtros aplicados às formas de onda de áudio. Esta seção descreve esses parâmetros em detalhes e explica como ajustá-los à especificação do hardware.

  1. Frequência de ressonância para filtro passa-banda

    A frequência de ressonância do vibrador é a frequência em que um atuador tátil tem saída máxima. Esse parâmetro ajusta um antiressonador para achatar parcialmente a função de transferência de resposta, a fim de obter uma largura de banda mais ampla. O framework do Android vincula automaticamente esse valor à saída do método HAL do vibrador IVibrator.getResonantFrequency.

    O valor padrão desse parâmetro é 150 Hz. Isso pode ser modificado no código aqui.

  2. Potência de normalização para envelope lento

    Esse parâmetro determina o expoente na normalização parcial (controle de ganho automático). O valor padrão é -0,8, o que significa que 80% da variação de faixa dinâmica é removida por essa etapa de controle de ganho. Isso pode ser modificado no código aqui.

  3. Fator Q para filtro passa-banda

    O fator de qualidade do vibrador (Q) é determinado por dois parâmetros:

    • O Zero Q, o fator de qualidade dos zeros no filtro passa-banda que cancela parcialmente a ressonância.

    • O Q do pólo, o fator de qualidade dos pólos no filtro passa-banda.

    A proporção desses dois valores limita a supressão da ressonância para aumentar as frequências mais baixas e ampliar a resposta do algoritmo. Por exemplo, os valores padrão de 8 para o Q zero e 4 para o Q de pólo produzem uma proporção de 2, limitando a supressão de ressonância por um fator de 2 (6 dB). O framework do Android vincula os dois valores à saída do método HAL do vibrador IVibrator.getQFactor.

    Se os valores padrão não considerarem a atenuação da força do motor no dispositivo, recomendamos modificar os dois valores ao mesmo tempo e aumentar ou diminuir os dois. A proporção de Q0 para Qpole precisa ser maior que 1. Isso pode ser modificado no código aqui.

  4. Frequência de canto para distorção

    A frequência de canto é aplicada por um filtro passa-baixa que suprime a vibração de baixo nível e aumenta os níveis mais altos usando uma distorção cúbica. O padrão é 300 Hz. Isso pode ser modificado no código aqui.

  5. Ganho de entrada e limite do cubo para distorção

    Esses parâmetros são usados por um filtro de distorção não linear aplicado à forma de onda de entrada que diminui a amplitude dos sinais de frequência mais baixa e aumenta os de frequência mais alta.

    • O valor padrão para o fator de ganho de entrada é 0,3.
    • O valor padrão do limite do cubo é 0,1.

    Recomendamos modificar os dois valores juntos. Eles podem ser encontrados no código aqui.

    Para mais informações sobre a função aplicada por esse filtro, consulte a implementação disponível aqui. Para saber mais sobre como esses dois parâmetros influenciam a saída, recomendamos traçar as respostas de frequência dos filtros e observar como elas mudam com diferentes valores de parâmetro.

  6. Ganho de saída para distorção

    Esse parâmetro controla a amplitude final da vibração. É um ganho final aplicado após um limitador flexível que limita as amplitudes de vibração a menos de 1. O valor padrão é 1, 5 e pode ser modificado no código aqui. Se a vibração for muito sutil, aumente o valor. Se você ouvir o hardware do atuador vibrando, diminua o valor.