Base de UX para framework tátil

Todas as melhorias no framework Android criadas em torno da háptica são impulsionadas por um conjunto de princípios de UX que evoluem na mesma proporção. Os princípios atuais envolvem a substituição da vibração agitada por háptica clara e a exploração da háptica avançada.

Princípios da UX

Figura 1. Princípios atuais.

A tabela a seguir lista todas as APIs hápticas disponíveis:

API Métodos e constantes 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)
  • CONFIRM
  • REJECT
  • 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 com zumbido

Desde os pagers e telefones básicos, vibrações baseadas em campainhas de baixa qualidade, mas com eficiência energética, de massa rotativa excêntrica (ERM, na sigla em inglês) são usadas como substitutas do toque auditivo no modo silencioso. Os componentes de hardware legados que produzem ruídos audíveis altos e desagradáveis podem prejudicar a experiência tátil do usuário ao fornecer impressões de baixa qualidade (por exemplo, um smartphone barato e quebrado).

Limpar retorno tátil

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

O Android tem como objetivo oferecer respostas táteis claras com sensações fortes, mas nítidas, em vez de sensações vibratórias ou confusas.

As constantes hápticas predefinidas criadas para oferecer suporte a hápticos claros incluem os seguintes elementos.

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 da resposta tátil 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 háptica.

Tocar e soltar

Figura 2. Pressionar e soltar.

Retorno tátil avançado

A háptica avançada é uma categoria crescente que vai além dos efeitos simples baseados em impulsos. O Android tem como objetivo oferecer suporte a hápticos avançados com alta capacidade de composição e ajuste com um nível de granularidade refinado. Os seguintes casos de uso são compatíveis com o Android 11 ou versões anteriores.

Retorno tátil avançado

Figura 3. Resposta tátil avançada com textura deslizante.

Arrastar e deslizar

Figura 4. 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 instável em vez de nítido, os intervalos entre as repetições provavelmente serão eliminados. 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 se acumulando com a repetição, resultando em háptica excessivamente forte no final da repetição.

Implementar uma textura háptica de superfície 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, componha um design juntando 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 aceleração

A vibração longa é uma vibração de amplitude suave que faz a transição de 0 para a amplitude desejada. A vibração longa pode gerar háptica atencional perceptível. No entanto, uma vibração longa e repentina pode assustar os usuários em um ambiente silencioso e geralmente produz ruídos audíveis. Para gerar uma vibração longa mais agradável, aplique o efeito de aceleração no início da vibração longa. Isso produz uma transição de amplitude suave que se aproxima da amplitude desejada.

Aplicar o efeito de aceleração gradual

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

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

  3. Ajuste as séries de timings[] e amplitudes[] para gerar a curva de aceleração, conforme mostrado na Figura 5.

Vibração longa

Figura 5. Curva de aceleração de vibração longa.

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

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.

Tátil acoplado a áudio: benefícios

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

É importante considerar os padrões rítmicos de sensação. Se não houver senso de ritmo, o usuário vai perceber as sensações táteis como vibrações aleatórias e tende a ignorá-las.

Casal de áudio

Figura 6. Exemplo de háptica acoplada a áudio.

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

Para implementar a háptica acoplada ao áudio, é preciso ter um conhecimento básico da reprodução de conteúdo de canais de áudio e hápticos. Lembre-se do 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 hápticos) indicam a presença de dados hápticos e reprodução com MediaPlayer e SoundPool.
  • Indique a compatibilidade com háptica e reprodução de áudio em audio_policy_configuration.xml.

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

    Exemplo

    Se a máscara de canal para o fluxo de saída for assim:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    Cada exemplo vai ficar assim:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • Mude AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) para false e reproduza o canal háptico.

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

Retorno tátil acoplado a áudio

Figura 7. Implementação de efeitos táteis combinados com áudio.

Funcionalidade tátil acoplada a áudio: HapticGenerator

O 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átil acoplado a áudio. O efeito é aplicado a AudioTrack, conforme ilustrado na Figura 8:

Arquitetura do gerador de primitivos táteis

Figura 8. Arquitetura do gerador háptico.

Essa visualização de arquitetura mostra onde o gerador háptico é aplicado ao fluxo de áudio do usuário antes de ser enviado para a HAL de áudio. O gerador é aplicado depois que AudioMixer divide os dados de áudio e hápticos e antes de qualquer outro efeito de áudio. A saída dele substitui todos os dados hápticos anteriores no fluxo.

Para garantir que o algoritmo gerador de resposta tátil crie vibrações de alta qualidade, ajuste o algoritmo de geração ao motor vibrador do dispositivo ajustando os parâmetros que configuram a cadeia de filtros aplicada às formas de onda de áudio. Nesta seção, descrevemos esses parâmetros em detalhes e explicamos como ajustá-los à especificação de hardware.

  • Frequência de ressonância para filtro passa-banda

    A frequência de ressonância do vibrador é aquela em que um atuador háptico tem saída máxima. Esse parâmetro ajusta um antirresonador para achatar parcialmente a função de transferência de resposta e conseguir uma largura de banda maior. O framework Android vincula automaticamente esse valor à saída do método Vibrator HAL IVibrator.getResonantFrequency.

    O valor padrão desse parâmetro é 150 Hz. É possível modificar isso no código.

  • 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. Você pode modificar isso no código.

  • Fator Q para filtro de rejeição de banda

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

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

    • O polo Q, o fator de qualidade dos polos no filtro de rejeição de 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 Zero Q e 4 para o Pole Q 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 IVibrator.getQFactor do HAL do vibrador.

    Se os valores padrão não considerarem a redução da força do motor no seu dispositivo, recomendamos modificar os dois valores ao mesmo tempo, aumentando ou diminuindo ambos. A proporção de Q zero para Q polo precisa ser maior que 1. Você pode modificar isso no código.

  • Frequência de corte para distorção

    A frequência de corte é 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, mas é possível modificar isso no código.

  • 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 reduz a amplitude dos sinais de baixa frequência e aumenta a amplitude dos sinais de alta frequência.

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

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

    Para mais informações sobre a função aplicada por esse filtro, consulte a implementação no código.

    Para saber mais sobre como esses dois parâmetros influenciam a saída, recomendamos criar um gráfico das respostas de frequência dos filtros e observar como elas mudam com diferentes valores de parâmetros.

  • 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 você pode modificar isso no código.

    Se a vibração for muito sutil, aumente o valor. Se você ouvir o hardware do atuador vibrando, diminua o valor.