Как реализовать константы и примитивы

Константы и примитивы тактильных ощущений определяются HAL вибратора и сопоставляются фреймворком Android с общедоступными API. Чтобы узнать, соответствует ли ваше устройство минимальным требованиям для реализации тактильной обратной связи, выполните следующие проверки:

Блок-схема процесса реализации тактильной обратной связи

Рисунок 2. Реализация эффектов

Блок-схема этапов реализации примитивов

Рисунок 3. Как реализовать примитивы

Как реализовать константы

Разработчики могут использовать константы тактильных ощущений в VibrationEffect с помощью VibrationEffect.createPredefined(). Ниже приведены статусы реализации констант.

Константы тактильной обратной связи Местоположения и сводки
EFFECT_TICK, EFFECT_CLICK, EFFECT_HEAVY_CLICK, EFFECT_DOUBLE_CLICK VibrationEffect class
Константы тактильной отдачи в VibrationEffect не включают никаких понятий о событиях ввода и не имеют элементов пользовательского интерфейса. Вместо этого константы включают понятие уровней энергии, таких как EFFECT_CLICK и EFFECT_HEAVY_CLICK, которые вызываются createPredefined().

Альтернативные вибрации, описанные далее, выполняются на устройствах, на которых не реализованы константы VibrationEffect. Рекомендуем обновить эти конфигурации, чтобы они лучше работали на таких устройствах.

  • EFFECT_CLICK

    Вибрация с заданной формой волны, созданная с помощью VibrationEffect.createWaveform и временных параметров, заданных в frameworks/base/core/res/res/values/config.xml##config_virtualKeyVibePattern.

  • EFFECT_HEAVY_CLICK

    Вибрация формы сигнала, созданная с помощью VibrationEffect.createWaveform, и временные параметры, заданные в frameworks/base/core/res/res/values/config.xml##config_longPressVibePattern.

    • EFFECT_DOUBLE_CLICK

    Вибрация формы сигнала, созданная с помощью VibrationEffect.createWaveform и временных параметров (0, 30, 100, 30).

  • EFFECT_TICK

    Вибрация с заданной формой волны, созданная с помощью VibrationEffect.createWaveform и временных параметров, заданных в frameworks/base/core/res/res/values/config.xml##config_clockTickVibePattern.

Блок-схема с шагами для тестирования тактильной обратной связи

Рисунок 4. Как реализовать константы обратной связи

Константы виброотклика в HapticFeedbackConstants могут использоваться разработчиками с помощью View.performHapticFeedback(). Проверьте статус следующих общедоступных констант виброотклика.

Константы тактильной обратной связи Местоположения и сводки
CLOCK_TICK, CONTEXT_CLICK, KEYBOARD_PRESS, KEYBOARD_RELEASE, KEYBOARD_TAP, LONG_PRESS, TEXT_HANDLE_MOVE, VIRTUAL_KEY, VIRTUAL_KEY_RELEASE, CONFIRM, REJECT, GESTURE_START, GESTURE_END Класс HapticFeedbackConstants
Константы тактильных ощущений в HapticFeedbackConstants помогают при вводе событий с определенными элементами интерфейса, такими как KEYBOARD_PRESS и KEYBOARD_RELEASE, которые вызываются с помощью performHapticFeedback().

Как реализовать примитивы

Примитивы тактильной отдачи в VibrationEffect.Composition имеют масштабируемую интенсивность, которую разработчики могут использовать через addPrimitive(int primitiveId, float scale, int delay). Примитивы можно разделить на две категории:

  • Короткие примитивы. Примитивы с короткой продолжительностью, обычно менее 20 мс. К ним относятся CLICK, TICK и LOW_TICK.

  • Примитивы Chirp. Примитивы с переменной амплитудой и частотой, обычно более длительные, чем короткие примитивы. Это SLOW_RISE, QUICK_RISE, QUCK_FALL, THUD и SPIN.

Примитивы типа short

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

Важным показателем качества коротких вибраций является отношение импульса к звонку (PRR), показанное на рисунке 5. PRR – это отношение между основным импульсом, определяемым сигналом в окне длительности, где амплитуда уменьшается до 10% от пиковой амплитуды, и импульсом звонка, определяемым сигналом, где амплитуда уменьшается с 10% до менее чем 1% от пиковой амплитуды. Формула для расчета PRR:

$$ \text{Pulse to ring ratio (PRR)} = 20log_{10}\frac{\text{RMS (main pulse)}}{\text{RMS (ring)}} $$

Подробнее о PRR можно узнать в статье Анализ формы волны, а о том, как анализировать и сравнивать результаты, – в статье Сравнение результатов с помощью карты эффективности.

Соотношение импульсов и звонков

Рисунок 5. Определение соотношения пульса к звонку

