Todas las mejoras del framework de Android creadas en torno a la tecnología háptica se basan en un conjunto de principios de UX que evolucionan a la misma velocidad. Los principios actuales implican reemplazar la vibración intensa por hápticos claros y explorar los hápticos enriquecidos.
Figura 1: Principios actuales
En la siguiente tabla, se enumeran todas las APIs de tecnología háptica disponibles:
API | Métodos y constantes | Año en que se agregó |
---|---|---|
android.view.HapticFeedbackConstants |
|
Antes de 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.View |
|
Antes de 2016 |
android.os.Vibrator |
|
Antes de 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.os.VibrationEffect |
|
2017 (Android 8) |
|
2019 (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 (Android 11) |
android.media.AudioAttributes.Builder |
|
2019 (Android 10) |
Vibración zumbante
Desde los buscapersonas y los teléfonos celulares básicos, las vibraciones de baja calidad, pero eficientes en cuanto al consumo de energía, basadas en un zumbador de masa rotatoria excéntrica (ERM) se han usado como sustituto del timbre auditivo en el modo silencioso. Los componentes de hardware heredados que producen ruidos audibles fuertes y desagradables pueden dañar la UX háptica, ya que ofrecen impresiones de baja calidad (por ejemplo, un teléfono barato y roto).
Tecnología táctil clara
La háptica clara admite la sensación de cambios de estado discretos (por ejemplo, cambios binarios durante el proceso de encendido y apagado). Debido a la naturaleza de la capacidad de respuesta discreta, se generan hápticos claros como una sola entidad (por ejemplo, un efecto háptico por cada evento de entrada).
Android tiene como objetivo ofrecer respuestas hápticas claras con sensaciones fuertes y nítidas, en lugar de sensaciones que sean vibrantes o suaves.
Las constantes hápticas predefinidas que se crean para admitir hápticos claros incluyen los siguientes elementos.
CLOCK_TICK
CONFIRM
CONTEXT_CLICK
GESTURE_END
GESTURE_START
KEYBOARD_PRESS
KEYBOARD_RELEASE
KEYBOARD_TAP
LONG_PRESS
REJECT
TEXT_HANDLE_MOVE
VIRTUAL_KEY
VIRTUAL_KEY_RELEASE
En
VibrationEffect
:
EFFECT_CLICK
EFFECT_DOUBLE_CLICK
EFFECT_HEAVY_CLICK
EFFECT_TICK
Desarrollar conocimientos comunes entre los fabricantes de dispositivos y los desarrolladores es clave para mejorar la calidad general de la háptica en el ecosistema de Android. Usa la lista de verificación básica, la evaluación de hardware y el CDD para obtener más información sobre la implementación de la tecnología háptica.
Figura 2: Presionar y soltar
Tecnología táctil enriquecida
La háptica enriquecida es una categoría de háptica en crecimiento que va más allá de los efectos basados en un solo impulso. El objetivo de Android es admitir hápticos enriquecidos con un alto nivel de capacidad de composición y ajuste con un nivel de detalle preciso. Los siguientes casos de uso son compatibles con Android 11 o versiones anteriores.
Figura 3: Hápticos enriquecidos con textura deslizante
Figura 4: Arrastrar y deslizar
Caso de uso 1: Deslizamiento de textura
Si se repite un efecto háptico mientras el dedo se desliza sobre una superficie táctil (por ejemplo, cuando se arrastra, se desliza o se explora la superficie con una textura háptica fantasma), es preferible que los efectos hápticos repetidos sean nítidos y sutiles.
Si el efecto individual es zumbante en lugar de nítido, es probable que se borren los intervalos entre las repeticiones. El resultado es un zumbido largo en lugar de varios indicadores discretos.
Si la amplitud no es lo suficientemente sutil, la energía háptica percibida se acumula con la repetición, lo que genera una respuesta háptica demasiado fuerte al final de la repetición.
Implementa una textura háptica de superficie para los gestos de deslizamiento y arrastre
Usa CLOCK_TICK
y TEXT_HANDLE_MOVE
en HapticFeedbackConstants
.
Estas constantes predefinen características de repetición y amplitud.
Crea tu propio efecto
Para crear tu propio efecto, compone un diseño uniendo secuencias de PRIMITIVE_CLICK
y PRIMITIVE_TICK
en VibrationEffect.Composition
.
Puedes ajustar las características de la repetición y la escala de amplitud con addPrimitive(int primitiveID, float scale, int delay)
. La compatibilidad se basa en la capacidad CAP_COMPOSE_EFFECTS
de la interfaz HAL de Vibrator.
Caso de uso 2: Vibración larga con efecto de aceleración
La vibración larga es una vibración de amplitud suave que transiciona de 0 a la amplitud objetivo. La vibración larga puede generar hápticos de atención perceptibles. Sin embargo, una vibración larga y repentina puede asustar a los usuarios en un entorno silencioso y, a menudo, produce zumbidos audibles. Para generar una vibración larga más agradable, aplica el efecto de aceleración al comienzo de la vibración larga. Esto produce una transición de amplitud suave que se dirige hacia la amplitud objetivo.
Cómo aplicar el efecto de aceleración
Verifica las capacidades de hardware del control de amplitud con
android.os.Vibrator.hasAmplitudeControl()
.- El resultado debe ser
true
para producir un efecto de aceleración con amplitud variable.
- El resultado debe ser
Usa
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Ajusta la serie de
timings[]
yamplitudes[]
para generar la curva de aceleración, como se muestra en la figura 5.
Figura 5: Curva de aceleración de vibración larga.
Caso de uso 3: Hápticos vinculados con audio
Los efectos táctiles vinculados con audio son patrones táctiles vinculados con el ritmo del audio para captar la atención del usuario.
Efectos táctiles vinculados con audio: Beneficios
Para implementar efectos táctiles vinculados con audio, combina efectos táctiles claros con vibraciones largas. Las sensaciones hápticas claras, que son fuertes pero breves, ofrecen patrones rítmicos discretos. Cuando se combina con los altos niveles de estímulos que proporciona la vibración prolongada, esto funciona muy bien para captar la atención del usuario.
Es importante tener en cuenta los patrones rítmicos de la sensación. Si no hay una sensación de ritmo, el usuario percibe las sensaciones hápticas como vibraciones aleatorias y tiende a ignorarlas.
Figura 6: Ejemplo de hápticos vinculados con audio.
Tecnología táctil vinculada con audio: Sugerencias para la implementación
Para implementar la retroalimentación háptica vinculada al audio, se requiere una comprensión básica de la reproducción de contenido de los canales de audio y hápticos. Ten en cuenta lo siguiente:
Usa las clases
MediaPlayer
oSoundPool
.- Los recursos en formato OGG con una clave de metadatos especial (
ANDROID_HAPTIC
seguida de una cantidad de canales hápticos) indican la presencia de datos hápticos y la reproducción conMediaPlayer
ySoundPool
.
- Los recursos en formato OGG con una clave de metadatos especial (
Indica la compatibilidad con la reproducción de audio y la respuesta háptica en
audio_policy_configuration.xml
.- Usa un perfil de salida con el canal de hápticos
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - En el caso de un flujo de salida con canales hápticos, recuerda que estos se presentan como canales adicionales en los datos.
Ejemplo
Si la máscara de canal para el flujo de salida se ve de la siguiente manera:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Luego, cada muestra debería verse de la siguiente manera:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Usa un perfil de salida con el canal de hápticos
Cambia
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
afalse
para reproducir el canal háptico.- De forma predeterminada, los canales hápticos están silenciados (
true
). - Los casos de uso incluyen tonos de llamada y sonidos de la IU con hápticos y comentarios sincrónicos.
- De forma predeterminada, los canales hápticos están silenciados (
La HAL del vibrador debe implementar la compatibilidad con el control externo.
- Para las implementaciones de HIDL, usa
setExternalControl(bool enabled) generates (Status status)
. - Para las implementaciones de AIDL, usa
void setExternalControl(in boolean enabled)
.
- Para las implementaciones de HIDL, usa
Figura 7: Implementación de efectos táctiles vinculados con audio
Tecnología háptica vinculada con audio: HapticGenerator
HapticGenerator
es un efecto de audio que se introdujo en Android 12 y que puede generar datos táctiles a partir de un canal de audio y reproducirlos en tiempo real como hápticos vinculados con audio. El efecto se aplica a AudioTrack
, como se ilustra en la Figura 8:
Figura 8: Arquitectura del generador háptico
Esta visualización de la arquitectura muestra dónde se aplica el generador háptico al flujo de audio entrante del usuario antes de que se envíe al HAL de audio. El generador se aplica después de que AudioMixer
divide los datos de audio y hápticos, y antes de cualquier otro efecto de audio. Su salida anula cualquier dato háptico anterior en la transmisión.
Para asegurarte de que tu algoritmo de generación háptica genere hápticos de alta calidad, ajusta el algoritmo de generación al motor vibratorio del dispositivo. Para ello, modifica los parámetros que configuran la cadena de filtros que aplica a las formas de onda de audio. En esta sección, se describen estos parámetros en detalle y se explica cómo ajustarlos según las especificaciones de tu hardware.
Frecuencia de resonancia para el filtro de banda
La frecuencia de resonancia del vibrador es la frecuencia a la que un actuador háptico tiene la salida máxima. Este parámetro ajusta un antirresonador para aplanar parcialmente la función de transferencia de respuesta y obtener un ancho de banda más amplio. El framework de Android vincula automáticamente este valor al resultado del método
IVibrator.getResonantFrequency
del HAL de Vibrator.El valor predeterminado para este parámetro es 150 Hz. Puedes modificarlo en el código.
Potencia de normalización para la envolvente lenta
Este parámetro determina el exponente en la normalización parcial (control automático de ganancia). Su valor predeterminado es -0.8, lo que significa que el 80% de la variación del rango dinámico se quita con este paso de control de ganancia. Puedes modificarlo en el código.
Factor Q del filtro de banda detenida
El factor de calidad del vibrador (factor Q) se determina según dos parámetros:
El valor Q cero, el factor de calidad de los ceros en el filtro de banda eliminada que cancela parcialmente la resonancia
El factor Q del polo, el factor de calidad de los polos en el filtro de banda detenida
La proporción de esos dos valores limita la supresión de la resonancia para potenciar las frecuencias más bajas y ampliar la respuesta del algoritmo. Por ejemplo, los valores predeterminados de 8 para el Q en cero y 4 para el Q en polo producen una proporción de 2, lo que limita la supresión de resonancia en un factor de 2 (6 dB). El framework de Android vincula ambos valores al resultado del método
IVibrator.getQFactor
del HAL de Vibrator.Si los valores predeterminados no tienen en cuenta la amortiguación de la potencia del motor en tu dispositivo, te recomendamos que modifiques ambos valores al mismo tiempo y que los aumentes o disminuyas. La relación entre la Q de cero y la Q de polo debe ser mayor que 1. Puedes modificarlo en el código.
Frecuencia de esquina para la distorsión
La frecuencia de esquina se aplica con un filtro de paso bajo que suprime la vibración de nivel bajo y mejora los niveles más altos con una distorsión cúbica. El valor predeterminado es 300 Hz, pero puedes modificarlo en el código.
Ganancia de entrada y umbral del cubo para la distorsión
Estos parámetros los utiliza un filtro de distorsión no lineal que se aplica a la forma de onda de entrada y que reduce la amplitud de los sonidos de frecuencia más baja y aumenta la amplitud de los sonidos de frecuencia más alta.
- El valor predeterminado para el factor de ganancia de entrada es 0.3.
- El valor predeterminado para el umbral del cubo es 0.1.
Te recomendamos que modifiques ambos valores juntos. Se pueden encontrar en el código.
Para obtener más información sobre la función que aplica este filtro, consulta la implementación en el código.
Para obtener más información sobre cómo estos dos parámetros influyen en el resultado, te recomendamos que traces los diagramas de respuesta de frecuencia de los filtros y observes cómo cambian con diferentes valores de parámetros.
Ganancia de salida para la distorsión
Este parámetro controla la amplitud final de la vibración. Es una ganancia final que se aplica después de un limitador flexible que limita las amplitudes de vibración a menos de 1. Su valor predeterminado es 1.5, y puedes modificarlo en el código.
Si la vibración es demasiado sutil, aumenta el valor. Si escuchas que el hardware del actuador traquetea, disminuye el valor.