Primer para atuadores de vibração

Antes de projetar efeitos táteis em um dispositivo Android, é útil ter uma visão geral de como os atuadores de vibração funcionam.

Ilustração dos componentes de um LRA tátil

Os atuadores de vibração mais comuns são os atuadores de ressonância linear (LRAs). Cada LRA consiste em uma bobina de voz presa a uma massa magnética em movimento que é conectada a uma mola. Uma tensão CA aplicada à bobina de voz cria uma força eletromagnética que faz com que a massa se mova. A mola fornece a força de restauração que faz com que a massa retorne à sua posição inicial. O movimento para frente e para trás da massa faz com que o LRA vibre. Elas têm uma frequência de ressonância em que a saída é máxima.

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

Uma função comum de LRAs em um dispositivo é simular a sensação de um clique em um botão em uma superfície de vidro não responsiva. Isso faz com que a interação do usuário pareça mais natural. Quando aplicado à digitação em um teclado virtual, o feedback de clique pode aumentar a velocidade da digitação e reduzir erros. Um sinal de feedback de clique claro e nítido normalmente tem menos de 10 a 20 milissegundos de duração. Para conseguir um bom clique, é necessário ter algum conhecimento sobre o LRA usado em um dispositivo. É por isso que confiar em formas de onda pré-fabricadas oferece o melhor feedback para um clique. É possível usá-los com as constantes fornecidas pela plataforma sempre que um feedback de clique for necessário.

Os efeitos táteis alcançáveis em um dispositivo são determinados pelo atuador de vibração e pelo motorista. Drivers táteis que incluem recursos de freagem ativa e overdrive podem reduzir o tempo de subida e o toque das LRAs, levando a uma vibração mais clara e responsiva. Para ilustrar, vamos conferir 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 // Do not 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 // Do not repeat.

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

O gráfico abaixo mostra a forma de onda correspondente aos snippets de código mostrados acima.

Representação da forma de onda de entrada da função de etapa

A aceleração correspondente é mostrada abaixo:

Representação da forma de onda medida real, mostrando mais transições orgânicas entre os níveis.

A aceleração aumenta gradualmente, não de repente, sempre que há uma mudança gradual de amplitude no padrão (por exemplo, a 0 ms, 150 ms, 200 ms, 250 ms, 700 ms). Há também uma ultrapassagem em cada mudança de amplitude em uma etapa, e há um "toque" visível que dura pelo menos 50 ms quando a amplitude de entrada cai de repente para 0.

Esse padrão tátil pode ser melhorado aumentando e diminuindo as amplitudes gradualmente para evitar ultrapassagem e redução do tempo de toque. Veja a seguir 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));

Representação da forma de onda de entrada com etapas adicionais

Representação da forma de onda medida, mostrando transições mais suaves

Assim, a criação de um efeito tátil em um dispositivo Android exige mais do que fornecer um valor de frequência e amplitude. Não é uma tarefa trivial projetar um efeito tátil do zero sem acesso total às especificações de engenharia do atuador de vibração e do driver. As APIs do Android fornecem constantes que permitem fazer o seguinte:

  • Realizar efeitos claros e primitivos.

  • Faça a concatenação deles para criar novos efeitos táteis.

Essas constantes táteis e primitivos predefinidos podem acelerar muito seu trabalho e garantir efeitos táteis de alta qualidade.