Les actionneurs de vibration les plus courants sur les appareils Android sont les actionneurs à résonance linéaire (LRA). Les LRA simulent la sensation d'un clic sur un bouton sur une surface en verre qui ne répondrait pas autrement. Un signal de retour sur clic clair et net dure généralement entre 10 et 20 millisecondes. Cette sensation rend les interactions des utilisateurs plus naturelles. Pour les claviers virtuels, ce retour de clic peut augmenter la vitesse de frappe et réduire les erreurs.
Les LAR présentent quelques fréquences de résonance courantes:
- Certaines LRA présentaient des fréquences de résonance comprises entre 200 et 300 Hz, ce qui coïncide avec la fréquence à laquelle la peau humaine est la plus sensible aux vibrations. La sensation de vibrations dans cette plage de fréquences est généralement décrite comme douce, nette et pénétrante.
- D'autres modèles de LRA ont des fréquences de résonance plus basses, autour de 150 Hz. La sensation est qualitativement plus douce et plus complète (en dimension).
Pour une même tension d'entrée à deux fréquences différentes, les amplitudes de sortie de vibration peuvent être différentes. Plus la fréquence est éloignée de la fréquence de résonance du LRA, plus son amplitude de vibration est faible.
Les effets haptiques d'un appareil donné utilisent à la fois l'actionneur de vibration et son pilote. Les pilotes haptiques qui incluent des fonctionnalités d'overdrive et de freinage actif peuvent réduire le temps de montée et le sifflement des LRA, ce qui permet d'obtenir une vibration plus réactive et plus claire.
Accélération de la sortie du vibreur
La cartographie de la fréquence à l'accélération de sortie (FOAM) décrit l'accélération de sortie maximale (en G peak) à une fréquence de vibration donnée (en Hertz). À partir d'Android 16 (niveau d'API 36), la plate-forme prend en charge ce mappage de manière intégrée via le VibratorFrequencyProfile
. Vous pouvez utiliser cette classe, ainsi que les API d'enveloppe de base et avancée, pour créer des effets haptiques.
La plupart des moteurs LRA présentent un seul pic dans leur FOAM, généralement près de leur fréquence de résonance. L'accélération diminue généralement de manière exponentielle à mesure que la fréquence s'écarte de cette plage. La courbe peut ne pas être symétrique et présenter un plateau autour de la fréquence de résonance pour protéger le moteur contre les dommages.
Le graphique adjacent montre un exemple de FOAM pour un moteur LRA.
Seuil de détection de la perception humaine
Le seuil de détection de la perception humaine fait référence à l'accélération minimale d'une vibration qu'une personne peut détecter de manière fiable. Ce niveau varie en fonction de la fréquence de vibration.
Le graphique adjacent montre le seuil de détection de la perception haptique humaine, en accélération, en fonction de la fréquence temporelle. Les données de seuil sont converties à partir du seuil de déplacement de la figure 1 de Bolanowski Jr., Numéro J., et al., "Four channels mediate the mechanical aspects of touch."
Android gère automatiquement ce seuil dans BasicEnvelopeBuilder
, qui vérifie que tous les effets utilisent une plage de fréquences qui produit des amplitudes de vibration qui dépassent le seuil de détection de la perception humaine d'au moins 10 dB.
Un tutoriel en ligne explique plus en détail la conversion entre l'amplitude d'accélération et l'amplitude de déplacement.
Niveaux d'accélération des vibrations
La perception humaine de l'intensité des vibrations, une mesure de perception, n'augmente pas de manière linéaire avec l'amplitude des vibrations, un paramètre physique. L'intensité perçue est caractérisée par le niveau de sensation (SL), qui est défini comme une valeur en dB au-dessus du seuil de détection à la même fréquence.
L'amplitude d'accélération des vibrations correspondante (en G peak) peut être calculée comme suit:
...où le dB d'amplitude est la somme de la SL et du seuil de détection (valeur sur l'axe vertical du graphique adjacent) à une fréquence donnée.
Le graphique adjacent montre les niveaux d'accélération des vibrations à 10, 20, 30, 40 et 50 dB SL, ainsi que le seuil de détection de la perception haptique humaine (0 dB SL), en fonction de la fréquence temporelle. Les données sont estimées à partir de la figure 8 de Verrillo, R. Article de T., et al. publié en 1969, "Sensation magnitude of vibrotactile stimuli."
Android gère automatiquement cette conversion dans BasicEnvelopeBuilder
, qui prend les valeurs comme des intensités normalisées dans l'espace de niveau de sensation (dB SL) et les convertit en accélération de sortie. En revanche, WaveformEnvelopeBuilder
n'applique pas cette conversion et prend les valeurs comme amplitudes d'accélération de sortie normalisées dans l'espace d'accélération (G). L'API d'enveloppe suppose que, lorsqu'un concepteur ou un développeur réfléchit aux variations de l'intensité des vibrations, il s'attend à ce que l'intensité perçue suive une enveloppe linéaire par morceaux.
Lissage de la forme d'onde par défaut sur les appareils
Pour illustration, considérons le comportement d'un modèle de forme d'onde personnalisée sur un appareil générique:
Kotlin
val timings: LongArray = longArrayOf(50, 50, 50, 50, 50, 100, 350, 250)
val amplitudes: IntArray = intArrayOf(77, 79, 84, 99, 143, 255, 0, 255)
val repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] { 50, 50, 50, 50, 50, 100, 350, 250 };
int[] amplitudes = new int[] { 77, 79, 84, 99, 143, 255, 0, 255 };
int repeatIndex = -1 // Don't repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
Les graphiques suivants montrent la forme d'onde d'entrée et l'accélération de sortie correspondant aux extraits de code précédents. Notez que l'accélération augmente progressivement, et non brusquement, chaque fois qu'il y a un changement d'amplitude par palier dans le modèle, c'est-à-dire à 0 ms, 150 ms, 200 ms, 250 ms et 700 ms. Il y a également un dépassement à chaque changement d'amplitude par pas, et un sifflement visible qui dure au moins 50 ms lorsque l'amplitude d'entrée passe soudainement à 0.
Amélioration du modèle haptique
Pour éviter les dépassements et réduire la durée de sonnerie, modifiez les amplitudes plus progressivement. Vous trouverez ci-dessous les graphiques de forme d'onde et d'accélération de la version révisée:
Kotlin
val timings: LongArray = longArrayOf(
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
)
val amplitudes: IntArray = intArrayOf(
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
)
val repeatIndex = -1 // Do not repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))
Java
long[] timings = new long[] {
25, 25, 50, 25, 25, 25, 25, 25, 25, 25, 75, 25, 25,
300, 25, 25, 150, 25, 25, 25
};
int[] amplitudes = new int[] {
38, 77, 79, 84, 92, 99, 121, 143, 180, 217, 255, 170, 85,
0, 85, 170, 255, 170, 85, 0
};
int repeatIndex = -1; // Do not repeat.
vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));
Créer des effets haptiques plus complexes
D'autres éléments d'une réponse satisfaisante au clic sont plus complexes et nécessitent une certaine connaissance de la LRA utilisée dans un appareil. Pour de meilleurs résultats, utilisez les formes d'onde préfabriquées de l'appareil et les constantes fournies par la plate-forme, qui vous permettent de faire ce qui suit:
- Effectuez des effets clairs et des primitives.
- Concaténez-les pour composer de nouveaux effets haptiques.
Ces constantes et primitives haptiques prédéfinies peuvent considérablement accélérer votre travail tout en créant des effets haptiques de haute qualité.