Base de UX para framework tátil

Todas as melhorias do framework do Android criadas com base no retorno tátil 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 ruidosa por retorno tátil claro e a exploração do retorno tátil avançado.

Princípios da UX

Figura 1. Princípios atuais.

A tabela a seguir lista todas as APIs de retorno tátil disponíveis:

API Métodos e constantes Ano de 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 ruidosa

Desde os pagers e feature phones, vibrações de massa rotativa excêntrica (ERM, na sigla em inglês) de baixa qualidade, mas com eficiência energética, baseadas em campainha , têm sido usadas como substituto do toque audível no modo silencioso. Os componentes de hardware legados que produzem ruídos audíveis altos e desagradáveis podem prejudicar a UX de retorno tátil, oferecendo impressões de baixa qualidade (por exemplo, um smartphone barato e quebrado).

Retorno tátil claro

O retorno tátil claro oferece suporte à sensação de mudanças de estado discretas (por exemplo, mudanças binárias durante o processo de ativação e desativação). Devido à natureza da affordance discreta, o retorno tátil claro é gerado como uma única entidade (por exemplo, um efeito de retorno tátil por evento de entrada).

O Android tem como objetivo oferecer um retorno tátil claro com sensações fortes, mas nítidas, em vez de sensações ruidosas ou confusas.

As constantes de retorno tátil predefinidas criadas para oferecer suporte ao retorno tátil claro 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

A criação de conhecimento comum entre fabricantes de dispositivos e desenvolvedores é fundamental para aumentar a qualidade geral do retorno 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 do retorno tátil.

Tocar e soltar

Figura 2. Pressionar e soltar.

Retorno tátil avançado

O retorno tátil avançado é uma categoria crescente de retorno tátil que vai além dos efeitos baseados em impulso único. O Android tem como objetivo oferecer suporte ao retorno tátil avançado com alta capacidade de composição e ajuste com um nível de granularidade refinado. Os casos de uso a seguir são compatíveis com o Android 11 ou versões anteriores.

Retorno tátil avançado

Figura 3. Retorno tátil avançado com textura deslizante.

Arrastar e deslizar

Figura 4. Arrastar e deslizar.

Caso de uso 1: textura deslizante

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

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

Se a amplitude não for sutil o suficiente, a energia de retorno tátil percebida será acumulada pela repetição, resultando em um retorno tátil excessivamente forte no final da repetição.

Implementar uma textura de retorno tátil 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 encadeando 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 de a CAP_COMPOSE_EFFECTS capacidade 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 de destino. A vibração longa pode gerar um retorno tátil atencional perceptível. No entanto, uma vibração longa 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 acumula 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 aceleração 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 aceleração, conforme mostrado na Figura 5.

Vibração longa

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

Caso de uso 3: retorno tátil acoplado ao áudio

O retorno tátil acoplado ao áudio são padrões de retorno tátil acoplados ao ritmo do áudio para chamar a atenção do usuário.

Retorno tátil acoplado ao áudio: benefícios

Para implementar o retorno tátil acoplado ao áudio, combine o retorno tátil claro com vibrações longas. As sensações de retorno tátil fortes, mas curtas, do retorno tátil claro oferecem padrões rítmicos discretos. Quando combinado com os altos níveis de estímulos que a vibração longa oferece, isso faz um ótimo trabalho para chamar a atenção de um 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 de retorno tátil como ruídos aleatórios e tende a ignorá-los.

Casal de áudio

Figura 6. Exemplo de retorno tátil acoplado ao áudio.

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

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

  • Use as classes MediaPlayer ou SoundPool.

    • Os 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.
  • Indique o suporte ao 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 fluxo de saída com canais de retorno tátil, lembre-se de que os canais de retorno tátil 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 amostra precisa ser 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 de retorno tátil são silenciados (true).
    • Os casos de uso incluem toques e sons de interface com retorno tátil e feedback síncronos.
  • O HAL do vibrador precisa implementar o suporte de controle externo.

Retorno tátil acoplado a áudio

Figura 7. Implementação do retorno tátil acoplado ao áudio.

Retorno tátil acoplado ao áudio: HapticGenerator

HapticGenerator é um efeito de áudio introduzido no Android 12 que pode gerar dados de retorno tátil de um canal de áudio e reproduzi-los em tempo real como retorno tátil acoplado ao áudio. O efeito é aplicado ao AudioTrack conforme ilustrado na Figura 8:

Arquitetura do gerador de primitivos táteis

Figura 8. Arquitetura do gerador de retorno tátil.

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

Para garantir que o algoritmo do gerador de retorno tátil gere um retorno 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 que ele aplica às formas de onda de áudio. Esta seção descreve esses parâmetros em detalhes e explica como ajustá-los à especificação de hardware.

  • Frequência ressonante para filtro passa-faixa

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

    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 automático de ganho). 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. É possível modificar isso no código.

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

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

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

    • O Q de polo, o fator de qualidade dos polos no filtro de rejeição de faixa

    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 polo 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 o amortecimento 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 Q zero para Q de polo precisa ser maior que 1. É possível modificar isso no código.

  • 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 melhora os níveis mais altos usando uma distorção cúbica. O padrão é 300 Hz. É possível modificar isso no código.

  • Ganho de entrada e limite de 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 amortece a amplitude dos sinais de frequência mais baixa e aumenta a amplitude dos sinais de frequência mais alta.

    • O valor padrão do fator de ganho de entrada é 0,3.
    • O valor padrão do limite de 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 plotar as respostas de frequência dos filtros e observar como as respostas de frequência mudam com diferentes valores de parâmetro.

  • Ganho de saída para distorção

    Esse parâmetro controla a amplitude de vibração final. É um ganho final aplicado após um limitador suave que limita as amplitudes de vibração a menos de 1. O valor padrão é 1,5, e é possível 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.