Используйте короткие примитивы в качестве обратной связи с пользователем или в более длинных композициях, чтобы создавать мягкие текстуры. Это означает, что они часто срабатывают и воспроизводятся друг за другом. Воспринимаемая интенсивность одного короткого примитива может усиливать интенсивность более крупного эффекта. Поэтому калибруйте примитив с одним или небольшим количеством тиков с помощью более крупной композиции, например 100 последовательных тиков.

Примитив клика

Примитив щелчка – это сильный, четкий эффект, который обычно работает близко к резонансной частоте устройства, чтобы достичь максимальной мощности за короткое время. Он сильнее и глубже других примитивов и работает на максимальной интенсивности.

Если доступно, используйте форсирование двигателя в начале и активное торможение в конце, чтобы сократить время нарастания и спада крутящего момента. Для некоторых двигателей использование прямоугольной волны вместо синусоидальной может обеспечить более быстрое ускорение. На рисунке 6 показан пример профиля ускорения для примитива "клик":

Нажмите на профиль ускорения вывода примитивов.

Рисунок 6. Пример профиля ускорения вывода для примитива клика

Параметр Рекомендация
Продолжительность

Целевое значение: 12 мс

Ограничение: < 30 мс

Пиковое ускорение на выходе

Цель: 2 G

Ограничение: > 1 ГБ

Частота Приблизительно на резонансной частоте

Примитив "Галочка" (легкая галочка)

Примитив "щелчок" – это резкий и короткий эффект, обычно работающий в более высоком диапазоне частот. Этот примитив также можно описать как клик средней интенсивности с более высокой частотой и коротким хвостом. Те же рекомендации применимы для достижения короткого времени нарастания с помощью форсирования двигателя или прямоугольной волны для начального запуска и активного торможения при смещении. На рисунке 7 показан пример профиля ускорения для примитива tick:

Профиль ускорения примитива &quot;Такты&quot;

Рисунок 7. Пример профиля ускорения для примитива "галочка"

Параметр Рекомендация
Продолжительность

Целевое значение: 5 мс

Ограничение: < 20 мс

Максимальное ускорение на выходе

Цель: половина от CLICK, 1 G

Ограничение: от 0,5 до 1 G.

Частота

Цель: 2x резонансная частота

Ограничение: < 500 Гц

Примитив с низкой частотой обновления

Низкий щелчок – это более мягкая и слабая версия легкого щелчка, работающая в более низком диапазоне частот, чтобы придать эффекту больше объема. Этот примитив также можно описать как клик средней интенсивности с низкой частотой, предназначенный для многократного использования в целях динамической обратной связи. Те же рекомендации применимы для достижения короткого времени нарастания с помощью перегрузки двигателя или прямоугольной волны для начального запуска. На рисунке 8 показан пример выходного профиля ускорения для примитива с низким тиком:

Профиль ускорения для примитивов с низкой частотой обновления

Рисунок 8. Пример профиля ускорения вывода для примитива с низкой частотой

Параметр Рекомендация
Продолжительность

Целевое значение: 12 мс

Ограничение: < 30 мс

Максимальное ускорение на выходе

Цель: 1/4 от TICK, 0,25 Г

Ограничение: от 0,2 до 0,5 G.

Частота

Цель: 2/3 резонансной частоты

Ограничение: < 100 Гц.

Примитивы Chirp

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

Примитивное значение медленного роста

Медленный подъем – это медленное увеличение амплитуды и частоты с мягким началом и постоянно увеличивающейся интенсивностью вибрации. Его можно реализовать, последовательно изменяя амплитуду и частоту, используя более низкий диапазон частот, который работает вне резонанса. На рисунке 9 показаны входные параметры и пример выходного профиля ускорения для этой реализации. Красная линия соответствует значениям амплитуды слева и показывает, как амплитуда вибрации меняется со временем. Синяя линия соответствует меткам частоты справа и показывает, как частота вибрации меняется со временем.)

Входные параметры и профиль ускорения для примитива с медленным подъемом

Рисунок 9. Входные параметры и пример профиля ускорения для примитива с медленным нарастанием

Если частотная характеристика двигателя ограничена (недостаточно сильная вне резонансной частоты), то альтернативным вариантом является синусоидальная развертка от 1/2x до 1x резонансной частоты. Резонанс двигателя способствует достижению пика сигнала в конце.

Параметр Рекомендация
Продолжительность

Целевое значение: 500 мс.

Допуск: 20 мс

Пиковое ускорение на выходе

Целевое значение: 0,5 G

Ограничение: от 0,5 до 1 ГБ.

Частота

Целевое значение: от 1/2 до 2/3 резонансной частоты

Альтернатива: 1/2 резонансной частоты

Примитивное значение быстрого роста

