Fondation UX pour le cadre haptique

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 .

Principes UX

Figure 1. Principes actuels

Le tableau suivant répertorie toutes les API haptiques disponibles.

API Méthodes Année ajoutée
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • APPUI LONG
Avant 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRMER
  • REJETER
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.Voir
  • performHapticFeedback()
Avant 2016
android.os.Vibrateur
  • vibrer()
  • aVibrateur()
Avant 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • créer une forme d'onde ()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLIC
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • CLIC_PRIMITIF
  • addPrimitive()
  • composer()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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.

Appuie et relache

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.

Haptique riche

Figure 4. Haptique riche avec texture glissante

Faire glisser et balayer

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é

  1. 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.
  2. Utilisez VibrationEffect . createWaveform(timings[], amplitudes[], int repeat) .

  3. Ajustez la série de timings[] et amplitudes[] pour générer la courbe de facilité, comme illustré à la figure 6.

Longues vibrations

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.

Couple audio

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 ou SoundPool .

    • 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 avec MediaPlayer et SoundPool .
  • 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

  • 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.
  • Le Vibrator HAL doit implémenter un support de contrôle externe.

Haptique à couplage audio

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.

Haptic Generator architecture

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.

  1. 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 .

  2. 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 .

  3. 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 .

  4. 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 .

  5. 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.

  6. 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.