Fundación UX para marco háptico

Todas las mejoras del marco de trabajo de Android creadas en torno a la tecnología háptica están impulsadas por un conjunto de principios de UX que evolucionan al mismo ritmo. Los principios actuales implican reemplazar la vibración zumbante con hápticas claras y explorar hápticas ricas .

Principios de experiencia de usuario

Figura 1. Principios actuales

La siguiente tabla enumera todas las API hápticas disponibles.

API Métodos Año agregado
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • RELOJ_TICK
  • CLAVE_VIRTUAL
  • TECLADO_TAP
  • PULSACIÓN LARGA
Antes de 2016
  • TECLADO_PRESIONAR
  • TECLADO_SUELTAR
  • TEXT_HANDLE_MOVE
  • LIBERAR_LLAVE_VIRTUAL
2017 (Android 8)
  • CONFIRMAR
  • RECHAZAR
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.Ver
  • performHapticFeedback()
Antes de 2016
android.os.Vibrador
  • vibrar()
  • tiene vibrador()
Antes de 2016
  • tiene Control de Amplitud ()
2017 (Android 8)
  • todos los efectos son compatibles ()
  • son todas las primitivas compatibles ()
  • sonEfectosSoportados()
  • son primitivos compatibles ()
2020 (Android 11)
android.os.VibrationEffect
  • crearOneShot()
  • crear forma de onda ()
2017 (Android 8)
  • EFECTO_TICK
  • EFECTO_CLICK
  • EFECTO_PESADO_CLICK
  • EFECTO_DOBLE_CLICK
  • crear predefinido ()
2019 (Android 10)
android.os.VibrationEffect.Composición
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • añadirPrimitivo()
  • componer()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • establecerHapticChannelsMuted()
2019 (Android 10)

Vibración zumbante

Desde los buscapersonas y los teléfonos con funciones, las vibraciones basadas en zumbadores ERM de baja calidad pero de bajo consumo se han utilizado como sustituto del timbre auditivo en modo silencioso . Los componentes de hardware heredados que producen ruidos audibles fuertes y desagradables pueden dañar la UX háptica al ofrecer impresiones de baja calidad (por ejemplo, un teléfono barato y roto).

Hápticos claros

Los hápticos claros respaldan la sensación de cambios de estado discretos (por ejemplo, cambios binarios durante el proceso de encendido/apagado). Debido a la naturaleza de la prestación discreta , los hápticos claros se generan como una sola entidad (por ejemplo, un efecto háptico por evento de entrada).

Android tiene como objetivo ofrecer hápticos claros con sensaciones fuertes pero nítidas en lugar de sensaciones que son zumbidas o blandas.

Las constantes hápticas predefinidas que se crean para admitir hápticas claras incluyen las siguientes.

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 un conocimiento común entre los fabricantes de dispositivos y los desarrolladores es clave para elevar la calidad general de los hápticos en el ecosistema de Android. Utilice la lista de verificación básica , la evaluación de hardware y la CDD . para obtener más información sobre la implementación háptica.

Presione y suelte

Figura 3. Presionar y soltar.

Ricos hápticos

Los hápticos enriquecidos son una categoría de hápticos en crecimiento que va más allá de los efectos únicos basados ​​en impulsos. Android tiene como objetivo admitir hápticos enriquecidos con alta capacidad de composición y ajuste con un buen nivel de granularidad. Los siguientes casos de uso son compatibles con Android 11 o versiones anteriores.

Hápticos ricos

Figura 4. Háptica rica con textura deslizante

Arrastrar y deslizar

Figura 5. Arrastrar y deslizar

Caso de uso 1: textura deslizante

Si un efecto háptico se repite mientras el dedo se desliza sobre una superficie táctil (por ejemplo, arrastrar, deslizar, explorar la superficie con una textura háptica fantasma), los efectos hápticos repetidos son preferiblemente nítidos y sutiles.

