Analiza las formas de onda de vibración

Los actuadores de vibración más comunes en los dispositivos Android son los actuadores resonantes lineales (LRAs). Los LRA simulan la sensación de hacer clic en un botón en una superficie de vidrio que, de otro modo, no respondería. Un indicador de comentarios de clic claro y nítido suele durar entre 10 y 20 milisegundos. Esta sensación hace que las interacciones de los usuarios se sientan más naturales. En el caso de los teclados virtuales, estos comentarios de clic pueden aumentar la velocidad de escritura y reducir los errores.

Los LRA tienen algunas frecuencias resonantes comunes:

  • Algunos LRA tenían frecuencias resonantes en el rango de 200 a 300 Hz, que coincide con la frecuencia a la que la piel humana es más sensible a la vibración. La sensación de vibraciones en este rango de frecuencia suele describirse como suave, nítida y penetrante.
  • Otros modelos de LRA tienen frecuencias de resonancia más bajas, alrededor de 150 Hz. La sensación es cualitativamente más suave y completa (en dimensión).
Los componentes incluyen, de arriba abajo, una cubierta, una placa, un imán central, 2 imanes laterales, masa, 2 resortes, una bobina, un circuito flexible, una base y un adhesivo.
Componentes de un actuador resonante lineal (LRA).

Dado el mismo voltaje de entrada en dos frecuencias diferentes, las amplitudes de salida de vibración pueden ser diferentes. Cuanto más alejada esté la frecuencia de la frecuencia resonante del LRA, menor será su amplitud de vibración.

Los efectos táctiles de un dispositivo determinado usan el actuador de vibración y su controlador. Los controladores táctiles que incluyen funciones de sobremarcha y frenado activo pueden reducir el tiempo de aumento y el timbre de los LRA, lo que genera una vibración más responsiva y clara.

Suavizado predeterminado de la forma de onda en los dispositivos

A modo de ejemplo, considera cómo se comporta un patrón de forma de onda personalizado en un 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));

En los siguientes gráficos, se muestran la forma de onda de entrada y la aceleración de salida que corresponden a los fragmentos de código anteriores. Ten en cuenta que la aceleración aumenta gradualmente, no de forma repentina, cada vez que hay un cambio brusco de amplitud en el patrón, es decir, a los 0 ms, 150 ms, 200 ms, 250 ms y 700 ms. También hay un exceso en cada cambio de paso de amplitud, y hay un timbre visible que dura al menos 50 ms cuando la amplitud de entrada cae repentinamente a 0.

Gráfico de la forma de onda de entrada de la función de paso.
Gráfico de la forma de onda medida real, que muestra transiciones más orgánicas entre los niveles.

Patrón táctil mejorado

Para evitar el sobreimpulso y reducir el tiempo de timbre, cambia las amplitudes de forma más gradual. A continuación, se muestran las formas de onda y los gráficos de aceleración de la versión 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 de la forma de onda de entrada con pasos adicionales.
Gráfico de la forma de onda medida, que muestra transiciones más suaves.

Crea efectos táctiles más complejos

Otros elementos de una respuesta satisfactoria al clic son más complejos y requieren cierto conocimiento de la LRA que se usa en un dispositivo. Para obtener los mejores resultados, usa las formas de onda prefabricadas del dispositivo y las constantes proporcionadas por la plataforma, que te permiten hacer lo siguiente:

  • Realiza efectos y elementos primitivos claros.
  • Concatenalos para componer nuevos efectos táctiles.

Estas constantes y primitivas táctiles predefinidas pueden acelerar mucho tu trabajo mientras creas efectos táctiles de alta calidad.