Untitled
unknown
plain_text
10 months ago
2.1 kB
11
Indexable
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
class LottieSliderController extends StatefulWidget {
final String assetPath;
final double startFrame;
final double endFrame;
const LottieSliderController({
Key? key,
required this.assetPath,
required this.startFrame,
required this.endFrame,
}) : super(key: key);
@override
_LottieSliderControllerState createState() => _LottieSliderControllerState();
}
class _LottieSliderControllerState extends State<LottieSliderController>
with TickerProviderStateMixin {
late AnimationController _controller;
LottieComposition? _composition;
double _sliderValue = 0.0;
@override
void initState() {
super.initState();
_loadAnimation();
}
Future<void> _loadAnimation() async {
_composition = await LottieComposition.fromAsset(
context,
widget.assetPath,
);
if (_composition != null) {
_controller = AnimationController(
vsync: this,
duration: _composition!.duration,
);
setState(() {});
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (_composition == null || _controller == null) {
return const Center(child: CircularProgressIndicator());
}
final totalFrames = _composition!.durationFrames.toDouble();
final startFrame = widget.startFrame.clamp(0, totalFrames);
final endFrame = widget.endFrame.clamp(0, totalFrames);
return Column(
children: [
Slider(
value: _sliderValue,
onChanged: (value) {
setState(() {
_sliderValue = value;
// Calculate current frame between start and end
final frame = startFrame + (endFrame - startFrame) * value;
_controller.value = frame / totalFrames;
});
},
),
Lottie(
composition: _composition,
controller: _controller,
frameRate: FrameRate.max,
),
],
);
}
}Editor is loading...
Leave a Comment