Все улучшения фреймворка Android, связанные с тактильной обратной связью, основаны на наборе принципов UX, которые постоянно развиваются. Текущие принципы включают замену жужжащей вибрации на четкие тактильные ощущения и изучение насыщенных тактильных ощущений.
Рисунок 1. Действующие принципы.
В таблице ниже перечислены все доступные API для тактильной обратной связи.
| API | Методы и константы | Год добавления |
|---|---|---|
android.view.HapticFeedbackConstants |
|
До 2016 г. |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.View |
|
До 2016 года |
android.os.Vibrator |
|
До 2016 г. |
|
2017 (Android 8) | |
|
2020 (Android 11) | |
android.os.VibrationEffect |
|
2017 (Android 8) |
|
2019 (Android 10) | |
android.os.VibrationEffect.Composition |
|
2020 (Android 11) |
android.media.AudioAttributes.Builder |
|
2019 (Android 10) |
Вибрация с жужжанием
Вибрация, создаваемая зуммером с эксцентриковым вращающимся грузом (ERM), – это энергоэффективный, но не очень качественный способ оповещения, который использовался ещё в пейджерах и мобильных телефонах среднего класса в качестве замены звукового сигнала в режиме без звука. Устаревшие аппаратные компоненты, которые издают громкие и неприятные звуки, могут ухудшить тактильное взаимодействие с пользователем, создавая впечатление низкого качества (например, дешевого сломанного телефона).
Отключить вибрацию
Четкая тактильная отдача позволяет ощущать отдельные изменения состояния (например, двоичные изменения при включении и выключении устройства). Из-за природы дискретных элементов управления четкие вибрации генерируются как единое целое (например, один эффект вибрации на одно событие ввода).
Android стремится обеспечить четкую тактильную отдачу с сильными, но резкими ощущениями, а не с жужжащими или мягкими.
Предопределенные константы, созданные для поддержки четких тактильных сигналов, включают следующие элементы.
CLOCK_TICKCONFIRMCONTEXT_CLICKGESTURE_ENDGESTURE_STARTKEYBOARD_PRESSKEYBOARD_RELEASEKEYBOARD_TAPLONG_PRESSREJECTTEXT_HANDLE_MOVEVIRTUAL_KEYVIRTUAL_KEY_RELEASE
EFFECT_CLICKEFFECT_DOUBLE_CLICKEFFECT_HEAVY_CLICKEFFECT_TICK
Обмен знаниями между производителями устройств и разработчиками – ключ к повышению общего качества тактильных сигналов в экосистеме Android. Чтобы узнать больше о реализации тактильной обратной связи, ознакомьтесь с основным контрольным списком, оценкой оборудования и CDD.
Рисунок 2. Нажатие и отпускание.
Расширенная тактильная обратная связь
Расширенная тактильная отдача – это развивающаяся категория тактильных эффектов, которые не ограничиваются одиночными импульсами. Android стремится поддерживать разнообразные тактильные эффекты с высокой степенью компонуемости и настраиваемости с высоким уровнем детализации. В Android 11 и более ранних версиях поддерживаются следующие варианты использования:
Рисунок 3. Виброотклик с текстурой скольжения.
Рисунок 4. Перетаскивание и пролистывание.
Пример использования 1. Скользящая текстура
Если тактильный эффект повторяется, когда палец скользит по сенсорной поверхности (например, при перетаскивании, проведении, изучении поверхности с фантомной тактильной текстурой), повторяющиеся тактильные эффекты должны быть четкими и едва заметными.
Если эффект нечеткий, а гудящий, то интервалы между повторениями, скорее всего, будут стерты. В результате получается один длинный гудок, а не несколько отдельных сигналов.
Если амплитуда недостаточно мала, то при повторении тактильные ощущения будут усиливаться и в конце станут слишком сильными.
Как реализовать тактильную текстуру поверхности для жестов смахивания и перетаскивания
Используйте CLOCK_TICK и TEXT_HANDLE_MOVE в HapticFeedbackConstants.
Эти константы определяют характеристики повторения и амплитуды.
Как создать свой эффект
Чтобы создать собственный эффект, составьте дизайн, соединив последовательности PRIMITIVE_CLICK и PRIMITIVE_TICK в VibrationEffect.Composition.
Вы можете настроить характеристики повторения и шкалу амплитуды с помощью addPrimitive(int primitiveID, float scale, int delay). Поддержка зависит от возможности CAP_COMPOSE_EFFECTS интерфейса HAL вибратора.
Пример 2. Длинная вибрация с эффектом плавного появления
Длинная вибрация – это вибрация с плавной амплитудой, которая переходит от 0 к целевой амплитуде. Длинная вибрация может создавать ощутимые тактильные сигналы, привлекающие внимание. Однако внезапная продолжительная вибрация может напугать пользователей в тихой обстановке и часто сопровождается слышимым гудением. Чтобы сделать длинную вибрацию более приятной, примените эффект плавного появления в начале. Это обеспечивает плавный переход к целевой амплитуде.
Как применить эффект замедления в начале
Проверьте аппаратные возможности управления амплитудой с помощью команды
android.os.Vibrator.hasAmplitudeControl().- Чтобы создать эффект замедления с разной амплитудой, результат должен быть равен
true.
- Чтобы создать эффект замедления с разной амплитудой, результат должен быть равен
Используйте
VibrationEffect.createWaveform(timings[], amplitudes[], int repeat).Настройте последовательность
timings[]иamplitudes[], чтобы создать кривую замедления, как показано на рисунке 5.
Рисунок 5. Кривая нарастания длинной вибрации.
Пример использования 3: тактильный отклик, связанный со звуком
Аудиосвязанная тактильная обратная связь – это тактильные паттерны, связанные с ритмом аудио, чтобы привлечь внимание пользователя.
Преимущества виброотклика, связанного с аудио
Чтобы реализовать тактильные сигналы, связанные со звуком, сочетайте четкие тактильные сигналы с длинными вибрациями. Четкая тактильная отдача создает сильные, но короткие вибрации, которые складываются в ритмичные паттерны. В сочетании с высоким уровнем стимуляции, который обеспечивает длительная вибрация, это отлично привлекает внимание пользователя.
Важно учитывать ритмические закономерности ощущений. Если ритм не ощущается, пользователь воспринимает тактильные ощущения как случайные вибрации и, как правило, игнорирует их.
Рисунок 6. Пример тактильного отклика при воспроизведении аудио.
Тактильная обратная связь, связанная со звуком: советы по реализации
Чтобы реализовать тактильную обратную связь, связанную со звуком, необходимо понимать, как воспроизводится контент на аудио- и тактильных каналах. Обратите внимание на следующее:
Используйте классы
MediaPlayerилиSoundPool.- Объекты в формате OGG со специальным ключом метаданных (
ANDROID_HAPTIC, за которым следует количество каналов тактильной отдачи) указывают на наличие данных тактильной отдачи и воспроизведения с помощьюMediaPlayerиSoundPool.
- Объекты в формате OGG со специальным ключом метаданных (
Укажите, что в
audio_policy_configuration.xmlподдерживается тактильная обратная связь и воспроизведение аудио.- Используйте выходной профиль с каналом тактильной обратной связи.
AUDIO_CHANNEL_OUT_HAPTIC_A|B - Помните, что в выходном потоке с тактильными каналами они представлены как дополнительные каналы в данных.
Пример
Если маска канала для выходного потока выглядит так:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_AКаждый фрагмент должен выглядеть так:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A- Используйте выходной профиль с каналом тактильной обратной связи.
Замените
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)наfalse, чтобы воспроизвести канал тактильной обратной связи.- По умолчанию каналы тактильной обратной связи отключены (
true). - Примеры использования: рингтоны и звуки интерфейса с синхронной вибрацией и обратной связью.
- По умолчанию каналы тактильной обратной связи отключены (
Vibrator HAL должен поддерживать внешний контроль.
- Для реализаций HIDL используйте
setExternalControl(bool enabled) generates (Status status). - Для реализаций AIDL используйте
void setExternalControl(in boolean enabled).
- Для реализаций HIDL используйте
Рисунок 7. Реализация тактильных ощущений, связанных со звуком.
Вибрация, связанная со звуком: HapticGenerator
HapticGenerator – это аудиоэффект, добавленный в Android 12, который может генерировать тактильные данные из аудиоканала и воспроизводить их в реальном времени в виде аудиосвязанной тактильной обратной связи. Эффект применяется к AudioTrack, как показано на рисунке 8.

Рисунок 8. архитектура генератора тактильных ощущений;
На этой схеме показано, где генератор тактильных ощущений применяется к входящему аудиопотоку пользователя, прежде чем он будет отправлен в HAL аудио. Генератор применяется после того, как AudioMixer разделяет аудио- и тактильные данные, и до любого другого аудиоэффекта. Его выходные данные переопределяют любые предыдущие тактильные данные в потоке.
Чтобы алгоритм генерировал качественные тактильные сигналы, настройте его для вибропривода устройства, изменив параметры, которые задают цепочку фильтров, применяемых к временным диаграммам аудиосигналов. В этом разделе подробно описаны эти параметры и объясняется, как настроить их в соответствии со спецификацией оборудования.
Резонансная частота для полосового фильтра
Резонансная частота вибратора – это частота, при которой тактильный привод имеет максимальную выходную мощность. Этот параметр настраивает антирезонатор, чтобы частично сгладить передаточную функцию, чтобы получить более широкую полосу пропускания. Платформа Android автоматически связывает это значение с результатом метода Vibrator HAL
IVibrator.getResonantFrequency.Значение по умолчанию для этого параметра – 150 Гц. Его можно изменить в коде.
Нормализация мощности для медленного конверта
Этот параметр определяет показатель степени при частичной нормализации (автоматическом управлении усилением). По умолчанию используется значение -0,8, что означает, что на этом этапе регулировки усиления удаляется 80% изменений динамического диапазона. Вы можете изменить это в коде.
Коэффициент добротности режекторного фильтра
Фактор качества вибратора определяется двумя параметрами:
Zero Q – коэффициент качества нулей в режекторном фильтре, который частично подавляет резонанс.
Добротность полюсов в режекторном фильтре.
Соотношение этих двух значений ограничивает подавление резонанса, чтобы усилить низкие частоты и расширить реакцию алгоритма. Например, если для параметра Zero Q задано значение 8, а для параметра Pole Q – 4, то их соотношение будет равно 2, а подавление резонанса будет ограничено коэффициентом 2 (6 дБ). Платформа Android связывает оба значения с выходными данными метода HAL вибратора
IVibrator.getQFactor.Если значения по умолчанию не учитывают ослабление мощности мотора в вашем устройстве, рекомендуем изменить оба значения одновременно, увеличив или уменьшив их. Отношение добротности нуля к добротности полюса должно быть больше 1. Вы можете изменить это в коде.
Частота среза для искажения
Угловая частота применяется фильтром нижних частот, который подавляет вибрацию низкого уровня и усиливает вибрацию более высокого уровня с помощью кубического искажения. По умолчанию используется значение 300 Гц. Вы можете изменить его в коде.
Входное усиление и пороговое значение искажения
Эти параметры используются фильтром нелинейных искажений, который применяется к входной форме волны и ослабляет амплитуду сигналов низкой частоты, а также увеличивает амплитуду сигналов высокой частоты.
- Значение по умолчанию для коэффициента усиления входного сигнала – 0,3.
- По умолчанию пороговое значение для куба составляет 0,1.
Рекомендуем изменять оба значения одновременно. Они указаны в коде.
Чтобы узнать больше о функции, применяемой этим фильтром, ознакомьтесь с ее реализацией в коде.
Чтобы узнать больше о том, как эти два параметра влияют на выходные данные, мы рекомендуем построить частотные характеристики фильтров и посмотреть, как они меняются при разных значениях параметров.
Усиление выходного сигнала для искажения
Этот параметр определяет итоговую амплитуду вибрации. Это окончательное усиление, применяемое после мягкого ограничителя, который ограничивает амплитуду вибрации до значения меньше 1. Значение по умолчанию – 1, 5.Его можно изменить в коде.
Если вибрация слишком слабая, увеличьте значение. Если вы слышите, как дребезжит привод, уменьшите значение.