Вибродорожка из WAV-файла
Только iOS. Формат
.ahap— Apple Core Haptics (iOS 13+). На AndroidplayHaptic()/preloadHaptic()завершаются мгновенно без вибрации (if (!Platform.isIOS) return).
Для создания вибродорожки к анимации используется скрипт ahapify, который конвертирует аудиофайл .wav в паттерн вибрации .ahap (Apple Haptic and Audio Pattern).
Скрипт анализирует амплитуду звука каждые 20 мс и превращает её в кривые интенсивности и резкости вибрации.
Шаги
1. Подготовить WAV-файл
Положи .wav файл в директорию:
scripts/ahapify/input/<имя_файла>.wav2. Запустить скрипт
cd scripts
dart run ahapify/ahapify.dartГотовый .ahap файл появится в scripts/ahapify/output/.
Если файл уже существует в output — скрипт пропустит его. Чтобы перегенерировать принудительно:
bashdart run ahapify/ahapify.dart --force true
3. Скопировать в ассеты фичи
Положи .ahap в нужную папку ассетов, например:
features/sprint/assets/haptic/sprint_day_completed/streak_milestone.ahap4. Обновить assets.gen.dart
Добавь запись вручную в lib/gen/assets.gen.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:
List<String> get values => [..., streakMilestone];5. Воспроизвести
Assets.haptic.sprintDayCompleted.streakMilestone.playHaptic();Для предзагрузки (рекомендуется делать до показа экрана):
await Assets.haptic.sprintDayCompleted.streakMilestone.preloadHaptic();Пример использования
В StreakPowerAnimationWidget вибродорожка запускается при инициализации Rive-анимации:
void _onRiveInit(RiveLoaded state) {
Assets.haptic.sprintDayCompleted.streakMilestone.playHaptic();
// ...
}