Los actuadores de vibración más comunes en los dispositivos Android son los actuadores resonantes lineales (LRA). Los LRA simulan la sensación de un clic de botón en lo que, de otro modo, sería una superficie de vidrio que no responde. Por lo general, una señal de respuesta de clic clara y nítida dura entre 10 y 20 milisegundos. Esta sensación hace que las interacciones del usuario se sientan más naturales. En el caso de los teclados virtuales, esta respuesta de clic puede 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, lo 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, de alrededor de 150 Hz. La sensación es cualitativamente más suave y completa (en dimensión).
Dada la misma tensión de entrada en dos frecuencias diferentes, las amplitudes de salida de vibración pueden ser diferentes. Cuanto más lejos 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 clara y con mayor capacidad de respuesta.
Aceleración de salida del vibrador
El mapeo de frecuencia a aceleración de salida (FOAM) describe la aceleración de salida máxima alcanzable (en pico G) a una frecuencia de vibración determinada (en Hertz). A partir de Android 16 (nivel de API 36), la plataforma proporciona compatibilidad integrada para este mapeo a través de VibratorFrequencyProfile. Puedes usar
esta clase, junto con las APIs de envolvente básicas y avanzadas, para crear
efectos táctiles.
La mayoría de los motores LRA tienen un solo pico en su FOAM, por lo general, cerca de su frecuencia resonante. Por lo general, la aceleración disminuye de forma exponencial a medida que la frecuencia se desvía de este rango. Es posible que la curva no sea simétrica y que presente una meseta alrededor de la frecuencia resonante para proteger el motor de daños.
El diagrama adyacente muestra un ejemplo de FOAM para un motor LRA.
Umbral de detección de la percepción humana
El umbral de detección de la percepción humana se refiere a la aceleración mínima de una vibración que una persona puede detectar de manera confiable. Este nivel varía según la frecuencia de vibración.
El diagrama adyacente muestra el umbral de detección de la percepción táctil humana, en aceleración, como una función de la frecuencia temporal. Los datos del umbral se convierten del umbral de desplazamiento en la figura 1 del artículo de Bolanowski Jr., S. J., et al. de 1988, "Four channels mediate the mechanical aspects of touch.".
Android controla automáticamente este umbral en BasicEnvelopeBuilder, que verifica que todos los efectos usen un rango de frecuencia que produzca amplitudes de vibración que superen el umbral de detección de la percepción humana en al menos 10 dB.
En un instructivo en línea, se explica con más detalle la conversión entre la amplitud de aceleración y la amplitud de desplazamiento.
Niveles de aceleración de vibración
La percepción humana de la intensidad de la vibración, una medida de percepción, no crece de forma lineal con la amplitud de vibración, un parámetro físico. La intensidad percibida se caracteriza por el nivel de sensación (SL), que se define como una cantidad de dB por encima del umbral de detección en la misma frecuencia.
La amplitud de aceleración de vibración correspondiente (en pico G) se puede calcular de la siguiente manera:
...donde la amplitud dB es la suma de SL y el umbral de detección (el valor a lo largo del eje vertical en el diagrama adyacente) en una frecuencia determinada.
El diagrama adyacente muestra los niveles de aceleración de vibración en 10, 20, 30, 40 y 50 dB SL, junto con el umbral de detección de la percepción táctil humana (0 dB SL), como una función de la frecuencia temporal. Los datos se estiman a partir de la figura 8 del artículo de Verrillo, R. T., et al. de 1969, "Sensation magnitude of vibrotactile stimuli.".
Android controla automáticamente esta conversión en BasicEnvelopeBuilder, que toma valores como intensidades normalizadas en el espacio de nivel de sensación (dB SL) y los convierte en aceleración de salida. Por otro lado, WaveformEnvelopeBuilder no aplica esta conversión y, en cambio, toma valores como amplitudes de aceleración de salida normalizadas en el espacio de aceleración (Gs). La API de envolvente supone que, cuando un diseñador o desarrollador piensa en los cambios en la intensidad de la vibración, espera que la intensidad percibida siga una envolvente lineal por partes.
Suavizado de forma de onda predeterminado en dispositivos
A modo de ilustración, 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 diagramas, se muestran la forma de onda de entrada y la aceleración de salida correspondientes a los fragmentos de código anteriores. Ten en cuenta que la aceleración aumenta de forma gradual, no repentina, cada vez que hay un cambio de paso de amplitud en el patrón, es decir, en 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.
Patrón háptico mejorado
Para evitar el exceso y reducir el tiempo de timbre, cambia las amplitudes de forma más gradual. 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));
Crea efectos táctiles más complejos
Otros elementos de una respuesta de clic satisfactoria son más complejos y requieren cierto conocimiento del LRA que se usa en un dispositivo. Para obtener mejores resultados, usa las formas de onda prefabricadas del dispositivo y las constantes proporcionadas por la plataforma, que te permiten hacer lo siguiente:
- Realizar efectos y primitivas claros.
- Concatenarlos para componer nuevos efectos táctiles
Estas constantes y primitivas táctiles predefinidas pueden acelerar en gran medida tu trabajo mientras creas efectos táctiles de alta calidad.