Os atuadores de vibração mais comuns em dispositivos Android são os atuadores ressonantes lineares (LRAs). Os LRAs simulam a sensação de um clique de botão em uma superfície de vidro que, de outra forma, não responderia. Um sinal de feedback de clique claro e nítido geralmente dura entre 10 e 20 milissegundos. Essa sensação deixa 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).
Com a mesma tensão de entrada em duas frequências diferentes, as amplitudes de saída de vibração podem ser diferentes. Quanto mais distante a frequência estiver da frequência de ressonância do LRA, menor será a amplitude da vibração.
Os efeitos táteis 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 dos LRAs, resultando em uma vibração mais responsiva e clara.
Aceleração da saída do vibrador
O mapeamento de aceleração de frequência para saída (FOAM, na sigla em inglês) descreve a aceleração máxima de saída (em G de pico) que pode ser alcançada em uma determinada frequência de vibração (em Hertz). A partir do Android 16 (nível 36 da API), a plataforma oferece suporte integrado para esse mapeamento usando o VibratorFrequencyProfile. É possível usar essa classe, junto com as APIs de envelope básicas e avançadas, para criar efeitos hápticos.
A maioria dos motores LRA tem um único pico no FOAM, geralmente perto da frequência de ressonância. A aceleração geralmente diminui exponencialmente à medida que a frequência se desvia desse intervalo. A curva pode não ser simétrica e apresentar um platô em torno da frequência de ressonância para proteger o motor contra danos.
O gráfico ao lado mostra um exemplo de FOAM para um motor LRA.
Limite de detecção de percepção humana
O limiar de detecção de percepção humana se refere à aceleração mínima de uma vibração que uma pessoa pode detectar de forma confiável. Esse nível varia de acordo com a frequência da vibração.
O gráfico ao lado mostra o limite de detecção da percepção háptica humana, em aceleração, como uma função da frequência temporal. Os dados de limite são convertidos do limite de deslocamento na Figura 1 de Bolanowski Jr., S. Artigo de J., et al., de 1988, "Four channels mediate the mechanical aspects of touch" (Quatro canais mediam os aspectos mecânicos do toque).
O Android processa automaticamente esse limite no BasicEnvelopeBuilder, que verifica se todos os efeitos usam um intervalo de frequência que produz amplitudes de vibração que excedem o limite de detecção da percepção humana em pelo menos 10 dB.
Um tutorial on-line explica melhor a conversão entre a amplitude de aceleração e a amplitude de deslocamento.
Níveis de aceleração da vibração
A percepção humana da intensidade da vibração, uma medida de percepção, não cresce linearmente com a amplitude da vibração, um parâmetro físico. A intensidade percebida é caracterizada pelo nível de sensação (SL, na sigla em inglês), que é definido como uma quantidade de dB acima do limite de detecção na mesma frequência.
A amplitude de aceleração de vibração correspondente (em G de pico) pode ser calculada da seguinte forma:
...em que o dB de amplitude é a soma do SL e do limite de detecção (o valor ao longo do eixo vertical no gráfico adjacente) em uma determinada frequência.
O gráfico ao lado mostra os níveis de aceleração de vibração em 10, 20, 30, 40 e 50 dB SL, além do limite de detecção da percepção háptica humana (0 dB SL), como uma função da frequência temporal. Os dados são estimados com base na Figura 8 em Verrillo, R. Artigo de T., et al. de 1969, "Magnitude da sensação de estímulos vibrotáteis".
O Android processa automaticamente essa conversão no BasicEnvelopeBuilder, que usa valores como intensidades normalizadas no espaço de nível de sensação (dB SL) e os converte em aceleração de saída. O WaveformEnvelopeBuilder, por outro lado, não aplica essa conversão e usa valores como amplitudes de aceleração de saída normalizadas no espaço de aceleração (Gs). A API
envelope pressupõe que, quando um designer ou desenvolvedor pensa em mudanças na
intensidade da vibração, ele espera que a intensidade percebida siga um envelope linear
por partes.
Suavização de forma de onda padrão em dispositivos
Para fins de ilustração, considere como um padrão de forma de onda personalizada 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. Observe que a aceleração aumenta gradualmente, não de repente, sempre que há uma mudança de amplitude no padrão, ou seja, em 0 ms, 150 ms, 200 ms, 250 ms e 700 ms. Há também um overshoot em cada mudança de amplitude, e há um ringing 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 overshoot e reduzir o tempo de ringing, mude as amplitudes de forma mais gradual. A seguir, mostramos 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 de clique satisfatória são mais complexos e exigem algum conhecimento da LRA usada em um dispositivo. Para ter os melhores resultados, use as formas de onda pré-fabricadas e as constantes fornecidas pela plataforma do dispositivo, que permitem fazer o seguinte:
- Faça efeitos claros e primitivos.
- Faça a concatenação para criar novos efeitos hápticos.
Essas constantes e primitivas hápticas predefinidas podem acelerar muito seu trabalho ao criar efeitos hápticos de alta qualidade.