Все улучшения платформы Android, основанные на тактильных ощущениях, основаны на наборе принципов UX, которые развиваются с одинаковой скоростью. Текущие принципы включают замену жужжащей вибрации четкими тактильными ощущениями и исследование богатых тактильных ощущений .
Рисунок 1. Действующие принципы.
В следующей таблице перечислены все доступные тактильные API:
API | Методы и константы | Год добавления |
---|---|---|
android.view.HapticFeedbackConstants |
| До 2016 года |
| 2017 (Андроид 8) | |
| 2020 (Андроид 11) | |
android.View |
| До 2016 года |
android.os.Vibrator |
| До 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 . чтобы узнать больше о тактильной реализации.
Рисунок 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. Архитектура тактильного генератора.
Эта визуализация архитектуры показывает, где Haptic Generator применяется к входящему пользовательскому аудиопотоку перед его отправкой в Audio HAL. Генератор применяется после того, как AudioMixer
разделяет аудио и тактильные данные и перед любым другим звуковым эффектом, и его выходные данные переопределяют любые предыдущие тактильные данные в потоке.
Чтобы убедиться, что ваш алгоритм тактильного генератора генерирует высококачественные тактильные ощущения, настройте алгоритм генерации на двигатель вибратора устройства, настроив параметры, которые настраивают цепочку фильтров, которые он применяет к звуковым сигналам. В этом разделе подробно описаны эти параметры и объясняется, как настроить их в соответствии со спецификациями вашего оборудования.
Резонансная частота полосового фильтра
Резонансная частота вибратора — это частота, при которой тактильный привод имеет максимальную мощность. Этот параметр настраивает антирезонатор, чтобы частично сгладить передаточную функцию отклика и получить более широкую полосу пропускания. Платформа 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.View |
| До 2016 года |
android.os.Vibrator |
| До 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 . чтобы узнать больше о тактильной реализации.
Рисунок 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. Архитектура тактильного генератора.
Эта визуализация архитектуры показывает, где Haptic Generator применяется к входящему пользовательскому аудиопотоку перед его отправкой в Audio HAL. Генератор применяется после того, как AudioMixer
разделяет аудио и тактильные данные и перед любым другим звуковым эффектом, и его выходные данные переопределяют любые предыдущие тактильные данные в потоке.
Чтобы убедиться, что ваш алгоритм тактильного генератора генерирует высококачественные тактильные ощущения, настройте алгоритм генерации на двигатель вибратора устройства, настроив параметры, которые настраивают цепочку фильтров, которые он применяет к звуковым сигналам. В этом разделе подробно описаны эти параметры и объясняется, как настроить их в соответствии со спецификациями вашего оборудования.
Резонансная частота полосового фильтра
Резонансная частота вибратора — это частота, при которой тактильный привод имеет максимальную мощность. Этот параметр настраивает антирезонатор, чтобы частично сгладить передаточную функцию отклика и получить более широкую полосу пропускания. Платформа 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.View |
| До 2016 года |
android.os.Vibrator |
| До 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 . чтобы узнать больше о тактильной реализации.
Рисунок 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. Архитектура тактильного генератора.
Эта визуализация архитектуры показывает, где Haptic Generator применяется к входящему пользовательскому аудиопотоку перед его отправкой в Audio HAL. Генератор применяется после того, как AudioMixer
разделяет аудио и тактильные данные и перед любым другим звуковым эффектом, и его выходные данные переопределяют любые предыдущие тактильные данные в потоке.
Чтобы убедиться, что ваш алгоритм тактильного генератора генерирует высококачественные тактильные сигналы, настройте алгоритм генерации на двигатель вибратора устройства, настроив параметры, которые настраивают цепочку фильтров, которые он применяет к звуковым сигналам. В этом разделе подробно описаны эти параметры и объясняется, как настроить их в соответствии со спецификациями вашего оборудования.
Резонансная частота полосового фильтра
Резонансная частота вибратора — это частота, при которой тактильный привод имеет максимальную мощность. Этот параметр настраивает антирезонатор, чтобы частично сгладить передаточную функцию отклика и получить более широкую полосу пропускания. Платформа 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 Framework, построенные вокруг тактиков, обусловлены набором принципов UX, которые развиваются с одинаковой скоростью. Нынешние принципы включают замену жужжащей вибрации на четкую тактику и изучение богатых гаптиков .
Рисунок 1. Текущие принципы.
В следующей таблице перечислены все доступные API Haptics:
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). Компоненты устаревшего аппаратного обеспечения, которые производят громкие и неприятные слышимые звуки, могут нанести вред тактичному 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 . Чтобы узнать больше о тактичной реализации.
Рисунок 2. Нажатие и выпуск.
Богатая гаптика
Rich Haptics -это растущая категория тактиков, которая выходит за рамки единых импульсных эффектов. 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
.- Используйте выходной профиль с каналом Haptics
AUDIO_CHANNEL_OUT_HAPTIC_A|B
. - Для выходного потока с тактичными каналами помните, что тактильные каналы представлены в виде дополнительных каналов в данных.
Пример
Если маска канала для выходного потока выглядит так:
AUDIO_CHANNEL_OUT_STEREO_HAPTIC_A
Тогда каждый образец должен выглядеть так:
AUDIO_LEFT_CHANNEL,AUDIO_RIGHT_CHANNEL,HAPTIC_CHANNEL_A
- Используйте выходной профиль с каналом Haptics
Изменить
AudioAttributes.Builder( ).setHapticChannelsMuted(boolean muted)
наfalse
, чтобы играть в тактичный канал.- По умолчанию тактильные каналы приглушены (
true
). - Варианты использования включают рингтоны и звуки пользовательского интерфейса с синхронной тактикой и обратной связью.
- По умолчанию тактильные каналы приглушены (
Вибратор HAL должен реализовать внешнюю поддержку управления.
- Для реализаций HIDL используйте
setExternalControl(bool enabled) generates (Status status)
. - Для реализаций AIDL используйте
void setExternalControl(in boolean enabled)
.
- Для реализаций HIDL используйте
Рисунок 7. Реализация аудио-связанных гаптиков.
Аудио связанная с собой тактика: гаптисиогенератор
HapticGenerator
-это аудиоэффект, введенный в Android 12, который может генерировать тактичные данные из аудиоканала и воспроизводить его в режиме реального времени в качестве аудио связаны так . Эффект применяется к AudioTrack
, как показано на рисунке 8:
Рисунок 8. Архитектура тактичного генератора.
Эта визуализация архитектуры показывает, где применяется тактичный генератор к входящему аудио -потоку пользователя, прежде чем он будет отправлен в Audio HAL. Генератор применяется после того, как AudioMixer
расщепляет аудио и тактисные данные и перед любым другим аудиоэффектом, а его выходные данные переопределяют любые предыдущие гаптические данные в потоке.
Чтобы убедиться, что ваш алгоритм Haptic Generator генерирует высококачественную хаптику, настройте алгоритм генерации на двигатель вибратора устройства, настраивая параметры, которые настраивают цепочку фильтров, которые он применяется к аудио-сигналам. В этом разделе подробно описываются эти параметры и объясняет, как настроить их на вашу спецификацию аппаратного обеспечения.
Резонансная частота для полосового фильтра
Резонансная частота вибратора - это частота, с которой тактичный привод имеет максимальный выход. Этот параметр корректирует анти-резонатор, чтобы частично выравнивать функцию передачи отклика, чтобы получить более широкую полосу пропускания. Android Framework автоматически связывает это значение с выводом метода Vibrator HAL
IVibrator.getResonantFrequency
.Значение по умолчанию для этого параметра составляет 150 Гц . Вы можете изменить это в коде .
Мощность нормализации для медленного конверта
Этот параметр определяет показатель в частичной нормализации (автоматическое управление усилением). Его значение по умолчанию составляет -0,8 , что означает, что 80% вариации динамического диапазона удаляется этим этапом управления усилением. Вы можете изменить это в коде .
Q-фактор для фильтра с задержкой полосы
Коэффициент качества вибратора (коэффициент Q) определяется двумя параметрами:
Zero Q, коэффициент качества нулей в фильтре с полос, который частично отменяет резонанс
Полюс Q, коэффициент качества полюсов в фильтре стопа полосы
Отношение этих двух значений ограничивает подавление резонанса, чтобы повысить более низкие частоты и расширить реакцию алгоритма. Например, значения по умолчанию 8 для нулевого Q и 4 для полюса Q дают соотношение 2 , ограничивая резонансное подавление в 2 раза (6 дБ). Android Framework связывает оба значения с выводом метода Vibrator HAL
IVibrator.getQFactor
.Если значения по умолчанию не учитывают демпфирование прочности двигателя в вашем устройстве, мы рекомендуем изменить оба значения одновременно и либо увеличивать обоих, либо уменьшать оба. Соотношение нуля Q к полюсу Q должно быть больше 1 . Вы можете изменить это в коде .
Угловая частота для искажений
Угловая частота применяется фильтром низкого уровня, который подавляет низкоуровневую вибрацию и повышает более высокие уровни, используя кубическое искажение. По умолчанию до 300 Гц . Вы можете изменить это в коде .
Усиление ввода и порог куба для искажений
Эти параметры используются нелинейным фильтром искажений, применяемым к входной форме волны, которая ослабляет амплитуду более низких частотных сигналов и увеличивает амплитуду высокочастотных сигналов.
- Значение по умолчанию для коэффициента усиления ввода составляет 0,3 .
- Значение по умолчанию для порога куба составляет 0,1 .
Мы рекомендуем изменить оба значения вместе. Их можно найти в коде .
Для получения дополнительной информации о функции, применяемой этим фильтром, см. Реализацию в коде .
Чтобы узнать больше о том, как эти два параметра влияют на вывод, мы рекомендуем построить частотные ответы фильтров и наблюдать, как частотные ответы меняются с различными значениями параметров.
Выходное усиление для искажений
Этот параметр управляет конечной амплитудой вибрации. Это окончательное усиление, применяемое после мягкого ограничителя, которое ограничивает амплитуды вибрации менее чем 1. Его значение по умолчанию составляет 1,5 , и вы можете изменить это в коде .
Если вибрация слишком тонкая, увеличьте значение. Если вы можете услышать, как оборудование привода греметь, уменьшите значение.