UX-основа для тактильной структуры

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

Принципы UX

Рисунок 1. Современные принципы.

В таблице ниже перечислены все доступные API для тактильной обратной связи:

API Методы и константы Год добавлен
android.view.HapticFeedbackConstants
  • CONTEXT_CLICK
  • CLOCK_TICK
  • VIRTUAL_KEY
  • KEYBOARD_TAP
  • LONG_PRESS
До 2016 года
  • KEYBOARD_PRESS
  • KEYBOARD_RELEASE
  • TEXT_HANDLE_MOVE
  • VIRTUAL_KEY_RELEASE
2017 (Android 8)
  • CONFIRM
  • REJECT
  • GESTURE_START
  • GESTURE_END
2020 (Android 11)
android.View
  • performHapticFeedback()
До 2016 года
android.os.Vibrator
  • vibrate()
  • hasVibrator()
До 2016 года
  • hasAmplitudeControl()
2017 (Android 8)
  • areAllEffectsSupported()
  • areAllPrimitivesSupported()
  • areEffectsSupported()
  • arePrimitivesSupported()
2020 (Android 11)
android.os.VibrationEffect
  • createOneShot()
  • createWaveform()
2017 (Android 8)
  • EFFECT_TICK
  • EFFECT_CLICK
  • EFFECT_HEAVY_CLICK
  • EFFECT_DOUBLE_CLICK
  • createPredefined()
2019 (Android 10)
android.os.VibrationEffect.Composition
  • PRIMITIVE_TICK
  • PRIMITIVE_CLICK
  • addPrimitive()
  • compose()
2020 (Android 11)
android.media.AudioAttributes.Builder
  • setHapticChannelsMuted()
2019 (Android 10)

Жужжащая вибрация

Начиная с пейджеров и обычных мобильных телефонов, низкокачественные, но энергоэффективные вибрации на основе эксцентриковых вращающихся масс (ERM) использовались в качестве замены звукового сигнала в бесшумном режиме . Устаревшие аппаратные компоненты, издающие громкие и неприятные звуки, могут ухудшить тактильный пользовательский опыт, создавая впечатление низкого качества (например, как дешевый, сломанный телефон).

Четкая тактильная отдача

Тактильная обратная связь Clear поддерживает ощущение дискретных изменений состояния (например, бинарных изменений во время включения и выключения питания). В силу дискретной природы аффорданса, тактильная обратная связь Clear генерируется как единое целое (например, один тактильный эффект на одно входное событие).

Цель Android — обеспечить четкую тактильную обратную связь с сильными, но резкими ощущениями, а не с вибрацией или размытостью.

К числу предопределенных тактильных констант, созданных для обеспечения четкой тактильной обратной связи, относятся следующие элементы.

В HapticFeedbackConstants :

  • 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 до целевой амплитуды. Длительная вибрация может вызывать ощутимые тактильные ощущения, привлекающие внимание. Однако внезапная длительная вибрация может напугать пользователя в тихой обстановке и часто сопровождается слышимым жужжанием. Чтобы создать более приятную длительную вибрацию, примените эффект плавного нарастания в начале вибрации. Это обеспечит плавный переход амплитуды, постепенно приближающийся к целевой амплитуде.

Примените эффект постепенного вхождения.

  1. Проверьте аппаратные возможности управления амплитудой с помощью android.os.Vibrator.hasAmplitudeControl() .

    • Результат должен быть true , чтобы создать эффект постепенного нарастания интенсивности с изменяющейся амплитудой.
  2. Используйте VibrationEffect createWaveform(timings[], amplitudes[], int repeat) .

  3. Отрегулируйте последовательность timings[] и amplitudes[] чтобы построить кривую постепенного нарастания, как показано на рисунке 5.

Длительная вибрация

Рисунок 5. Длинная кривая постепенного нарастания вибрации.

Вариант использования 3: Тактильная обратная связь со звуком

Тактильная обратная связь, связанная со звуком, представляет собой тактильные сигналы, которые взаимодействуют с ритмом аудио, чтобы привлечь внимание пользователя.

Тактильная обратная связь со звуком: преимущества

Для реализации тактильной обратной связи, связанной со звуком, следует сочетать четкую тактильную обратную связь с длительными вибрациями. Сильные, но короткие тактильные ощущения от четкой тактильной обратной связи создают дискретные ритмические паттерны. В сочетании с высокой интенсивностью воздействия длительной вибрации это отлично привлекает внимание пользователя.

Важно учитывать ритмические закономерности ощущений. Если ритм отсутствует, пользователь воспринимает тактильные ощущения как случайные подергивания и склонен их игнорировать.

