Analisar formas de onda de vibração

Os atuadores de vibração mais comuns em dispositivos Android são atuadores ressonantes lineares (LRAs, na sigla em inglês). Os LRAs simulam a sensação de um clique em um botão em uma superfície de vidro que não responde. Um sinal de feedback de clique claro e nítido geralmente dura entre 10 e 20 milissegundos. Essa sensação torna as interações do usuário mais naturais. Para teclados virtuais, esse feedback de clique pode aumentar a velocidade de digitação e reduzir erros.

Os LRAs têm algumas frequências de ressonância comuns:

  • Alguns LRAs tinham frequências de ressonância na faixa de 200 a 300 Hz, que coincide com a frequência em que a pele humana é mais sensível à vibração. A sensação de vibrações nessa faixa de frequência geralmente é descrita como suave, nítida e penetrante.
  • Outros modelos de LRAs têm frequências de ressonância mais baixas, em torno de 150 Hz. A sensação é qualitativamente mais suave e completa (em dimensão).
Os componentes incluem, de cima para baixo, uma tampa, uma placa, um ímã
       central, dois ímãs laterais, massa, duas molas, bobina, circuito flexível, base
       e adesivo.
Componentes de um atuador de ressonância linear (LRA, na sigla em inglês).

Dada a mesma tensão de entrada em duas frequências diferentes, as amplitudes de saída da vibração podem ser diferentes. Quanto mais distante a frequência estiver da frequência ressonante do LRA, menor será a amplitude da vibração.

Os efeitos hápticos de um determinado dispositivo usam o atuador de vibração e o driver dele. Drivers hápticos que incluem recursos de overdrive e frenagem ativa podem reduzir o tempo de subida e o toque de LRAs, resultando em uma vibração mais responsiva e clara.

Suavização de forma de onda padrão em dispositivos

Para ilustrar, considere como um padrão de forma de onda personalizado se comporta em um dispositivo genérico:

Kotlin

val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

Os gráficos a seguir mostram a forma de onda de entrada e a aceleração de saída correspondentes aos snippets de código anteriores. A aceleração aumenta gradualmente, não de repente, sempre que há uma mudança de amplitude no padrão, ou seja, em 0ms, 150ms, 200ms, 250ms e 700ms. Há também um overshoot em cada mudança de etapa de amplitude, e há um som de campainha visível que dura pelo menos 50 ms quando a amplitude de entrada cai repentinamente para 0.

Gráfico da forma de onda de entrada da função escalonada.
Gráfico da forma de onda medida real, mostrando transições mais orgânicas entre os níveis.

Padrão tátil aprimorado

Para evitar o excesso e reduzir o tempo de toque, mude as amplitudes de forma mais gradual. A seguir, são mostrados os gráficos de forma de onda e aceleração da versão revisada:

Kotlin

val timings: LongArray = longArrayOf(
    25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
    300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
    38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
    0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Java

long[] timings = new long[] {
        25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
        300, 25, 25, 150, 25, 25, 25
    };
int[] amplitudes = new int[] {
        38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
        0, 85, 170, 255, 170, 85, 0
    };
int repeatIndex = -1; // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

Gráfico da forma de onda de entrada com etapas adicionais.
Gráfico da forma de onda medida, mostrando transições mais suaves.

Criar efeitos táteis mais complexos

Outros elementos em uma resposta satisfatória de clique são mais complicados, exigindo algum conhecimento do LRA usado em um dispositivo. Para melhores resultados, use as formas de onda pré-fabricadas do dispositivo e as constantes fornecidas pela plataforma, que permitem fazer o seguinte:

  • Use efeitos claros e primitivos.
  • Faça a concatenação para criar novos efeitos hápticos.

Essas constantes e primitivas pré-definidas podem acelerar muito seu trabalho ao criar efeitos táteis de alta qualidade.