Праймер для виброприводов

Прежде чем разрабатывать тактильные эффекты на устройстве Android, полезно получить представление о том, как работают вибрационные приводы.

Иллюстрация компонентов Haptic LRA

Наиболее распространенными вибрационными приводами являются линейные резонансные приводы (LRA). Каждый LRA состоит из звуковой катушки, прижатой к магнитной движущейся массе, прикрепленной к пружине. Напряжение переменного тока, подаваемое на звуковую катушку, создает электромагнитную силу, которая заставляет массу двигаться. Пружина обеспечивает восстанавливающую силу, которая заставляет груз вернуться в исходное положение. Возвратно-поступательное движение массы вызывает вибрацию LRA. Они имеют резонансную частоту, при которой выходная мощность максимальна.

При одинаковом входном напряжении на двух разных частотах амплитуды выходной вибрации могут быть разными. Чем дальше частота от резонансной частоты LRA, тем ниже амплитуда его вибрации.

Одной из распространенных функций LRA в устройстве является имитация ощущения нажатия кнопки на неотзывчивой стеклянной поверхности. Это помогает сделать взаимодействие с пользователем более естественным. При применении к набору текста на виртуальной клавиатуре обратная связь по щелчку может увеличить скорость набора текста и уменьшить количество ошибок. Четкий и четкий сигнал обратной связи по щелчку обычно длится менее 10–20 миллисекунд. Для достижения хорошего щелчка требуются некоторые знания о LRA, используемом в устройстве. Вот почему использование готовых сигналов обеспечивает наилучшую обратную связь по щелчку. Вы можете использовать их с константами, предоставляемыми платформой, всякий раз, когда требуется обратная связь по клику.

Тактильные эффекты, достижимые в устройстве, определяются как виброприводом, так и его приводом. Тактильные драйверы, включающие функции ускорения и активного торможения, могут уменьшить время нарастания и звон LRA, что приводит к более отзывчивой и четкой вибрации. Для иллюстрации давайте посмотрим, как пользовательский образец сигнала ведет себя на обычном устройстве.

Котлин

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 // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex))

Ява

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 // Do not repeat.

vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, repeatIndex));

На графике ниже показана форма сигнала, соответствующая фрагментам кода, показанным выше.

График входного сигнала ступенчатой ​​функции

Соответствующее ускорение показано ниже:

График фактической измеренной формы сигнала, показывающий более органичные переходы между уровнями

Обратите внимание, что ускорение увеличивается постепенно, а не внезапно, всякий раз, когда происходит ступенчатое изменение амплитуды диаграммы (например, при 0 мс, 150 мс, 200 мс, 250 мс, 700 мс). Также наблюдается перерегулирование при каждом ступенчатом изменении амплитуды и видимый «звон», который длится не менее 50 мс, когда входная амплитуда внезапно падает до 0.

Эту тактильную картину можно улучшить, постепенно увеличивая и уменьшая амплитуды, чтобы избежать перерегулирования и сократить время звонка. Ниже показаны графики формы сигнала и ускорения пересмотренной версии.

Котлин

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

Ява

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

График входного сигнала с дополнительными шагами

График измеренной формы сигнала, показывающий более плавные переходы

Отсюда следует, что для создания тактильного эффекта на устройстве Android требуется нечто большее, чем просто предоставление значения частоты и амплитуды. Спроектировать тактильный эффект с нуля, не имея полного доступа к техническим характеристикам вибропривода и драйвера, — нетривиальная задача. API Android предоставляют константы, которые позволяют делать следующее:

  • Выполняйте четкие эффекты и примитивы .

  • Объедините их, чтобы создать новые тактильные эффекты.

Эти предопределенные тактильные константы и примитивы могут значительно ускорить вашу работу, обеспечивая при этом высококачественные тактильные эффекты.