Toutes les améliorations du framework Android basées sur la haptique sont guidées par un ensemble de principes d'expérience utilisateur qui évoluent à un rythme égal. Les principes actuels consistent à remplacer les vibrations bourdonnantes par des haptiques claires et à explorer les haptiques riches.
Figure 1 : Principes actuels
Le tableau suivant répertorie toutes les API haptiques disponibles.
API | Méthodes | Année d'ajout |
---|---|---|
android.view.HapticFeedbackConstants |
|
Avant 2016 |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.View |
|
Avant 2016 |
android.os.Vibrator |
|
Avant 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) |
Vibreur strident
Pour les téléphones multimédias et les téléphones multimédias, des vibrations ERM de faible qualité, mais économes en énergie, basées sur un buzzer ont été utilisées pour remplacer les sonneries sonores en mode silencieux. Les anciens composants matériels qui produisent des bruits sonores forts et désagréables peuvent nuire à l'expérience utilisateur haptique en générant des impressions de mauvaise qualité (par exemple, un téléphone cassé et bon marché).
Retour haptique clair
Des retours haptiques clairs prennent en charge la sensation de changements d'état distincts (par exemple, des changements binaires lors du processus d'allumage et de mise hors tension). En raison de la nature de l' affordance discrète, des retours haptiques clairs sont générés en tant qu'entité unique (par exemple, un effet haptique pour un événement d'entrée).
Android vise à fournir des retours haptiques clairs avec des sensations fortes, mais nettes, plutôt que des sensations floues ou brouillées.
Les constantes haptiques prédéfinies créées pour prendre en charge les haptiques claires incluent les suivantes.
Dans 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
Dans VibrationEffect
:
EFFECT_CLICK
EFFECT_DOUBLE_CLICK
EFFECT_HEAVY_CLICK
EFFECT_TICK
Établir des connaissances communes entre les fabricants d'appareils et les développeurs est essentiel pour améliorer la qualité globale de la haptique dans l'écosystème Android. Pour en savoir plus sur l'implémentation des retours haptiques, consultez la checklist de base, l'évaluation matérielle et la CDD.
Figure 3. Appuyer et relâcher
Technologies haptiques avancées
La haptique enrichie est une catégorie d'haptique en pleine croissance qui va au-delà des effets basés sur une seule impulsion. Android vise à prendre en charge les retours haptiques riches avec une composabilité et un réglage élevés, avec un niveau de précision élevé. Les cas d'utilisation suivants sont compatibles avec Android 11 ou version antérieure.
Figure 4. Technologie haptique riche avec texture glissante
Figure 5. Déplacer et balayer
Cas d'utilisation 1: texture coulissante
Si un effet haptique est répété lorsque l'utilisateur fait glisser son doigt sur une surface tactile (par exemple, en le faisant glisser, en l'explorant avec une texture haptique fantôme), les effets haptiques répétés sont de préférence nets et subtils.
Si l'effet individuel est bourdonnant plutôt que net, les intervalles entre les répétitions sont susceptibles d'être effacés. Le résultat est un bourdonnement long plutôt que plusieurs signaux distincts.
Si l'amplitude n'est pas assez subtile, l'énergie haptique perçue s'accumule au fil des répétitions, ce qui entraîne une haptique extrêmement forte à la fin de la répétition.
Implémenter une texture haptique de surface simple pour les gestes de balayage et de glissement
Utilisez CLOCK_TICK
et TEXT_HANDLE_MOVE
dans HapticFeedbackConstants
.
Ces constantes prédéterminent les caractéristiques de répétition et d'amplitude.
Créer votre propre effet
Pour créer votre propre effet, composez une conception en enfilant des séquences de PRIMITIVE_CLICK
et de PRIMITIVE_TICK
dans VibrationEffect.Composition
.
Vous pouvez ajuster les caractéristiques de la répétition et de l'échelle d'amplitude à l'aide de addPrimitive(int primitiveID, float scale, int delay)
. L'assistance repose sur la fonctionnalité CAP_COMPOSE_EFFECTS
de l'interface HAL du vibreur.
Cas d'utilisation 2: Vibreur long avec effet de montée en douceur
La vibration longue est une vibration d'amplitude fluide qui passe de 0 à l'amplitude cible. Les vibrations longues peuvent générer des haptiques attentionnelles facilement perceptibles. Cependant, une vibration longue soudaine peut surprendre les utilisateurs dans un environnement calme et produit souvent des bruits de bourdonnement audibles. Pour générer une vibration longue plus agréable, appliquez l'effet d'atténuation au début de la vibration longue. Cela produit une transition d'amplitude fluide qui se développe vers l'amplitude cible.
Appliquer l'effet lissage à l'approche
Vérifiez les capacités matérielles du contrôle de l'amplitude avec
android.os.Vibrator.hasAmplitudeControl()
.- Le résultat doit être
true
pour produire un effet de lissage de vitesse avec une amplitude variable.
- Le résultat doit être
Utilisez
VibrationEffect
.createWaveform(timings[], amplitudes[], int repeat)
.Ajustez la série de
timings[]
etamplitudes[]
pour générer la courbe d'accélération, comme illustré dans la figure 6.
Figure 6. Longue courbe d'aisance des vibrations
Cas d'utilisation 3: retour haptique couplé à l'audio
Les haptiques couplées à l'audio sont des schémas haptiques associés au rythme de l'audio pour attirer l'attention de l'utilisateur.
Haptique couplée à l'audio: avantages
Pour implémenter des retours haptiques couplés à l'audio, combinez des retours haptiques clairs à des vibrations longues. Les sensations haptiques fortes mais courtes des haptiques claires offrent des motifs rythmiques discrets. Combiné aux niveaux élevés de stimulation fournis par la vibration longue, cela permet de capter efficacement l'attention de l'utilisateur.
Il est important de prendre en compte les rythmes des sensations. S'il n'y a pas de sens du rythme, l'utilisateur perçoit les sensations haptiques comme des bourdonnements aléatoires et a tendance à les ignorer.
Figure 7. Exemple de retour haptique de couple audio
Haptique couplée à l'audio: conseils d'implémentation
L'implémentation de la haptique couplée à l'audio nécessite une compréhension de base de la lecture de contenu sur les canaux audio et haptiques. Gardez à l'esprit les points suivants.
Utilisez les classes
MediaPlayer
ouSoundPool
.- Les éléments au format OGG avec une clé de métadonnées spéciale (
ANDROID_HAPTIC
suivie d'un nombre de canaux haptiques) indiquent la présence de données haptiques et la lecture avecMediaPlayer
etSoundPool
.
- Les éléments au format OGG avec une clé de métadonnées spéciale (
Indiquez la compatibilité du retour haptique et de la lecture audio dans
audio_policy_configuration.xml
.- Utilisez un profil de sortie avec le canal haptique
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - Pour un flux de sortie avec des canaux haptiques, n'oubliez pas que les canaux haptiques sont présentés comme des canaux supplémentaires dans les données.
Exemple
Si le masque de canaux du flux de sortie se présente comme suit:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Chaque exemple devrait alors se présenter comme suit:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Utilisez un profil de sortie avec le canal haptique
Remplacez
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
parfalse
pour lire le canal haptique.- Par défaut, les canaux haptiques sont désactivés (
true
). - Les cas d'utilisation incluent les sonneries et les sons de l'interface utilisateur avec des retours et des retours haptiques synchrones.
- Par défaut, les canaux haptiques sont désactivés (
Le HAL du vibreur doit prendre en charge la commande externe.
- Pour les implémentations HIDL, utilisez
setExternalControl(bool enabled) generates (Status status)
. - Pour les implémentations AIDL, utilisez
void setExternalControl(in boolean enabled)
.
- Pour les implémentations HIDL, utilisez
Figure 8. Implémenter le retour haptique couplé audio
Retour haptique couplé audio: générateur haptique
HapticGenerator
est un effet audio introduit dans Android 12. Il peut générer des données haptiques à partir d'un canal audio et les lire en temps réel sous forme de retours haptiques couplés par l'audio.
L'effet est appliqué à AudioTrack
, comme illustré à la figure 9.
Figure 9. Architecture du générateur haptique
Pour vous assurer que votre algorithme de générateur haptique génère des haptiques de haute qualité, ajustez l'algorithme de génération au moteur du vibreur de l'appareil en ajustant les paramètres qui configurent la chaîne de filtres qu'il applique aux formes d'ondes audio. Cette section décrit ces paramètres en détail et explique comment les ajuster en fonction de vos spécifications matérielles.
Fréquence de résonance pour un filtre passe-bande
La fréquence de résonance du vibreur correspond à la fréquence à laquelle un actionneur haptique a une sortie maximale. Ce paramètre ajuste un anti-resonateur pour aplatir partiellement la fonction de transfert de réponse, afin d'obtenir une bande passante plus large. Le framework Android associe automatiquement cette valeur à la sortie de la méthode HAL du vibreur
IVibrator.getResonantFrequency
.La valeur par défaut de ce paramètre est 150 Hz. Vous pouvez modifier ce paramètre dans le code ici.
Puissance de normalisation pour l'enveloppe lente
Ce paramètre détermine l'exposant dans la normalisation partielle (contrôle automatique du gain). Sa valeur par défaut est -0,8, ce qui signifie que 80% de la variation de la plage dynamique est supprimée par cette étape de contrôle du gain. Vous pouvez modifier ce paramètre dans le code ici.
Facteur Q pour un filtre coupe-bande
Le facteur de qualité du vibreur (facteur Q) est déterminé par deux paramètres:
Zero-Q, le facteur de qualité des zéros dans le filtre de fin de bande qui annule partiellement la résonance.
Q du pôle, facteur de qualité des pôles du filtre coupe-bande.
Le ratio de ces deux valeurs limite la suppression de la résonance afin de renforcer les fréquences plus basses et d'élargir la réponse de l'algorithme. Par exemple, les valeurs par défaut de 8 pour le Q de zéro et de 4 pour le Q du pôle produisent un ratio de 2, ce qui limite la suppression des résonances d'un facteur de 2 (6 dB). Le framework Android associe les deux valeurs à la sortie de la méthode HAL du vibreur
IVibrator.getQFactor
.Si les valeurs par défaut ne tiennent pas compte de l'atténuation de la force du moteur de votre appareil, nous vous recommandons de modifier les deux valeurs en même temps, et de les augmenter ou de les diminuer toutes les deux. Le ratio entre zéro Q et le pôle Q doit être supérieur à 1. Vous pouvez modifier ce paramètre dans le code ici.
Fréquence de corner pour la distorsion
La fréquence d'angle est appliquée par un filtre passe-bas qui supprime les vibrations de bas niveau et améliore les niveaux les plus élevés à l'aide d'une distorsion cubique. La valeur par défaut est 300 Hz. Vous pouvez le modifier dans le code ici.
Gain d'entrée et seuil de distorsion du cube
Ces paramètres sont utilisés par un filtre de distorsion non linéaire appliqué à la forme d'onde d'entrée, qui atténue l'amplitude des signaux de fréquence basse et augmente ceux dont la fréquence est la plus élevée.
- La valeur par défaut du facteur de gain d'entrée est 0,3.
- La valeur par défaut du seuil du cube est 0,1.
Nous vous recommandons de modifier les deux valeurs ensemble. Vous les trouverez dans le code ici.
Pour en savoir plus sur la fonction appliquée par ce filtre, consultez l'implémentation disponible ici. Pour en savoir plus sur l'influence de ces deux paramètres sur la sortie, nous vous recommandons de représenter les réponses en fréquence des filtres et d'observer comment les réponses en fréquence changent avec différentes valeurs de paramètres.
Gain de sortie pour la distorsion
Ce paramètre contrôle l'amplitude de vibration finale. Il s'agit d'un gain final appliqué après un limiteur souple qui limite les amplitudes de vibration à moins de 1. Sa valeur par défaut est 1.5 et peut être modifiée dans le code ici. Si les vibrations sont trop subtiles, augmentez la valeur. Si vous entendez le matériel de l'actionneur cliqueter, diminuez la valeur.