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).
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.
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));
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.