Base UX para marco háptico

Todas las mejoras del marco de trabajo de Android basadas en la tecnología háptica están impulsadas por un conjunto de principios de UX que están evolucionando al mismo ritmo. Los principios actuales implican reemplazar la vibración zumbante con hápticos claros y explorar hápticos ricos .

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
  • CONTEXTO_CLIC
  • RELOJ_TICK
  • LLAVE_VIRTUAL
  • TECLADO_TAP
  • PULSACIÓN LARGA
Antes de 2016
  • TECLADO_PRESIONAR
  • LIBERACIÓN_TECLADO
  • TEXTO_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRMAR
  • RECHAZAR
  • GESTURE_START
  • GESTO_END
2020 (Android 11)
Android.Ver
  • realizarHapticFeedback()
Antes de 2016
android.os.Vibrador
  • vibrar()
  • tieneVibrador()
Antes de 2016
  • tieneAmplitudControl()
2017 (Android 8)
  • sonTodos los efectos soportados()
  • sonTodasLasPrimitivasSupported()
  • sonEfectosSupported()
  • son primitivos compatibles()
2020 (Android 11)
android.os.VibrationEffect
  • crearOneShot()
  • crear forma de onda()
2017 (Android 8)
  • EFECTO_TICK
  • EFECTO_CLIC
  • EFECTO_PESADO_CLIC
  • EFECTO_DOBLE_CLIC
  • crearPredefinido()
2019 (Android 10)
android.os.VibrationEffect.Composición
  • PRIMITIVE_TICK
  • PRIMITIVO_CLIC
  • agregarPrimitivo()
  • componer()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

Vibración zumbante

Desde los buscapersonas y los teléfonos básicos, 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 experiencia de usuario háptica al generar impresiones de baja calidad (por ejemplo, un teléfono barato y roto).

Táctiles claros

Los hápticos claros apoyan 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 un evento de entrada).

Android tiene como objetivo ofrecer hápticos claros con sensaciones fuertes pero nítidas en lugar de sensaciones zumbantes 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

Crear un conocimiento común entre los fabricantes y desarrolladores de dispositivos es clave para mejorar la calidad general de la háptica en el ecosistema de Android. Utilice 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 háptica.

Presione y suelte

Figura 3. Presionar y soltar.

Ricos hápticos

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

Hápticos ricos

Figura 4. Táctiles ricos con textura deslizante

Arrastrar y deslizar

Figura 5. Arrastrar y deslizar

Caso de uso 1: textura deslizante

Si se repite un efecto háptico 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 más zumbido que nítido, es probable que los intervalos entre las repeticiones desaparezcan. El resultado es un zumbido prolongado, 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 lo largo de la repetición, lo que resulta en hápticas abrumadoramente fuertes al final de la repetición.

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

Crea 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 Vibrator HAL .

Caso de uso 2: Vibración prolongada con efecto de fácil entrada

La vibración larga es una vibración de amplitud suave que pasa de 0 a la amplitud objetivo. Una vibración prolongada puede generar hápticos de atención fácilmente perceptibles. Sin embargo, una vibración repentina y prolongada puede asustar a los usuarios en un ambiente tranquilo y, a menudo, produce zumbidos audibles. Para generar una vibración larga más placentera, aplique el efecto de relajación al comienzo de la vibración larga. Esto produce una transición de amplitud suave que aumenta hacia la amplitud objetivo.

Aplicar el efecto easy-in

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

    • El resultado tiene que ser true para producir un efecto de facilitación 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 fácil, como se muestra en la Figura 6.

Vibración larga

Figura 6. Curva de entrada suave de vibración larga

Caso de uso 3: hápticos acoplados a audio

Los hápticos acoplados al audio son patrones hápticos acoplados al ritmo del audio para captar la atención del usuario.

Táctiles acoplados al audio: beneficios

Para implementar hápticos acoplados al audio, combine hápticos claros con vibraciones prolongadas. 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ímulos que proporciona la vibración prolongada, esto hace un gran trabajo para llamar la atención del usuario.

Es importante considerar los patrones rítmicos de 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 al audio: consejos para implementar

La implementación de hápticos acoplados a audio requiere una comprensión básica de la reproducción de contenido tanto de canales de audio como hápticos. Tenga en cuenta lo siguiente.

  • Utilice las clases MediaPlayer o SoundPool .

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

    • Utilice un perfil de salida con canal háptico 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 del 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 retroalimentación y háptica sincrónica.
  • El Vibrador HAL debe implementar soporte de control externo.

Hápticos acoplados de audio

Figura 8. Implementación de hápticos acoplados a audio

Hápticos acoplados a 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 a 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 háptico genere hápticos de alta calidad, sintonice el algoritmo de generación con el 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 resonante del vibrador es la frecuencia a la que un actuador háptico tiene 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 Vibrator HAL IVibrator.getResonantFrequency .

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

  2. Poder 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 banda eliminada que cancela parcialmente la resonancia.

    • El Pole Q, el factor de calidad de los polos en el filtro de banda eliminada.

    La relación entre 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 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 Zero Q y Pole Q debe ser mayor que 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 que aplica 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 la 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 ruido del hardware del actuador, reduzca el valor.