Быстрый подъем – это более быстрое увеличение амплитуды и частоты с мягким началом и постоянным ростом интенсивности вибрации. Целевые значения ускорения и частоты вибрации должны быть такими же, как у примитива "медленный подъем", но достигаться за более короткое время. На рисунке 10 показаны входные параметры вибрации и пример выходного профиля ускорения для примитива медленного подъема. Красная линия соответствует значениям амплитуды слева и показывает, как амплитуда вибрации меняется со временем. Синяя линия соответствует меткам частоты справа и показывает, как частота вибрации меняется со временем.

Входные параметры и профиль ускорения для примитива быстрого подъема

Рисунок 10. Входные параметры и пример профиля ускорения для примитива быстрого подъема

Параметр Рекомендация
Продолжительность

Целевое значение: 150 мс

Допуск: 20 мс

Максимальное ускорение на выходе

Цель: как на устройстве "SLOW_RISE"

Ограничение: то же, что и у SLOW_RISE

Частота

Цель: как на устройстве "SLOW_RISE"

Альтернативный вариант: как на устройстве "SLOW_RISE"

Примитивное значение быстрого падения

Быстрое падение – это быстрое снижение амплитуды и частоты с мягким началом. Вы можете использовать более высокую частоту в качестве отправной точки, пока двигатель разгоняется до максимального выходного ускорения. Частота должна постоянно уменьшаться на протяжении всего свипа, даже во время нарастания. На рисунке 11 показаны входные параметры и пример выходного профиля ускорения для этой реализации. Красная линия соответствует значениям амплитуды слева и показывает, как амплитуда вибрации меняется со временем. Синяя линия соответствует меткам частоты справа и показывает, как частота вибрации меняется со временем.

Входные параметры и выходной профиль ускорения для примитива быстрого падения

Рисунок 11. Входные параметры и пример выходного профиля ускорения для примитива быстрого падения

Параметр Рекомендация
Продолжительность

Целевое значение: 100 мс.

Допуск: 20 мс

Максимальное ускорение на выходе

Цель: 1 ГБ

Ограничение: от 0,5 до 2 ГБ.

Частота

Целевой диапазон: от 1 до 2 раз больше резонансной частоты.

Примитив "Глухой удар"

Глухой стук – это низкий ударный эффект, который имитирует физическое ощущение стука по полой древесине. Этот примитив работает в низкочастотном диапазоне, как и примитив Low Tick, и позволяет сделать эффект более ощутимым. Вы можете реализовать примитив "глухой удар" как нисходящую развертку амплитуды и частоты в более низком диапазоне частот (желательно менее 100 Гц). На рисунке 12 показаны входные параметры и пример выходного профиля ускорения для этой реализации. Красная линия соответствует меткам амплитуды слева и показывает, как амплитуда вибрации меняется со временем. Синяя линия соответствует меткам частоты справа и показывает, как частота вибрации меняется со временем.

Входные параметры и профиль ускорения для примитива &quot;удар&quot;

Рисунок 12. Входные параметры и пример выходного профиля ускорения для примитива "глухой удар"

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

Параметр Рекомендация
Продолжительность

Целевое значение: 300 мс

Допустимое отклонение: 20 мс.

Максимальное ускорение на выходе

Цель: 0,25 G

Ограничение: от 0,2 G до 0,5 G.

Частота

Целевое значение: от 1/2 до 1/3 резонансной частоты

Альтернативный вариант: от 1x до 1/2 резонансной частоты

Примитив вращения

Вращение имитирует быстрое вращение вверх и вниз с небольшим акцентом в центре. Вращение можно реализовать, независимо изменяя амплитуду и частоту в противоположных направлениях, а затем в обратном порядке. Важно использовать более низкий диапазон частот (желательно менее 100 Гц). На рисунке 13 показаны входные параметры и пример выходного профиля ускорения для этой реализации. Красная линия соответствует значениям амплитуды слева и показывает, как амплитуда вибрации меняется со временем. Синяя линия соответствует меткам частоты справа и показывает, как частота вибрации меняется со временем.

Мы рекомендуем вызывать примитив вращения дважды подряд или трижды в композициях, чтобы создать ощущение вращения и неустойчивости.

Если частотная характеристика мотора ограничена, можно выполнить быстрое синусоидальное сканирование от 1/2x до 1x резонансной частоты и обратно. Резонанс автоматически добавляет акцент в середине сигнала.

Входные параметры и выходной профиль ускорения для примитива вращения

Рисунок 13. Входные параметры и пример выходного профиля ускорения для примитива вращения

Параметр Рекомендация
Продолжительность

Целевое значение: 150 мс

Допуск: 20 мс

Пиковое ускорение на выходе

Целевое значение: 0,5 G

Ограничение: от 0,25 G до 0,75 G.

Частота

Цель: 2/3, затем 1/3, затем снова 1/2 резонансной частоты

Альтернативный вариант: от 2/3 до 1x, затем обратно до 1/2 резонансной частоты