Наиболее распространенными виброприводами на устройствах Android являются линейные резонансные приводы (LRA) . LRA имитируют ощущение нажатия кнопки на нереагирующей стеклянной поверхности. Ясный и четкий сигнал обратной связи щелчка обычно длится от 10 до 20 миллисекунд. Это ощущение делает взаимодействие пользователя более естественным. Для виртуальных клавиатур эта обратная связь щелчка может увеличить скорость печати и сократить количество ошибок.
LRA имеют несколько общих резонансных частот :
- Некоторые LRA имели резонансные частоты в диапазоне от 200 до 300 Гц, что совпадает с частотой, на которой кожа человека наиболее чувствительна к вибрации. Ощущение вибрации в этом диапазоне частот обычно описывается как плавное, резкое и проникающее.
- Другие модели LRA имеют более низкие резонансные частоты, около 150 Гц. Ощущение качественно мягче и полнее (по объему).
При одинаковом входном напряжении на двух разных частотах амплитуды вибрации на выходе могут быть разными. Чем дальше частота от резонансной частоты LRA, тем ниже амплитуда ее вибрации.
Тактильные эффекты данного устройства используют как вибропривод, так и его драйвер. Тактильные драйверы, включающие функции овердрайва и активного торможения, могут сократить время нарастания и звон LRA, что приводит к более отзывчивой и четкой вибрации.
Ускорение выходного сигнала вибратора
Отображение частоты к выходному ускорению (FOAM) описывает максимально достижимое выходное ускорение (в пике G) при заданной частоте вибрации (в герцах). Начиная с Android 16 (уровень API 36), платформа предоставляет встроенную поддержку этого отображения через VibratorFrequencyProfile
. Вы можете использовать этот класс вместе с базовыми и расширенными API-интерфейсами огибающей для создания тактильных эффектов.
Большинство двигателей LRA имеют один пик в FOAM, обычно вблизи резонансной частоты. Ускорение обычно уменьшается экспоненциально по мере отклонения частоты от этого диапазона. Кривая может быть несимметричной и может иметь плато около резонансной частоты для защиты двигателя от повреждения.
На соседнем графике показан пример ПЕНЫ для двигателя LRA.
Порог обнаружения человеческого восприятия
Порог обнаружения человеческого восприятия относится к минимальному ускорению вибрации, которое человек может надежно обнаружить. Этот уровень варьируется в зависимости от частоты вибрации.
Соседний график показывает порог обнаружения человеческого тактильного восприятия, при ускорении, как функцию временной частоты. Пороговые данные преобразованы из порога смещения на рисунке 1 статьи Bolanowski Jr., SJ, et al. 1988 года "Четыре канала опосредуют механические аспекты прикосновения" .
Android автоматически обрабатывает этот порог в BasicEnvelopeBuilder
, который проверяет, что все эффекты используют диапазон частот, который создает амплитуды вибрации, превышающие порог обнаружения человеческого восприятия как минимум на 10 дБ.
Онлайн-руководство более подробно объясняет преобразование амплитуды ускорения в амплитуду смещения .
Уровни ускорения вибрации
Человеческое восприятие интенсивности вибрации, мера восприятия , не растет линейно с амплитудой вибрации, физическим параметром. Воспринимаемая интенсивность характеризуется уровнем чувствительности (УО), который определяется как величина дБ выше порога обнаружения на той же частоте.
Соответствующую амплитуду ускорения вибрации (в пике G) можно рассчитать следующим образом:
...где амплитуда дБ представляет собой сумму SL и порога обнаружения — значения по вертикальной оси на соседнем графике — на определенной частоте.
На соседнем графике показаны уровни ускорения вибрации при 10, 20, 30, 40 и 50 дБ SL, а также порог обнаружения тактильного восприятия человека (0 дБ SL) в зависимости от временной частоты. Данные получены с помощью рисунка 8 в статье Verrillo, RT, et al. 1969 года «Величина ощущения вибротактильных стимулов» .
Android автоматически обрабатывает это преобразование в BasicEnvelopeBuilder
, который принимает значения как нормализованные интенсивности в пространстве уровня ощущений (dB SL) и преобразует их в выходное ускорение. WaveformEnvelopeBuilder
, с другой стороны, не применяет это преобразование и вместо этого принимает значения как нормализованные амплитуды выходного ускорения в пространстве ускорения (Gs). API огибающей предполагает, что когда проектировщик или разработчик думает об изменениях силы вибрации, они ожидают, что воспринимаемая интенсивность будет следовать кусочно-линейной огибающей.
Сглаживание формы волны по умолчанию на устройствах
Для иллюстрации рассмотрим, как ведет себя пользовательский шаблон формы волны на стандартном устройстве:
Котлин
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))
Ява
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));
На следующих графиках показана входная форма волны и выходное ускорение, соответствующие предыдущим фрагментам кода. Обратите внимание, что ускорение увеличивается постепенно, а не внезапно, всякий раз, когда в шаблоне происходит ступенчатое изменение амплитуды, то есть при 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));
Создавайте более сложные тактильные эффекты
Другие элементы в удовлетворительном отклике на щелчок более сложны, требуя некоторых знаний о LRA, используемом в устройстве. Для достижения наилучших результатов используйте предварительно подготовленные формы волн устройства и константы, предоставляемые платформой, которые позволяют вам делать следующее:
- Выполнять четкие эффекты и примитивы .
- Объединяйте их, чтобы создавать новые тактильные эффекты.
Эти предопределенные тактильные константы и примитивы могут значительно ускорить вашу работу, создавая высококачественные тактильные эффекты.