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 .
Figura 1. Principios actuales
La siguiente tabla enumera todas las API hápticas disponibles.
API | Métodos | Año agregado |
---|---|---|
android.view.HapticFeedbackConstants |
| Antes de 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
Android.Ver |
| Antes de 2016 |
android.os.Vibrador |
| Antes de 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.os.VibrationEffect |
| 2017 (Android 8) |
| 2019 (Android 10) | |
android.os.VibrationEffect.Composición |
| 2020 (Android 11) |
android.media.AudioAttributes.Builder |
| 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 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 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.
-
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.
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.
Figura 4. Táctiles ricos con textura deslizante
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
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.
- El resultado tiene que ser
Utilice
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Ajuste la serie de
timings[]
yamplitudes[]
para generar la curva de entrada fácil, como se muestra en la Figura 6.
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.
Figura 7. Ejemplo de háptica de pareja de audio
Hápticos acoplados a 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
oSoundPool
.- 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 conMediaPlayer
ySoundPool
.
- Los activos en formato OGG con una clave de metadatos especial (
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
- Utilice un perfil de salida con canal háptico
Cambie
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 interfaz de usuario con retroalimentación y háptica sincrónica.
- De forma predeterminada, los canales hápticos están silenciados (
El Vibrador HAL debe implementar soporte de control externo.
- Para implementaciones HIDL , utilice
setExternalControl(bool enabled) generates (Status status)
. - Para implementaciones AIDL , utilice
void setExternalControl(in boolean enabled)
.
- Para implementaciones HIDL , utilice
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.
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.
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í .
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í .
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í .
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í .
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.
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.