Toutes les améliorations du framework Android construites autour de l'haptique sont guidées par un ensemble de principes UX qui évoluent à un rythme égal. Les principes actuels consistent à remplacer les vibrations bourdonnantes par des haptiques claires et à explorer des haptiques riches .
Figure 1. Principes actuels
Le tableau suivant répertorie toutes les API haptiques disponibles.
API | Méthodes | Année ajoutée |
---|---|---|
android.view.HapticFeedbackConstants |
| Avant 2016 |
| 2017 (Android 8) | |
| 2020 (Android 11) | |
android.Voir |
| Avant 2016 |
android.os.Vibrateur |
| 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) |
Vibration bourdonnante
Remontant aux téléavertisseurs et aux téléphones multifonctions, des vibrations basées sur un buzzer ERM de faible qualité mais économes en énergie ont été utilisées comme substitut à la sonnerie auditive en mode silencieux . Les composants matériels hérités qui produisent des bruits audibles forts et désagréables peuvent nuire à l'UX haptique en délivrant des impressions de mauvaise qualité (par exemple, un téléphone cassé et bon marché).
Haptique claire
L' haptique claire prend en charge la sensation de changements d'état discrets (par exemple, des changements binaires pendant le processus de mise sous/hors tension). En raison de la nature de l'affordance discrète , des haptiques clairs sont générés comme une seule entité (par exemple, un effet haptique pour un événement d'entrée).
Android vise à fournir des haptiques claires avec des sensations fortes mais nettes plutôt que des sensations bourdonnantes ou molles.
Les constantes haptiques prédéfinies qui sont créées pour prendre en charge les haptiques claires incluent les éléments suivants.
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
L'établissement de connaissances communes entre les fabricants d'appareils et les développeurs est essentiel pour améliorer la qualité globale de l'haptique dans l'écosystème Android. Utilisez la liste de contrôle de base , l ' évaluation du matériel et le CDD . pour en savoir plus sur la mise en œuvre haptique.
Figure 3. Appuyer et relâcher.
Haptique riche
L'haptique riche est une catégorie d'haptique en pleine croissance qui va au-delà des effets simples basés sur des impulsions. Android vise à prendre en charge des haptiques riches avec une composabilité et une adaptabilité élevées avec un niveau de granularité fin. Les cas d'utilisation suivants sont pris en charge dans Android 11 ou une version antérieure.
Figure 4. Haptique riche avec texture glissante
Figure 5. Faire glisser et balayer
Cas d'utilisation 1 : texture glissante
Si un effet haptique est répété pendant que le doigt glisse sur une surface tactile (par exemple, glisser, balayer, explorer la surface 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 seront probablement effacés. Le résultat est un long bourdonnement, plutôt que plusieurs signaux discrets.
Si l'amplitude n'est pas assez subtile, l'énergie haptique perçue s'accumule à travers la répétition, ce qui donne des haptiques extrêmement forts à la fin de la répétition.
Implémentation d'une texture haptique de surface simple pour les gestes de glissement et de glissement
Utilisez CLOCK_TICK
et TEXT_HANDLE_MOVE
dans HapticFeedbackConstants
. Ces constantes prédéfinissent des caractéristiques de répétition et d'amplitude.
Créer votre propre effet
Pour créer votre propre effet, composez un dessin en enchaînant des séquences de PRIMITIVE_CLICK
et PRIMITIVE_TICK
dans VibrationEffect.Composition
. Vous pouvez ajuster les caractéristiques de l'échelle de répétition et d'amplitude à l'aide addPrimitive(int primitiveID, float scale, int delay)
. La prise en charge repose sur la capacité CAP_COMPOSE_EFFECTS
de l' interface Vibrator HAL .
Cas d'utilisation 2 : vibration longue avec effet de facilité
La vibration longue est une vibration d'amplitude douce qui passe de 0 à l'amplitude cible. De longues vibrations peuvent générer des haptiques attentionnelles facilement perceptibles. Cependant, une longue vibration soudaine peut surprendre les utilisateurs dans un environnement calme et produit souvent des bourdonnements audibles. Pour générer une longue vibration plus agréable, appliquez l'effet de facilité au début de la longue vibration. Cela produit une transition d'amplitude douce qui se rapproche de l'amplitude cible.
Application de l'effet de facilité
Vérifiez les capacités matérielles du contrôle d'amplitude avec
android.os.Vibrator.hasAmplitudeControl()
.- Le résultat doit être
true
pour produire un effet de facilité 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 de facilité, comme illustré à la figure 6.
Figure 6. Longue courbe d'atténuation des vibrations
Cas d'utilisation 3 : haptique couplée à l'audio
Les haptiques couplées à l'audio sont des modèles haptiques couplés au rythme de l'audio pour attirer l'attention de l'utilisateur.
Haptique couplée à l'audio : avantages
Pour implémenter l'haptique couplée à l'audio, combinez l'haptique claire avec de longues vibrations. Les sensations haptiques fortes mais courtes des haptiques claires délivrent des motifs rythmiques discrets. Lorsqu'il est combiné avec les niveaux élevés de stimuli fournis par les longues vibrations, cela fait un excellent travail pour attirer l'attention de l'utilisateur.
Il est important de considérer les schémas rythmiques de sensation. 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'haptique de couple audio
Haptique couplée à l'audio : Conseils pour la mise en œuvre
La mise en œuvre de l'haptique couplée à l'audio nécessite une compréhension de base de la lecture de contenu des canaux audio et haptiques. Gardez à l'esprit les éléments suivants.
Utilisez les classes
MediaPlayer
ouSoundPool
.- Les actifs au format OGG avec une clé de métadonnées spéciale (
ANDROID_HAPTIC
suivi d'un certain nombre de canaux haptiques) indiquent la présence de données haptiques et la lecture avecMediaPlayer
etSoundPool
.
- Les actifs au format OGG avec une clé de métadonnées spéciale (
Indiquez la prise en charge de l'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 canal du flux de sortie ressemble à ceci :
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Ensuite, chaque échantillon devrait ressembler à ceci :
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Utilisez un profil de sortie avec le canal haptique
Modifier
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
à
false
pour jouer le canal haptique.- Par défaut, les canaux haptiques sont coupés (
true
). - Les cas d'utilisation incluent des sonneries et des sons d'interface utilisateur avec des haptiques et des commentaires synchrones.
- Par défaut, les canaux haptiques sont coupés (
Le Vibrator HAL doit implémenter un support de 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émentation de l'haptique couplée à l'audio
Haptique couplée à l'audio : générateur haptique
Le HapticGenerator
est un effet audio introduit dans Android 12 qui peut générer des données haptiques à partir d'un canal audio et les lire en temps réel sous forme d'haptiques couplées à l'audio . L'effet est appliqué à l' AudioTrack
comme décrit dans 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é, réglez l'algorithme de génération sur le moteur du vibreur de l'appareil en ajustant les paramètres qui configurent la chaîne de filtres qu'il applique aux formes d'onde audio. Cette section décrit ces paramètres en détail et explique comment les régler en fonction de vos spécifications matérielles.
Fréquence de résonance pour filtre passe-bande
La fréquence de résonance du vibrateur est la fréquence à laquelle un actionneur haptique a une sortie maximale. Ce paramètre ajuste un anti-résonateur pour aplanir partiellement la fonction de transfert de réponse, afin d'obtenir une bande passante plus large. Le framework Android lie automatiquement cette valeur à la sortie de la méthode Vibrator HAL
IVibrator.getResonantFrequency
.La valeur par défaut de ce paramètre est 150Hz . Ceci peut être modifié dans le code ici .
Puissance de normalisation pour 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 plage dynamique est supprimée par cette étape de contrôle de gain. Ceci peut être modifié dans le code ici .
Facteur Q pour filtre coupe-bande
Le facteur de qualité du vibrateur (facteur Q) est déterminé par deux paramètres :
Le Zero Q, le facteur de qualité des zéros dans le filtre coupe-bande qui annule partiellement la résonance.
The Pole Q, le facteur de qualité des pôles dans le filtre coupe-bande.
Le rapport de ces deux valeurs limite la suppression de la résonance afin d'amplifier les basses fréquences et d'élargir la réponse de l'algorithme. Par exemple, les valeurs par défaut de 8 pour le Zero Q et 4 pour le Pole Q produisent un rapport de 2 , limitant la suppression des résonances d'un facteur 2 (6 dB). Le framework Android relie les deux valeurs à la sortie de la méthode Vibrator HAL
IVibrator.getQFactor
.Si les valeurs par défaut ne tiennent pas compte de l'atténuation de la puissance du moteur dans votre appareil, nous vous recommandons de modifier les deux valeurs en même temps et d'augmenter ou de diminuer les deux. Le rapport Zéro Q sur Pôle Q doit être supérieur à 1 . Ceci peut être modifié dans le code ici .
Fréquence de coin pour la distorsion
La fréquence de coin est appliquée par un filtre passe-bas qui supprime les vibrations de bas niveau et améliore les niveaux plus élevés à l'aide d'une distorsion cubique. Il est par défaut à 300Hz . Ceci peut être modifié dans le code ici .
Gain d'entrée et seuil de cube pour la distorsion
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 basse fréquence et augmente ceux de haute fréquence.
- La valeur par défaut du facteur de gain d'entrée est 0,3 .
- La valeur par défaut du seuil de cube est 0,1 .
Nous vous recommandons de modifier les deux valeurs ensemble. Ils peuvent être trouvés dans le code ici .
Pour plus d'informations sur la fonction appliquée par ce filtre, reportez-vous à l'implémentation disponible ici . Pour en savoir plus sur la façon dont ces deux paramètres influencent la sortie, nous vous recommandons de tracer 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ètre.
Gain de sortie pour la distorsion
Ce paramètre contrôle l'amplitude de vibration finale. C'est un gain final appliqué après un limiteur doux qui limite les amplitudes de vibration à moins de 1. Sa valeur par défaut est 1.5 , et elle peut être modifiée dans le code ici . Si la vibration est trop subtile, augmentez la valeur. Si vous entendez le cliquetis du matériel de l'actionneur, diminuez la valeur.