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
  • PASSER_HANDLE_TEXTE
  • SORTIE_DE_CLÉ_VIRTUELLE
2017 (Android 8)
  • CONFIRMER
  • REFUSER
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performanceHapticFeedback()
Avant 2016
android.os.Vibrator
  • vibreur()
  • 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
  • CLIC_PRIMITIF
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

Vibreur strident

Pour les téléphones multimédias et les téléphones multimédias, des vibrations ERM de faible qualité, mais économes en énergie, basées sur un buzzer ont été utilisées pour remplacer les sonneries sonores en mode silencieux. Les anciens composants matériels qui produisent des bruits sonores forts et désagréables peuvent nuire à l'expérience utilisateur haptique en générant des impressions de mauvaise qualité (par exemple, un téléphone cassé et bon marché).

Retour haptique clair

Des retours haptiques clairs prennent en charge la sensation de changements d'état distincts (par exemple, des changements binaires lors du processus d'allumage et de mise hors tension). En raison de la nature de l' affordance discrète, des retours haptiques clairs sont générés en tant qu'entité unique (par exemple, un effet haptique pour un é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 réglage é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

Faire glisser et balayer

Figure 5. Déplacer 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 bourdonnant plutôt que net, les intervalles entre les répétitions sont susceptibles 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). L'assistance 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. Cependant, une vibration longue soudaine peut surprendre les utilisateurs dans un environnement calme et produit souvent des bruits de bourdonnement 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 lissage à l'approche

  1. Vérifiez les capacités matérielles du contrôle de l'amplitude avec android.os.Vibrator.hasAmplitudeControl().

    • Le résultat doit être true pour produire un effet de lissage de vitesse 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. Longue courbe d'aisance 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 de capter efficacement l'attention de l'utilisateur.

Il est important de prendre en compte les rythmes 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 de retour haptique de couple audio

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é du retour 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 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 prendre en charge la commande externe.

Haptique couplée à l'audio

Figure 8. Implémenter le retour haptique couplé audio

Retour haptique couplé 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 sous forme de retours haptiques couplés par 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 correspond à la fréquence à laquelle un actionneur haptique a une sortie maximale. Ce paramètre ajuste un anti-resonateur pour aplatir partiellement la fonction de transfert de 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:

    • Zero-Q, le facteur de qualité des zéros dans le filtre de fin de bande qui annule partiellement la résonance.

    • Q du pô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 du pôle produisent un ratio de 2, ce qui limite la suppression des résonances d'un facteur de 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 de 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 zéro Q et le pôle Q 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 d'angle est appliquée par un filtre passe-bas qui supprime les vibrations de bas niveau et améliore les niveaux les plus élevés à l'aide d'une distorsion cubique. La valeur par défaut est 300 Hz. Vous pouvez le modifier 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 basse et augmente ceux dont la fréquence est la 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 représenter 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.

  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 et peut être modifiée dans le code ici. Si les vibrations sont trop subtiles, augmentez la valeur. Si vous entendez le matériel de l'actionneur cliqueter, diminuez la valeur.