Аудиопара

Рисунок 6. Пример тактильной обратной связи при аудиосвязи.

Тактильная обратная связь со звуком: советы по внедрению

Для реализации тактильной обратной связи, сопряженной со звуком, необходимо базовое понимание воспроизведения контента как в аудиоканале, так и в тактильной обратной связи. Учитывайте следующие моменты:

  • Используйте классы MediaPlayer или SoundPool .

    • Ресурсы в формате OGG со специальным ключом метаданных ( ANDROID_HAPTIC за которым следует количество каналов тактильной обратной связи) указывают на наличие данных тактильной обратной связи и воспроизведение с помощью MediaPlayer и SoundPool .
  • Укажите поддержку тактильной обратной связи и воспроизведения звука в 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 должен поддерживать внешнее управление.

Тактильная обратная связь на основе звука

Рисунок 7. Реализация тактильной обратной связи, связанной со звуком.

Тактильная обратная связь со звуком: HapticGenerator

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

Haptic Generator architecture

Рисунок 8. Архитектура генератора тактильной обратной связи.

Эта визуализация архитектуры показывает, где генератор тактильной обратной связи применяется к входящему аудиопотоку пользователя до того, как он будет отправлен в Audio HAL. Генератор применяется после того, как AudioMixer разделяет аудио- и тактильные данные, и до применения каких-либо других звуковых эффектов, и его выходные данные переопределяют любые предыдущие тактильные данные в потоке.

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

  • Резонансная частота полосового фильтра

    Резонансная частота вибратора — это частота, на которой тактильный актуатор имеет максимальную выходную мощность. Этот параметр регулирует антирезонатор, частично выравнивая передаточную функцию отклика для получения более широкой полосы пропускания. Платформа Android автоматически связывает это значение с выходным сигналом метода IVibrator.getResonantFrequency объекта Vibrator HAL.

    Значение по умолчанию для этого параметра — 150 Гц . Вы можете изменить его в коде .

  • Нормализующая способность для медленной огибающей

    Этот параметр определяет показатель степени в частичной нормализации (автоматическая регулировка усиления). Его значение по умолчанию равно -0,8 , что означает, что 80% вариаций динамического диапазона устраняются на этом этапе регулировки усиления. Вы можете изменить это значение в коде .

  • Добротность (Q-фактор) полосового фильтра

    Добротность вибратора (фактор Q) определяется двумя параметрами:

    • Нулевая добротность (Zero Q) — это коэффициент качества нулей в полосовом фильтре, который частично компенсирует резонанс.

    • Добротность полюсов (Pole Q) — это коэффициент качества полюсов в полосовом фильтре.

    Соотношение этих двух значений ограничивает подавление резонанса для усиления низких частот и расширения диапазона отклика алгоритма. Например, значения по умолчанию 8 для Zero Q и 4 для Pole Q дают соотношение 2 , ограничивая подавление резонанса в 2 раза (6 дБ). Android-фреймворк связывает оба значения с выходными данными метода IVibrator.getQFactor в HAL-модуле Vibrator.

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

  • Угловая частота искажений

    Частота среза задается фильтром нижних частот, который подавляет низкочастотные колебания и усиливает высокочастотные с помощью кубического искажения. По умолчанию она составляет 300 Гц . Вы можете изменить это значение в коде .

  • Входное усиление и кубический пороговый уровень искажений

    Эти параметры используются нелинейным фильтром искажений, применяемым к входному сигналу, который подавляет амплитуду низкочастотных сигналов и увеличивает амплитуду высокочастотных сигналов.

    • Значение по умолчанию для коэффициента усиления на входе составляет 0,3 .
    • Значение по умолчанию для порогового значения куба составляет 0,1 .

    Мы рекомендуем изменять оба значения одновременно. Их можно найти в коде .

    Для получения более подробной информации о функции, применяемой этим фильтром, обратитесь к реализации в коде .

    Чтобы узнать больше о том, как эти два параметра влияют на выходной сигнал, мы рекомендуем построить графики частотных характеристик фильтров и понаблюдать за тем, как частотные характеристики изменяются при различных значениях параметров.

  • Выходное усиление для коррекции искажений

    Этот параметр управляет конечной амплитудой колебаний. Это итоговое усиление, применяемое после мягкого ограничителя, который ограничивает амплитуду колебаний до значения менее 1. Его значение по умолчанию равно 1,5 , и вы можете изменить его в коде .

    Если вибрация слишком слабая, увеличьте значение. Если слышен дребезг деталей привода, уменьшите значение.