Base de l'expérience utilisateur pour le framework haptique

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.

Principes de l'expérience utilisateur

Figure 1 : Principes actuels

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

API Méthodes Année d'ajout
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
Avant 2016
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRMER
  • REFUSER
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Avant 2016
android.os.Vibrator
  • vibrate()
  • hasVibrator()
Avant 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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.

Appuyer et relâcher

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.

Retour haptique avancé

Figure 4. Technologie haptique riche avec texture glissante

Déplacement et balayage

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

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

  3. Ajustez la série de timings[] et amplitudes[] pour générer la courbe d'accélération, comme illustré dans la figure 6.

Vibration longue

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.

Couple audio

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

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

  • Remplacez AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted) par false 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.
  • Le HAL du vibreur doit implémenter la compatibilité avec le contrôle externe.

Haptique couplée à l'audio

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.

Architecture du générateur haptique

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.

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

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

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

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

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

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