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