Si el efecto individual es zumbido en lugar de nítido, es probable que los intervalos entre las repeticiones desaparezcan. El resultado es un zumbido largo, en lugar de múltiples señales discretas.

Si la amplitud no es lo suficientemente sutil, entonces la energía háptica percibida se acumula a través de la repetición, lo que resulta en hápticas abrumadoramente fuertes al final de la repetición.

Implementación de una textura háptica de superficie simple para gestos de deslizar y arrastrar

Utilice CLOCK_TICK y TEXT_HANDLE_MOVE en HapticFeedbackConstants . Estas constantes predefinen características de repetición y amplitud.

Creando tu propio efecto

Para crear su propio efecto, componga un diseño encadenando secuencias de PRIMITIVE_CLICK y PRIMITIVE_TICK en VibrationEffect.Composition . Puede ajustar las características de la escala de repetición y amplitud usando addPrimitive(int primitiveID, float scale, int delay) . El soporte se basa en la capacidad CAP_COMPOSE_EFFECTS de la interfaz HAL de Vibrator .

Caso de uso 2: Vibración prolongada con efecto de relajación

La vibración larga es una vibración de amplitud suave que pasa de 0 a la amplitud objetivo. La vibración larga puede generar hápticas atencionales fácilmente 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 placentera, aplica el efecto de relajación al comienzo de la vibración larga. Esto produce una transición de amplitud suave que se construye hacia la amplitud objetivo.

Aplicar el efecto de relajación

  1. Compruebe las capacidades de hardware del control de amplitud con android.os.Vibrator.hasAmplitudeControl() .

    • El resultado tiene que ser true para producir un efecto de entrada suave con amplitud variable.
  2. Utilice VibrationEffect . createWaveform(timings[], amplitudes[], int repeat) .

  3. Ajuste la serie de timings[] y amplitudes[] para generar la curva de entrada gradual, como se muestra en la Figura 6.

Vibración larga

Figura 6. Curva de relajación de vibración larga

Caso de uso 3: hápticos acoplados por audio

Los hápticos acoplados con audio son patrones hápticos acoplados con el ritmo del audio para llamar la atención del usuario.

Hápticos acoplados con audio: Beneficios

Para implementar hápticos acoplados con audio, combine hápticos claros con vibraciones largas. Las sensaciones hápticas fuertes pero breves de los hápticos claros generan patrones rítmicos discretos. Cuando se combina con los altos niveles de estímulo que proporciona la vibración larga, hace un gran trabajo para llamar la atención del usuario.

Es importante tener en cuenta los patrones rítmicos de la sensación. Si no hay sentido del ritmo, el usuario percibe las sensaciones hápticas como zumbidos aleatorios y tiende a ignorarlos.

Pareja de audio

Figura 7. Ejemplo de háptica de pareja de audio

Hápticos acoplados con audio: consejos para implementar

La implementación de hápticos acoplados con audio requiere una comprensión básica de la reproducción de contenido de canales hápticos y de audio. Tenga en cuenta las siguientes cosas.

  • Utilice las clases MediaPlayer o SoundPool .

    • Los activos en formato OGG con una clave de metadatos especial ( ANDROID_HAPTIC seguida de una serie de canales hápticos) indican la presencia de datos hápticos y la reproducción con MediaPlayer y SoundPool .
  • Indique la compatibilidad con háptica y reproducción de audio en audio_policy_configuration.xml .

    • Use un perfil de salida con canal AUDIO_CHANNEL_OUT_HAPTIC_A|B .
    • Para un flujo de salida con canales hápticos, recuerde que los canales hápticos se presentan como canales adicionales en los datos.

    Ejemplo

    Si la máscara de canal para el flujo de salida se ve así:

    AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A

    Entonces cada muestra debería verse así:

    AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A

  • Cambiar 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 interfaz de usuario con respuesta y háptica síncrona.
  • El Vibrador HAL debe implementar un soporte de control externo.

Hápticos acoplados de audio

