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) |
Vibrations bourdonnantes
Depuis les téléavertisseurs et les téléphones bas de gamme, les vibrations basées sur un buzzer de l'ERM de faible qualité, mais économes en énergie, ont été utilisées comme substitut du sonnerie auditive en mode silencieux. Les anciens composants matériels qui produisent des bruits audibles forts et désagréables peuvent nuire à l'expérience haptique en fournissant des impressions de mauvaise qualité (par exemple, un téléphone bon marché et cassé).
Retour haptique clair
Les haptiques claires permettent de ressentir des changements d'état discrets (par exemple, des changements binaires lors du processus de mise en marche/arrêt). En raison de la nature de l'affordance discrète, les retours haptiques clairs sont générés en tant qu'entité unique (par exemple, un effet haptique par é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 ajustement é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. Glisser 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 strident plutôt que net, les intervalles entre les répétitions risquent 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)
. La compatibilité 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. Toutefois, un long vibreur soudain peut effrayer les utilisateurs dans un environnement calme et produit souvent des bourdonnements 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 d'accélération
Vérifiez les fonctionnalités matérielles de la commande d'amplitude avec
android.os.Vibrator.hasAmplitudeControl()
.- Le résultat doit être
true
pour produire un effet d'accélération 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. Courbe d'augmentation 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 d'attirer l'attention de l'utilisateur.
Il est important de prendre en compte les schémas rythmiques 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 d'association de l'audio et des retours haptiques
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é avec la haptique et 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 implémenter la compatibilité avec le contrôle 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 des retours haptiques couplés à l'audio
Retour haptique couplé à l'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 en tant que haptique couplée à 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 est la fréquence à laquelle un actionneur haptique a une sortie maximale. Ce paramètre ajuste un anti-résonateur pour aplatir partiellement la fonction de transfert de la 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:
Le facteur de qualité des zéros du filtre coupe-bande qui annule partiellement la résonance.
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 de pôle produisent un ratio de 2, ce qui limite la suppression des résonances d'un facteur 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 dans 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 le Q zéro et le Q pôle 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 de coupure est appliquée par un filtre passe-bas qui supprime les vibrations de faible niveau et améliore les niveaux plus élevés à l'aide d'une distorsion cubique. La valeur par défaut est 300 Hz. Vous pouvez modifier ce paramètre 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 inférieure et augmente celle des signaux de fréquence 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 tracer les réponses en fréquence des filtres et d'observer comment elles changent avec différentes valeurs de paramètre.
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.Vous pouvez la modifier dans le code ici. Si la vibration est trop subtile, augmentez la valeur. Si vous entendez le matériel de l'actionneur cliqueter, diminuez la valeur.