Toutes les améliorations du framework Android basées sur l'haptique reposent sur un ensemble de principes UX qui évoluent au même rythme. Les principes actuels consistent à remplacer les vibrations bourdonnantes par une haptique claire et à explorer une haptique riche .
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.View |
| 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) |
Vibrations bourdonnantes
Depuis les téléavertisseurs et les téléphones polyvalents, les vibrations basées sur le buzzer ERM de mauvaise qualité mais économes en énergie ont été utilisées comme substitut à la sonnerie auditive en mode silencieux . Les composants matériels existants qui produisent des bruits audibles forts et désagréables peuvent nuire à l'UX haptique en fournissant des impressions de mauvaise qualité (par exemple, un téléphone bon marché et cassé).
Tactique claire
Une 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 claires sont générées comme une seule entité (par exemple, un effet haptique par événement d'entrée).
Android vise à offrir une haptique claire avec des sensations fortes mais nettes plutôt que des sensations bourdonnantes ou pâteuses.
Les constantes haptiques prédéfinies créées pour prendre en charge une haptique claire sont 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
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.
Tactique riche
L’haptique riche est une catégorie haptique en pleine croissance qui va au-delà des effets basés sur une impulsion unique. Android vise à prendre en charge une haptique riche avec une composabilité et une ajustabilité élevées avec un niveau de granularité fin. Les cas d'utilisation suivants sont pris en charge dans Android 11 ou version antérieure.
Figure 4. Tactique riche avec texture coulissante
Figure 5. Glisser et glisser
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, glisser, 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, alors les intervalles entre les répétitions risquent d’être effacés. Le résultat est un long buzz, plutôt que plusieurs signaux discrets.
Si l'amplitude n'est pas assez subtile, alors l'énergie haptique perçue s'accumule au fil de la répétition, ce qui donne lieu à une haptique extrêmement forte à la fin de la répétition.
Implémenter 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 les caractéristiques de répétition et d'amplitude.
Créez votre propre effet
Pour créer votre propre effet, composez un design 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 en utilisant addPrimitive(int primitiveID, float scale, int delay)
. La prise en charge repose sur la capacité CAP_COMPOSE_EFFECTS
de l' interface vibrateur HAL .
Cas d'utilisation 2 : Longue vibration avec effet de facilité d'application
Une vibration longue est une vibration d’amplitude douce qui passe de 0 à l’amplitude cible. Une longue vibration peut générer une haptique attentionnelle facilement perceptible. Cependant, une vibration longue et 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 d’aisance au début de la longue vibration. Cela produit une transition d’amplitude douce qui se rapproche de l’amplitude cible.
Appliquer l'effet d'aisance
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 d’aisance 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’aisance, comme le montre 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.
Tactique couplée audio : avantages
Pour mettre en œuvre une haptique couplée à l’audio, combinez une haptique claire avec de longues vibrations. Les sensations haptiques fortes mais courtes provenant d'une haptique claire délivrent des motifs rythmiques discrets. Lorsqu'il est combiné avec les niveaux élevés de stimuli que procurent les longues vibrations, cela permet d'attirer l'attention de l'utilisateur.
Il est important de considérer 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'haptique de couple audio
Tactique couplée à l'audio : conseils de 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 les choses suivantes à l’esprit.
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
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 des sonneries et des sons d'interface utilisateur avec une haptique et un retour synchrones.
- Par défaut, les canaux haptiques sont désactivés (
Le vibrateur HAL doit mettre en œuvre 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
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é, adaptez l'algorithme de génération au moteur du vibrateur 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 ajuster 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 puissance maximale. Ce paramètre ajuste un anti-résonateur pour aplatir 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 Vibrateur HAL
IVibrator.getResonantFrequency
.La valeur par défaut de ce paramètre est 150 Hz . Cela peut être modifié dans le code ici .
Pouvoir de normalisation pour une 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. Cela peut être modifié dans le code ici .
Facteur Q pour le 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.
Le 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 de 4 pour le Pole Q produisent un rapport de 2 , limitant la suppression de résonance d'un facteur 2 (6 dB). Le framework Android relie les deux valeurs à la sortie de la méthode Vibrateur HAL
IVibrator.getQFactor
.Si les valeurs par défaut ne tiennent pas compte de l'amortissement 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. Le rapport entre Zero Q et Pole Q doit être supérieur à 1 . Cela peut être modifié dans le code ici .
Fréquence de coin pour la distorsion
La fréquence angulaire 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 . Cela 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 à basse fréquence et augmente ceux à 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ètres.
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 souple 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.