Skip to content

Вибродорожка из WAV-файла

Только iOS. Формат .ahap — Apple Core Haptics (iOS 13+). На Android playHaptic() / preloadHaptic() завершаются мгновенно без вибрации (if (!Platform.isIOS) return).

Для создания вибродорожки к анимации используется скрипт ahapify, который конвертирует аудиофайл .wav в паттерн вибрации .ahap (Apple Haptic and Audio Pattern).

Скрипт анализирует амплитуду звука каждые 20 мс и превращает её в кривые интенсивности и резкости вибрации.

Шаги

1. Подготовить WAV-файл

Положи .wav файл в директорию:

scripts/ahapify/input/<имя_файла>.wav

2. Запустить скрипт

bash
cd scripts
dart run ahapify/ahapify.dart

Готовый .ahap файл появится в scripts/ahapify/output/.

Если файл уже существует в output — скрипт пропустит его. Чтобы перегенерировать принудительно:

bash
dart run ahapify/ahapify.dart --force true

3. Скопировать в ассеты фичи

Положи .ahap в нужную папку ассетов, например:

features/sprint/assets/haptic/sprint_day_completed/streak_milestone.ahap

4. Обновить assets.gen.dart

Добавь запись вручную в lib/gen/assets.gen.dart нужной фичи:

dart
/// File path: assets/haptic/sprint_day_completed/streak_milestone.ahap
String get streakMilestone =>
    'packages/sprint/assets/haptic/sprint_day_completed/streak_milestone.ahap';

И добавь в values:

dart
List<String> get values => [..., streakMilestone];

5. Воспроизвести

dart
Assets.haptic.sprintDayCompleted.streakMilestone.playHaptic();

Для предзагрузки (рекомендуется делать до показа экрана):

dart
await Assets.haptic.sprintDayCompleted.streakMilestone.preloadHaptic();

Пример использования

В StreakPowerAnimationWidget вибродорожка запускается при инициализации Rive-анимации:

dart
void _onRiveInit(RiveLoaded state) {
  Assets.haptic.sprintDayCompleted.streakMilestone.playHaptic();
  // ...
}

Авторы

The avatar of contributor named as Arutyun Gevorkyan Arutyun Gevorkyan

История