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