Manual de accionadores de vibraciones

Antes de diseñar efectos táctiles en un dispositivo Android, es útil obtener una descripción general de cómo funcionan los accionadores de vibración.

Ilustración de los componentes de una LRA táctil

Los accionadores de vibración más comunes son los de resonancia lineal (LRA). Cada LRA consta de una bobina de voz presionada contra una masa magnética en movimiento que está unida a un resorte. Un voltaje de CA aplicado a la bobina de voz crea una fuerza electromagnética que hace que la masa se mueva. El resorte proporciona la fuerza de restablecimiento que hace que la masa regrese a su posición inicial. El movimiento de ida y vuelta de la masa hace que el LRA vibre. Tienen una frecuencia de resonancia con la que la salida es máxima.

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

Una función común de las LRA en un dispositivo es simular la sensación de un clic de botón en una superficie de vidrio que no responde. Sirve para que la interacción del usuario se sienta más natural. Cuando se aplica a la escritura en un teclado virtual, la respuesta de clic puede aumentar la velocidad de escritura y reducir los errores. Un indicador de comentarios de clics claro y nítido suele durar menos de 10 a 20 milisegundos. Para lograr un buen clic, se requiere cierto conocimiento del LRA que se usa en un dispositivo. Es por eso que confiar en formas de onda prefabricadas proporciona la mejor información para un clic. Puedes usarlos con las constantes que proporciona la plataforma cada vez que se necesite una respuesta de clic.

Tanto el accionador de vibración como su controlador determinan los efectos táctiles que se pueden lograr en un dispositivo. Los controladores táctiles que incluyen funciones de sobrecarga y frenado activo pueden reducir el tiempo de elevación y el sonido de las LRA, lo que genera una vibración más clara y responsiva. A modo de ejemplo, veamos 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 // 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));

En el siguiente gráfico, se muestra la forma de onda correspondiente a los fragmentos de código que se muestran arriba.

Gráfico de la forma de onda de entrada de la función de paso

A continuación, se muestra la aceleración correspondiente:

Gráfico de la forma de onda medida real que muestra transiciones más orgánicas entre los niveles

Ten en cuenta que la aceleración aumenta de forma gradual, no repentinamente, cuando hay un cambio de paso de la amplitud en el patrón (p.ej., a 0 ms, 150 ms, 200 ms, 250 ms o 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.

Este patrón táctil se puede mejorar aumentando y disminuyendo las amplitudes de manera gradual para evitar el exceso y reducir el tiempo de sonido. A continuación, se muestran los diagramas de forma de onda y 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 fluidas

Por lo tanto, crear un efecto táctil en un dispositivo Android requiere algo más que proporcionar un valor de frecuencia y amplitud. Diseñar un efecto táctil desde cero sin acceso completo a las especificaciones de ingeniería del accionador de vibración y el controlador no es una tarea trivial. Las APIs de Android proporcionan constantes que te permiten hacer lo siguiente:

  • Ejecutar efectos claros y primitivas

  • Concatenarlos para componer nuevos efectos táctiles.

Estas constantes táctiles y primitivas predefinidas pueden acelerar en gran medida tu trabajo y, al mismo tiempo, garantizar efectos táctiles de alta calidad.