Base UX para estrutura háptica

Todas as melhorias na estrutura do Android construídas em torno da sensação ao toque são impulsionadas por um conjunto de princípios de UX que estão evoluindo na mesma proporção. Os princípios atuais envolvem a substituição da vibração vibrante por uma sensação tátil clara e a exploração de uma sensação tátil rica .

Princípios de experiência do usuário

Figura 1. Princípios atuais

A tabela a seguir lista todas as APIs de sensação tátil disponíveis.

API Métodos Ano adicionado
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 (andróide 8)
  • CONFIRME
  • REJEITAR
  • GESTURE_START
  • GESTURE_END
2020 (andróide 11)
android.Ver
  • performHapticFeedback()
Antes de 2016
android.os.Vibrador
  • vibrar()
  • temVibrador()
Antes de 2016
  • hasAmplitudeControl()
2017 (andróide 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (andróide 11)
android.os.VibrationEffect
  • criarOneShot()
  • criarforma de onda()
2017 (andróide 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • criarPredefinido()
2019 (andróide 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • adicionarPrimitivo()
  • compor()
2020 (andróide 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (andróide 10)

Vibração vibrante

Remontando aos pagers e feature phones, vibrações baseadas em campainhas ERM de baixa qualidade, mas com baixo consumo de energia, têm sido usadas como substitutos do 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 fornecer impressões de baixa qualidade (por exemplo, um telefone barato e quebrado).

Sensibilidade ao toque clara

A sensação tátil clara suporta a sensação de mudanças discretas de estado (por exemplo, alterações binárias durante o processo de ligar/desligar). Devido à natureza da affordance discreta , a sensação tátil clara é gerada como uma entidade única (por exemplo, um efeito háptico por evento de entrada).

O Android tem como objetivo fornecer uma sensação tátil nítida com sensações fortes, porém nítidas, em vez de sensações confusas ou piegas.

As constantes táteis predefinidas que são criadas para oferecer suporte a uma sensação tátil clara incluem o seguinte.

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

Construir um conhecimento comum entre fabricantes e desenvolvedores de dispositivos é fundamental para aumentar a qualidade geral da sensação ao toque no ecossistema Android. Use a lista de verificação básica , avaliação de hardware e CDD . para saber mais sobre a implementação háptica.

Pressione e solte

Figura 3. Pressionando e soltando.

Háptica rica

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

Haptica rica

Figura 4. Háptica rica com textura deslizante

Arrastar e deslizar

Figura 5. Arrastar e deslizar

Caso de uso 1: Textura deslizante

Se um efeito tátil for repetido enquanto o dedo desliza sobre uma superfície de toque (por exemplo, arrastar, deslizar, explorar 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 vibrante em vez de nítido, é provável que os intervalos entre as repetições sejam eliminados. O resultado é um zumbido longo, em vez de vários sinais discretos.

Se a amplitude não for sutil o suficiente, a energia tátil percebida aumenta durante a repetição, resultando em uma sensação tátil extremamente forte no final da repetição.

Implemente uma textura tátil de superfície 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.

Crie seu próprio efeito

Para criar seu próprio efeito, componha um design agrupando sequências de PRIMITIVE_CLICK e PRIMITIVE_TICK em VibrationEffect.Composition . Você pode ajustar as características da escala de repetição e amplitude usando addPrimitive(int primitiveID, float scale, int delay) . O suporte depende do recurso CAP_COMPOSE_EFFECTS da interface Vibrator HAL .

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 alvo. A vibração longa pode gerar sensação ao toque de atenção facilmente perceptível. No entanto, uma vibração longa e repentina pode assustar os usuários em um ambiente silencioso e geralmente produz zumbidos audíveis. Para gerar uma vibração longa mais agradável, aplique o efeito easy-in no início da vibração longa. Isso produz uma transição de amplitude suave que se desenvolve em direção à amplitude alvo.

Aplique o efeito de facilidade

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

    • O resultado deve ser true para produzir 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 facilidade, conforme mostrado na Figura 6.

Vibração longa

Figura 6. Curva de facilidade de vibração longa

Caso de uso 3: sensação tátil acoplada a áudio

A sensação tátil acoplada ao áudio são padrões táteis acoplados ao ritmo do áudio para chamar a atenção do usuário.

Háptica acoplada a áudio: benefícios

Para implementar uma sensação tátil acoplada ao áudio, combine uma sensação tátil nítida com vibrações longas. As sensações táteis fortes, mas curtas, da sensação tátil clara proporcionam padrões rítmicos discretos. Quando combinado com os altos níveis de estímulos que a vibração longa proporciona, isso faz um ótimo trabalho para chamar a atenção do usuário.

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

Casal de áudio

Figura 7. Exemplo de sensação tátil de casal de áudio

Háptica acoplada a áudio: dicas para implementação

A implementação de sensação tátil acoplada a áudio requer uma compreensão básica da reprodução de conteúdo de canais de áudio e hápticos. Tenha o seguinte em mente.

  • Use as classes MediaPlayer ou SoundPool .

    • Ativos no formato OGG com uma chave de metadados especial ( ANDROID_HAPTIC seguida por vários canais táteis) indicam a presença de dados táteis e reprodução com MediaPlayer e SoundPool .
  • Indique suporte para sensação tátil e reprodução de áudio em audio_policy_configuration.xml .

    • Use um perfil de saída com canal tátil AUDIO_CHANNEL_OUT_HAPTIC_A|B .
    • Para um fluxo 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 fluxo de saída for semelhante a esta:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    Então cada amostra deve ficar assim:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

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

    • Por padrão, os canais hápticos estão silenciados ( true ).
    • Os casos de uso incluem toques e sons de interface do usuário com sensação tátil e feedback síncronos.
  • O Vibrador HAL deve implementar suporte de controle externo.

Haptics acoplado de áudio

Figura 8. Implementando sensação tátil acoplada a áudio

Háptica acoplada a áudio: Gerador háptico

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 sensação tátil acoplada a áudio . O efeito é aplicado ao AudioTrack conforme descrito na Figura 9.

Haptic Generator architecture

Figura 9. Arquitetura do Gerador Háptico

Para garantir que seu algoritmo gerador de sensação tátil gere sensação tátil de alta qualidade, ajuste o algoritmo de geração ao motor 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 detalhadamente e explica como ajustá-los de acordo com a especificação do seu hardware.

  1. Frequência ressonante para filtro passa-faixa

    A frequência ressonante do vibrador é a frequência na qual um atuador háptico tem saída máxima. Este parâmetro ajusta um anti-ressonador para nivelar parcialmente a função de transferência de resposta, a fim de obter uma largura de banda mais ampla. A estrutura Android vincula automaticamente esse valor à saída do método Vibrator HAL IVibrator.getResonantFrequency .

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

  2. Poder de normalização para envelope lento

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

  3. Fator Q para filtro de parada 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 parada de banda que cancela parcialmente a ressonância.

    • O Pólo Q, o fator de qualidade dos pólos no filtro de parada de banda.

    A relação entre esses 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 Zero Q e 4 para Pole Q produzem uma relação de 2 , limitando a supressão de ressonância por um fator de 2 (6 dB). A estrutura Android vincula ambos os valores à saída do método Vibrator HAL IVibrator.getQFactor .

    Se os valores padrão não levarem em conta o amortecimento da força do motor no seu dispositivo, recomendamos modificar ambos os valores ao mesmo tempo e aumentar ou diminuir ambos. A proporção de Zero Q para Pólo Q deve 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 é 300Hz . Isso pode ser modificado no código aqui .

  5. 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 os de frequência mais alta.

    • 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 aqui .

    Para mais informações sobre a função aplicada por este 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 as respostas de frequência mudam com diferentes valores de parâmetros.

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

    Este parâmetro controla a amplitude final da vibração. É um ganho final aplicado após um limitador suave que limita as amplitudes de vibração a menos de 1. Seu 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 barulho do hardware do atuador, diminua o valor.