Figura 8. Implementación de háptica acoplada con audio

Hápticos acoplados con audio: Generador Háptico

HapticGenerator es un efecto de audio introducido en Android 12 que puede generar datos hápticos a partir de un canal de audio y reproducirlos en tiempo real como hápticos acoplados con audio . El efecto se aplica a AudioTrack como se describe en la Figura 9.

Haptic Generator architecture

Figura 9. Arquitectura del generador háptico

Para asegurarse de que su algoritmo generador de hápticos genere hápticos de alta calidad, ajuste el algoritmo de generación al motor vibrador del dispositivo ajustando los parámetros que configuran la cadena de filtros que aplica a las formas de onda de audio. Esta sección describe estos parámetros en detalle y explica cómo ajustarlos a las especificaciones de su hardware.

  1. Frecuencia de resonancia para filtro de paso de banda

    La frecuencia de resonancia del vibrador es la frecuencia a la que un actuador háptico tiene una salida máxima. Este parámetro ajusta un anti-resonador para aplanar parcialmente la función de transferencia de respuesta, con el fin de obtener un ancho de banda más amplio. El marco de Android vincula automáticamente este valor a la salida del método IVibrator.getResonantFrequency de Vibrator HAL.

    El valor predeterminado para este parámetro es 150 Hz . Esto se puede modificar en el código aquí .

  2. Potencia de normalización para 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 este paso de control de ganancia elimina el 80% de la variación del rango dinámico. Esto se puede modificar en el código aquí .

  3. Factor Q para filtro de parada de banda

    El factor de calidad del vibrador (factor Q) está determinado por dos parámetros:

    • El Zero Q, el factor de calidad de los ceros en el filtro de parada de banda que cancela parcialmente la resonancia.

    • El Polo Q, el factor de calidad de los polos en el filtro supresor de banda.

    La relación de esos dos valores limita la supresión de la resonancia para aumentar las frecuencias más bajas y ampliar la respuesta del algoritmo. Por ejemplo, los valores predeterminados de 8 para Zero Q y 4 para Pole Q producen una relación de 2 , lo que limita la supresión de resonancia en un factor de 2 (6 dB). El marco de Android vincula ambos valores a la salida del método Vibrator HAL IVibrator.getQFactor .

    Si los valores predeterminados no tienen en cuenta la amortiguación de la fuerza del motor en su dispositivo, recomendamos modificar ambos valores al mismo tiempo y aumentar o disminuir ambos. La relación entre Q cero y Q polar debe ser superior a 1 . Esto se puede modificar en el código aquí .

  4. Frecuencia de esquina para distorsión

    La frecuencia de esquina se aplica mediante un filtro de paso bajo que suprime la vibración de bajo nivel y mejora los niveles más altos mediante una distorsión cúbica. El valor predeterminado es 300 Hz . Esto se puede modificar en el código aquí .

  5. Ganancia de entrada y umbral de cubo para distorsión

    Estos parámetros son utilizados por un filtro de distorsión no lineal aplicado a la forma de onda de entrada que amortigua la amplitud de las señales de frecuencia más baja y aumenta las 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 .

    Recomendamos modificar ambos valores juntos. Se pueden encontrar en el código aquí .

    Para obtener más información sobre la función aplicada por este filtro, consulte la implementación disponible aquí . Para obtener más información sobre cómo estos dos parámetros influyen en la salida, recomendamos trazar las respuestas de frecuencia de los filtros y observar cómo cambian las respuestas de frecuencia con diferentes valores de parámetros.

  6. Ganancia de salida para distorsión

    Este parámetro controla la amplitud de vibración final. Es una ganancia final aplicada después de un limitador suave que limita las amplitudes de vibración a menos de 1. Su valor predeterminado es 1.5 y se puede modificar en el código aquí . Si la vibración es demasiado sutil, aumente el valor. Si puede escuchar el traqueteo del hardware del actuador, disminuya el valor.