Haptic Composer
🎯 Design custom haptic experiences as easily as composing music - make your app feel as good as it looks.
Features
✨ Easy to Use - Simple, intuitive API for adding haptic feedback to your Flutter app
🎼 Composable Patterns - Build complex haptic patterns from simple building blocks
🎨 Visual Composer - Interactive UI for designing and testing haptic patterns
📦 Pre-built Presets - 25+ carefully designed haptic patterns ready to use
🔧 Flexible - From simple one-line feedback to complex choreographed sequences
📱 Cross-Platform - iOS (Core Haptics) and Android (VibrationEffect) support
💾 Serializable - Save and load patterns as JSON
✅ Validated - Built-in pattern validation and best practices
Quick Start
Installation
Add this to your pubspec.yaml:
dependencies:
haptic_composer: ^0.0.3
Basic Usage
import 'package:haptic_composer/haptic_composer.dart';
// Initialize at app startup
await HapticComposer.initialize();
// Play a preset pattern
await HapticComposer.play(HapticPresets.success);
// Play a custom pattern
await HapticComposer.play(
HapticPattern(
events: [
HapticEvent.impact(intensity: 0.8, duration: 50),
HapticEvent.pause(100),
HapticEvent.impact(intensity: 0.5, duration: 30),
],
),
);
Platform Setup
Android
Add the vibrate permission to your android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.VIBRATE" />
iOS
No additional configuration needed. The Core Haptics framework is built-in on iOS 13+.
Usage Examples
1. Using Preset Patterns
The library includes 25+ carefully tuned presets for common interactions:
// Feedback patterns
await HapticComposer.play(HapticPresets.success);
await HapticComposer.play(HapticPresets.error);
await HapticComposer.play(HapticPresets.warning);
await HapticComposer.play(HapticPresets.notification);
await HapticComposer.play(HapticPresets.buttonPress);
await HapticComposer.play(HapticPresets.lightImpact);
await HapticComposer.play(HapticPresets.mediumImpact);
await HapticComposer.play(HapticPresets.heavyImpact);
2. Building Custom Patterns
Create unique haptic experiences with the pattern builder:
final pattern = HapticPattern.builder()
.impact(intensity: 0.8, duration: 50)
.pause(100)
.impact(intensity: 0.5, duration: 30)
.repeat(2)
.build();
await HapticComposer.play(pattern);
3. Haptic Buttons
Add haptic feedback directly to buttons:
HapticButton(
onPressed: () {
// Handle button press
},
pattern: HapticPresets.buttonPress,
child: const Text('Press Me'),
)
4. Interactive Widgets
Wrap any widget to add haptic feedback on interaction:
TapHaptic(
pattern: HapticPresets.success,
child: Card(
child: Text('Tap me for haptic feedback'),
),
)
5. Scroll Haptics
Add haptic feedback to scrollable content:
HapticScrollView(
hapticPattern: HapticPresets.lightImpact,
child: ListView(
children: [...],
),
)
6. Pattern Serialization
Save and load patterns as JSON:
// Save
final json = pattern.toJson();
// Load
final loadedPattern = HapticPattern.fromJson(json);
await HapticComposer.play(loadedPattern);
API Overview
HapticComposer
Main API for playing haptic patterns.
// Initialize (call once at app startup)
await HapticComposer.initialize();
// Play a pattern
await HapticComposer.play(HapticPattern pattern);
// Stop current pattern
await HapticComposer.stop();
HapticPattern
Define haptic experiences with events and timing.
HapticPattern(
events: [
HapticEvent.impact(intensity: 0.8, duration: 50),
HapticEvent.pause(100),
],
)
HapticPresets
25+ built-in patterns:
- Impact patterns (light, medium, heavy)
- Feedback patterns (success, error, warning, notification)
- Interaction patterns (button press, selection)
- And many more...
Validation
The package includes a built-in validator to ensure patterns follow best practices:
final validation = HapticValidator.validate(pattern);
if (validation.isValid) {
await HapticComposer.play(pattern);
} else {
print('Validation errors: ${validation.errors}');
}
Platform Support
| Platform | Support |
|---|---|
| iOS | ✅ Core Haptics API (iOS 13+) |
| Android | ✅ VibrationEffect API (Android 5+) |
Support
If you find this package helpful, please consider supporting the development:
Or give it a ⭐ on GitHub!
License
MIT License - See LICENSE file for details.
Made with ❤️ for flutter community