Primer para atuadores de vibração

Antes de projetar efeitos táteis em um dispositivo Android, é importante 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 ressonantes lineares (LRAs, na sigla em inglês). Cada O LRA consiste em uma bobina de voz prensada contra uma massa magnética em movimento presas 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 oferece força restauradora que faz com que a massa retorne à posição inicial. A o movimento de ida e volta da massa faz com que o LRA vibre. Eles têm frequência de ressonância em que a saída é máxima.

Dada a mesma tensão de entrada em duas frequências diferentes, o resultado as amplitudes podem ser diferentes. Quanto mais longe a frequência da frequência frequência ressonante, menor será a amplitude de vibração.

Uma função comum das LRAs em um dispositivo é simular a sensação de um botão clicar em uma superfície de vidro sem resposta. Serve para fazer com que a interação do usuário pareça mais natural. Quando aplicado à digitação em um teclado virtual, o feedback por clique pode aumentar a velocidade de digitação e reduzir os erros. Um sinal de feedback de clique claro e nítido normalmente tem menos de 10 a 20 milissegundos de duração. Como conseguir um bom clique exige algum conhecimento do LRA usado em um dispositivo. É por isso que confiar na formas de onda pré-fabricadas fornecem o melhor feedback para um clique. Você pode usar com as constantes fornecidas pela plataforma sempre que houver um feedback de clique necessários.

Os efeitos táteis atingidos em um dispositivo são determinados pela vibração atuador e o driver. Impulsionadores táteis que incluem aumento de velocidade e os recursos dos freios podem reduzir o tempo de aumento e o toque das LRAs, vibrações responsivas e claras. Para ilustrar, vamos conferir como um servidor 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.

Gráfico da forma de onda de entrada da função de etapa

A aceleração correspondente é mostrada abaixo:

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

Observe que a aceleração aumenta gradualmente, não repentinamente, uma mudança em degrau de amplitude no padrão (por exemplo, a 0ms, 150ms, 200ms, 250ms, 700ms). Há também um excesso de tempo a cada mudança de amplitude em intervalos fica visível com um "toque" por pelo menos 50 ms quando a amplitude de entrada repentina cai para 0.

Esse padrão tátil pode ser melhorado aumentando ou diminuindo as amplitudes gradualmente para evitar ultrapassar o limite e reduzir o tempo de toque. Confira a seguir 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

Sendo assim, a criação de um efeito tátil em um dispositivo Android requer mais de fornecendo um valor de frequência e amplitude. Não é uma tarefa trivial criar um efeito tátil do zero sem acesso total às especificações de engenharia do atuador de vibração e do motor. As APIs do Android oferecem constantes que você pode fazer o seguinte:

  • Use efeitos claros e primitivos.

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

Esses primitivos e constantes táteis predefinidos podem acelerar bastante seu trabalho garantindo efeitos táteis de alta qualidade.