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

Рисунок 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) использовались в качестве замены звукового сигнала в бесшумном режиме . Устаревшие аппаратные компоненты, издающие громкие и неприятные звуки, могут ухудшить тактильный пользовательский опыт, создавая впечатление низкого качества (например, как дешевый, сломанный телефон).
Четкая тактильная отдача
Тактильная обратная связь Clear поддерживает ощущение дискретных изменений состояния (например, бинарных изменений во время включения и выключения питания). В силу дискретной природы аффорданса, тактильная обратная связь Clear генерируется как единое целое (например, один тактильный эффект на одно входное событие).
Цель Android — обеспечить четкую тактильную обратную связь с сильными, но резкими ощущениями, а не с вибрацией или размытостью.
К числу предопределенных тактильных констант, созданных для обеспечения четкой тактильной обратной связи, относятся следующие элементы.
-
CLOCK_TICK -
CONFIRM -
CONTEXT_CLICK -
GESTURE_END -
GESTURE_START -
KEYBOARD_PRESS -
KEYBOARD_RELEASE -
KEYBOARD_TAP -
LONG_PRESS -
REJECT -
TEXT_HANDLE_MOVE -
VIRTUAL_KEY -
VIRTUAL_KEY_RELEASE
В VibrationEffect :
-
EFFECT_CLICK -
EFFECT_DOUBLE_CLICK -
EFFECT_HEAVY_CLICK -
EFFECT_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 интерфейса Vibrator HAL .
Вариант использования 2: Длительная вибрация с эффектом плавного привыкания.
Длительная вибрация — это плавная вибрация с плавным переходом амплитуды от 0 до целевой амплитуды. Длительная вибрация может вызывать ощутимые тактильные ощущения, привлекающие внимание. Однако внезапная длительная вибрация может напугать пользователя в тихой обстановке и часто сопровождается слышимым жужжанием. Чтобы создать более приятную длительную вибрацию, примените эффект плавного нарастания в начале вибрации. Это обеспечит плавный переход амплитуды, постепенно приближающийся к целевой амплитуде.
Примените эффект постепенного вхождения.
Проверьте аппаратные возможности управления амплитудой с помощью
android.os.Vibrator.hasAmplitudeControl().- Результат должен быть
true, чтобы создать эффект постепенного нарастания интенсивности с изменяющейся амплитудой.
- Результат должен быть
Используйте
VibrationEffectcreateWaveform(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). - Примеры применения включают мелодии звонка и звуки пользовательского интерфейса с синхронной тактильной обратной связью.
- По умолчанию тактильные каналы отключены (
Вибрационный HAL должен поддерживать внешнее управление.
- Для реализаций HIDL используйте
setExternalControl(bool enabled) generates (Status status). - Для реализаций AIDL используйте
void setExternalControl(in boolean enabled).
- Для реализаций HIDL используйте

Рисунок 7. Реализация тактильной обратной связи, связанной со звуком.
Тактильная обратная связь со звуком: HapticGenerator
HapticGenerator — это звуковой эффект, представленный в Android 12, который может генерировать тактильные данные из аудиоканала и воспроизводить их в реальном времени в виде тактильной обратной связи . Эффект применяется к AudioTrack , как показано на рисунке 8:

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