vibration_composition 0.0.1
vibration_composition: ^0.0.1 copied to clipboard
A Plugin Forwarding (and Emulating) the Composition Haptics Api for Rich Vibrattions.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:vibration_composition/vibration_composition.dart' as vib;
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
title: const Text('new Vibration api support'),
bottom: const TabBar(
tabs: [
Tab(text: 'Primitives'),
Tab(text: 'Envelope'),
],
),
),
body: const TabBarView(children: [_PrimitivesTab(), _EnvelopeTab()]),
),
),
);
}
}
class _PrimitivesTab extends StatefulWidget {
const _PrimitivesTab();
@override
State<_PrimitivesTab> createState() => _PrimitivesTabState();
}
class _PrimitivesTabState extends State<_PrimitivesTab> {
Map<vib.Primitive, int> primitives = {};
@override
void initState() {
super.initState();
vib.primitiveDurations().then((primitives) {
if (!mounted) return;
setState(() {
final sorted = primitives.entries.toList()
..sort((a, b) => a.value.compareTo(b.value));
this.primitives = Map.fromEntries(sorted);
});
});
vib.prepareVibrator();
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: primitives
.map(
(p, ms) => MapEntry(
p,
TextButton(
onPressed: () async {
vib.composeAndPlay([
vib.CompositionParams(primitive: p, delayMs: 200),
]);
},
child: Text('${p.name} (${ms}ms)'),
),
),
)
.values
.toList(),
),
);
}
}
class _EnvelopeTab extends StatefulWidget {
const _EnvelopeTab();
@override
State<_EnvelopeTab> createState() => _EnvelopeTabState();
}
class _EnvelopeTabState extends State<_EnvelopeTab> {
vib.EnvelopeCapabilityData? capability;
@override
void initState() {
super.initState();
vib.envelopeCapability().then((capability) {
if (!mounted) return;
setState(() {
this.capability = capability;
});
});
}
@override
Widget build(BuildContext context) {
final cap = capability;
if (cap == null) {
return const Center(child: Text('Envelope not supported'));
}
final rows = <(String, String)>[
('maxControlPtDuration', '${cap.maxControlPtDuration}'),
('minControlPtDuration', '${cap.minControlPtDuration}'),
('maxControlPtCount', '${cap.maxControlPtCount}'),
('maxSumDuration', '${cap.maxSumDuration}'),
('maxGs', '${cap.maxGs}'),
('minFreq', '${cap.minFreq}'),
('maxFreq', '${cap.maxFreq}'),
];
return ListView(
children: [
for (final (label, value) in rows)
ListTile(title: Text(label), trailing: Text(value)),
],
);
}
}