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

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

Принципы 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)

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

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

Ясные тактильные ощущения

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

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 и более ранних версиях.

Rich Haptics

Рисунок 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 автоматически связывает это значение с выходным сигналом метода 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 , и его можно изменить в коде .

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