Fondation UX pour le cadre haptique

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 .

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
  • CLAVIER_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRMER
  • REJETER
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
Avant 2016
android.os.Vibrateur
  • vibrer()
  • hasVibrator()
Avant 2016
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • créerOneShot()
  • créer une forme d'onde ()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredéfini()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • composer()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
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.

Appuie et relache

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.

Une haptique riche

Figure 4. Tactique riche avec texture coulissante

Glisser et glisser

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

  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 d’aisance 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’aisance, comme le montre 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.

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.

Couple audio

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

  • 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 des sonneries et des sons d'interface utilisateur avec une haptique et un retour synchrones.
  • Le vibrateur HAL doit mettre en œuvre un support de contrôle externe.

Haptique couplée à l'audio

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.

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é, 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.

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

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

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

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

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

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