Все улучшения фреймворка 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 , и его можно изменить в коде .
Если вибрация слишком слабая, увеличьте значение. Если слышен дребезжащий звук привода, уменьшите значение.