Fundamentos de UX para el framework de tecnología táctil

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.

Principios de UX

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
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
Antes de 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Antes de 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
Antes de 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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.

En HapticFeedbackConstants:

  • 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.

Presionar y soltar

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.

Tecnología háptica enriquecida

Figura 3: Hápticos enriquecidos con textura deslizante

Arrastrar y deslizar

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

  1. 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.
  2. Usa VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).

  3. Ajusta la serie de timings[] y amplitudes[] para generar la curva de aceleración, como se muestra en la figura 5.

Vibración larga

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.

Audio Couple

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 o SoundPool.

    • 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 con MediaPlayer y SoundPool.
  • 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

  • Cambia AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) a false 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.
  • La HAL del vibrador debe implementar la compatibilidad con el control externo.

Efectos táctiles vinculados con audio

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:

Arquitectura del generador háptico

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.