Все улучшения платформы Android, основанные на тактильных ощущениях, основаны на наборе принципов UX, которые развиваются с одинаковой скоростью. Текущие принципы включают замену жужжащей вибрации четкими тактильными ощущениями и исследование богатых тактильных ощущений .
Рисунок 1. Действующие принципы
В следующей таблице перечислены все доступные тактильные API.
API | Методы | Год добавления |
---|---|---|
android.view.HapticFeedbackConstants |
| До 2016 года |
| 2017 (Андроид 8) | |
| 2020 (Андроид 11) | |
Android.Просмотреть |
| До 2016 года |
android.os.Вибратор |
| До 2016 года |
| 2017 (Андроид 8) | |
| 2020 (Андроид 11) | |
android.os.VibrationEffect |
| 2017 (Андроид 8) |
| 2019 (Андроид 10) | |
android.os.VibrationEffect.Composition |
| 2020 (Андроид 11) |
android.media.AudioAttributes.Builder |
| 2019 (Андроид 10) |
Шумная вибрация
Начиная с пейджеров и обычных телефонов, низкокачественная, но энергоэффективная вибрация на основе зуммера ERM использовалась вместо звукового звонка в беззвучном режиме . Устаревшие аппаратные компоненты, издающие громкие и неприятные звуковые шумы, могут нанести вред тактильному UX, создавая некачественные впечатления (например, дешевый сломанный телефон).
Четкая тактильная связь
Четкие тактильные ощущения поддерживают ощущение дискретных изменений состояния (например, двоичных изменений во время процесса включения/выключения питания). Из-за характера дискретной доступности четкие тактильные ощущения генерируются как единое целое (например, один тактильный эффект на одно входное событие).
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 . чтобы узнать больше о тактильной реализации.
Рисунок 3. Нажатие и отпускание.
Богатые тактильные ощущения
Богатая тактильность — это растущая категория тактильных ощущений, выходящая за рамки эффектов, основанных на одиночных импульсах. Android стремится поддерживать богатые тактильные ощущения с высокой возможностью компоновки и настройки с высоким уровнем детализации. Следующие варианты использования поддерживаются в Android 11 или более ранней версии.
Рисунок 4. Богатые тактильные ощущения со скользящей текстурой.
Рисунок 5. Перетаскивание
Вариант использования 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[]
для создания кривой плавности, как показано на рисунке 6.
Рисунок 6. Кривая ослабления длинной вибрации
Вариант использования 3: тактильные ощущения, связанные со звуком
Тактильные ощущения, связанные со звуком, — это тактильные паттерны в сочетании с ритмом звука, призванные привлечь внимание пользователя.
Тактильные ощущения со звуком: преимущества
Чтобы реализовать тактильные ощущения со звуком, объедините четкие тактильные ощущения с длинными вибрациями. Сильные, но короткие тактильные ощущения от четких тактильных ощущений создают дискретные ритмические узоры. В сочетании с сильными стимулами, которые обеспечивает длительная вибрация, это отлично помогает привлечь внимание пользователя.
Важно учитывать ритмические закономерности ощущений. Если нет чувства ритма, пользователь воспринимает тактильные ощущения как случайное жужжание и склонен игнорировать их.
Рисунок 7. Пример тактильных ощущений аудиопары
Тактильные ощущения со звуком: советы по реализации
Реализация тактильной связи со звуком требует базового понимания воспроизведения контента как по аудио, так и по тактильным каналам. Имейте в виду следующие вещи.
Используйте классы
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 используйте
Рисунок 8. Реализация тактильной связи со звуком
Тактильные ощущения со звуком: тактильный генератор
HapticGenerator
— это аудиоэффект , представленный в Android 12, который может генерировать тактильные данные из аудиоканала и воспроизводить их в реальном времени как тактильные сигналы, связанные со звуком . Эффект применяется к AudioTrack
как описано на рисунке 9.
Рисунок 9. Архитектура тактильного генератора
Чтобы убедиться, что ваш алгоритм тактильного генератора генерирует высококачественные тактильные ощущения, настройте алгоритм генерации на двигатель вибратора устройства, настроив параметры, которые настраивают цепочку фильтров, которые он применяет к звуковым сигналам. В этом разделе подробно описаны эти параметры и объясняется, как настроить их в соответствии со спецификациями вашего оборудования.
Резонансная частота полосового фильтра
Резонансная частота вибратора — это частота, при которой тактильный привод имеет максимальную мощность. Этот параметр настраивает антирезонатор, чтобы частично сгладить передаточную функцию отклика и получить более широкую полосу пропускания. Платформа Android автоматически связывает это значение с выходными данными метода Vibrator HAL
IVibrator.getResonantFrequency
.Значение по умолчанию для этого параметра — 150 Гц . Это можно изменить в коде здесь .
Степень нормализации для медленной огибающей
Этот параметр определяет показатель степени частичной нормализации (автоматическая регулировка усиления). Его значение по умолчанию — -0,8 , что означает, что 80% изменения динамического диапазона удаляется с помощью этого шага регулировки усиления. Это можно изменить в коде здесь .
Добротность полосового фильтра
Добротность вибратора (добротность) определяется двумя параметрами:
Zero Q, добротность нулей в полосовом фильтре, который частично подавляет резонанс.
Полюс Q, добротность полюсов полосового фильтра.
Соотношение этих двух значений ограничивает подавление резонанса, чтобы усилить более низкие частоты и расширить отклик алгоритма. Например, значения по умолчанию 8 для нулевой добротности и 4 для полюсной добротности дают коэффициент 2 , ограничивая подавление резонанса коэффициентом 2 (6 дБ). Платформа Android связывает оба значения с выходными данными метода Vibrator HAL
IVibrator.getQFactor
.Если значения по умолчанию не учитывают снижение мощности двигателя в вашем устройстве, мы рекомендуем изменить оба значения одновременно и либо увеличить оба, либо уменьшить оба. Отношение нулевой Q к полюсной Q должно быть больше 1 . Это можно изменить в коде здесь .
Угловая частота искажений
Изломная частота применяется фильтром нижних частот, который подавляет вибрацию низкого уровня и усиливает более высокие уровни с помощью кубического искажения. По умолчанию установлено значение 300 Гц . Это можно изменить в коде здесь .
Входное усиление и порог искажения куба
Эти параметры используются фильтром нелинейных искажений, применяемым к входному сигналу, который подавляет амплитуду низкочастотных сигналов и увеличивает высокочастотные.
- Значение по умолчанию для входного коэффициента усиления составляет 0,3 .
- Значение по умолчанию для порога куба — 0,1 .
Мы рекомендуем изменить оба значения вместе. Их можно найти в коде здесь .
Дополнительную информацию о функции, применяемой этим фильтром, можно найти в реализации, доступной здесь . Чтобы узнать больше о том, как эти два параметра влияют на выходной сигнал, мы рекомендуем построить график частотных характеристик фильтров и понаблюдать, как частотные характеристики изменяются при различных значениях параметров.
Выходное усиление искажений
Этот параметр контролирует конечную амплитуду вибрации. Это окончательное усиление, применяемое после мягкого ограничителя, который ограничивает амплитуду вибрации до уровня менее 1. Его значение по умолчанию — 1,5 , и его можно изменить в коде здесь . Если вибрация слишком слабая, увеличьте значение. Если вы слышите дребезжание оборудования привода, уменьшите значение.
Все улучшения платформы Android, основанные на тактильных ощущениях, основаны на наборе принципов UX, которые развиваются с одинаковой скоростью. Текущие принципы включают замену жужжащей вибрации четкими тактильными ощущениями и исследование богатых тактильных ощущений .
Рисунок 1. Действующие принципы
В следующей таблице перечислены все доступные тактильные API.
API | Методы | Год добавления |
---|---|---|
android.view.HapticFeedbackConstants |
| До 2016 года |
| 2017 (Андроид 8) | |
| 2020 (Андроид 11) | |
Android.Просмотреть |
| До 2016 года |
android.os.Вибратор |
| До 2016 года |
| 2017 (Андроид 8) | |
| 2020 (Андроид 11) | |
android.os.VibrationEffect |
| 2017 (Андроид 8) |
| 2019 (Андроид 10) | |
android.os.VibrationEffect.Composition |
| 2020 (Андроид 11) |
android.media.AudioAttributes.Builder |
| 2019 (Андроид 10) |
Шумная вибрация
Начиная с пейджеров и обычных телефонов, низкокачественная, но энергоэффективная вибрация на основе зуммера ERM использовалась вместо звукового звонка в беззвучном режиме . Устаревшие аппаратные компоненты, издающие громкие и неприятные звуковые шумы, могут нанести вред тактильному UX, создавая некачественные впечатления (например, дешевый сломанный телефон).
Четкая тактильная связь
Четкие тактильные ощущения поддерживают ощущение дискретных изменений состояния (например, двоичных изменений во время процесса включения/выключения питания). Из-за природы дискретной доступности четкие тактильные ощущения генерируются как единое целое (например, один тактильный эффект на одно входное событие).
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 . чтобы узнать больше о тактильной реализации.
Рисунок 3. Нажатие и отпускание.
Богатые тактильные ощущения
Богатая тактильность — это растущая категория тактильных ощущений, выходящая за рамки эффектов, основанных на одиночных импульсах. Android стремится поддерживать богатые тактильные ощущения с высокой возможностью компоновки и настройки с высоким уровнем детализации. Следующие варианты использования поддерживаются в Android 11 или более ранней версии.
Рисунок 4. Богатые тактильные ощущения со скользящей текстурой.
Рисунок 5. Перетаскивание
Вариант использования 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[]
для создания кривой плавности, как показано на рисунке 6.
Рисунок 6. Кривая ослабления длинной вибрации
Вариант использования 3: тактильные ощущения, связанные со звуком
Тактильные ощущения, связанные со звуком, — это тактильные паттерны в сочетании с ритмом звука, призванные привлечь внимание пользователя.
Тактильные ощущения со звуком: преимущества
Чтобы реализовать тактильные ощущения со звуком, объедините четкие тактильные ощущения с длинными вибрациями. Сильные, но короткие тактильные ощущения от четких тактильных ощущений создают дискретные ритмические узоры. В сочетании с сильными стимулами, которые обеспечивает длительная вибрация, это отлично помогает привлечь внимание пользователя.
Важно учитывать ритмические закономерности ощущений. Если нет чувства ритма, пользователь воспринимает тактильные ощущения как случайное жужжание и склонен игнорировать их.
Рисунок 7. Пример тактильных ощущений аудиопары
Тактильные ощущения со звуком: советы по реализации
Реализация тактильной связи со звуком требует базового понимания воспроизведения контента как по аудио, так и по тактильным каналам. Имейте в виду следующие вещи.
Используйте классы
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 используйте
Рисунок 8. Реализация тактильной связи со звуком
Тактильные ощущения со звуком: тактильный генератор
HapticGenerator
— это аудиоэффект , представленный в Android 12, который может генерировать тактильные данные из аудиоканала и воспроизводить их в реальном времени как тактильные сигналы, связанные со звуком . Эффект применяется к AudioTrack
как описано на рисунке 9.
Рисунок 9. Архитектура тактильного генератора
Чтобы убедиться, что ваш алгоритм тактильного генератора генерирует высококачественные тактильные ощущения, настройте алгоритм генерации на двигатель вибратора устройства, настроив параметры, которые настраивают цепочку фильтров, которые он применяет к звуковым сигналам. В этом разделе подробно описаны эти параметры и объясняется, как настроить их в соответствии со спецификациями вашего оборудования.
Резонансная частота полосового фильтра
Резонансная частота вибратора — это частота, при которой тактильный привод имеет максимальную мощность. Этот параметр настраивает антирезонатор, чтобы частично сгладить передаточную функцию отклика и получить более широкую полосу пропускания. Платформа Android автоматически связывает это значение с выходными данными метода HAL Vibrator
IVibrator.getResonantFrequency
.Значение по умолчанию для этого параметра — 150 Гц . Это можно изменить в коде здесь .
Степень нормализации для медленной огибающей
Этот параметр определяет показатель степени частичной нормализации (автоматическая регулировка усиления). Его значение по умолчанию — -0,8 , что означает, что 80% изменения динамического диапазона удаляется с помощью этого шага регулировки усиления. Это можно изменить в коде здесь .
Добротность полосового фильтра
Добротность вибратора (добротность) определяется двумя параметрами:
Zero Q, добротность нулей в полосовом фильтре, который частично подавляет резонанс.
Полюс Q, добротность полюсов полосового фильтра.
Соотношение этих двух значений ограничивает подавление резонанса, чтобы усилить более низкие частоты и расширить отклик алгоритма. Например, значения по умолчанию 8 для нулевой добротности и 4 для полюсной добротности дают коэффициент 2 , ограничивая подавление резонанса коэффициентом 2 (6 дБ). Платформа Android связывает оба значения с выходными данными метода Vibrator HAL
IVibrator.getQFactor
.Если значения по умолчанию не учитывают снижение мощности двигателя в вашем устройстве, мы рекомендуем изменить оба значения одновременно и либо увеличить оба, либо уменьшить оба. Отношение нулевой Q к полюсной Q должно быть больше 1 . Это можно изменить в коде здесь .
Угловая частота искажений
Изломная частота применяется с помощью фильтра нижних частот, который подавляет вибрацию низкого уровня и усиливает более высокие уровни с помощью кубического искажения. По умолчанию установлено значение 300 Гц . Это можно изменить в коде здесь .
Входное усиление и порог искажения куба
Эти параметры используются фильтром нелинейных искажений, применяемым к входному сигналу, который ослабляет амплитуду низкочастотных сигналов и увеличивает высокочастотные.
- Значение по умолчанию для входного коэффициента усиления составляет 0,3 .
- Значение по умолчанию для порога куба — 0,1 .
Мы рекомендуем изменить оба значения вместе. Их можно найти в коде здесь .
Дополнительную информацию о функции, применяемой этим фильтром, можно найти в реализации, доступной здесь . Чтобы узнать больше о том, как эти два параметра влияют на выходной сигнал, мы рекомендуем построить график частотных характеристик фильтров и понаблюдать, как частотные характеристики изменяются при различных значениях параметров.
Выходное усиление искажений
Этот параметр контролирует конечную амплитуду вибрации. Это окончательное усиление, применяемое после мягкого ограничителя, который ограничивает амплитуду вибрации до уровня менее 1. Его значение по умолчанию — 1,5 , и его можно изменить в коде здесь . Если вибрация слишком слабая, увеличьте значение. Если вы слышите дребезжание оборудования привода, уменьшите значение.