57 lines
1.3 KiB
Dart
57 lines
1.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:lottie/lottie.dart';
|
|
|
|
class FilmStrip extends StatelessWidget {
|
|
final LottieComposition composition;
|
|
final LottieDelegates? delegates;
|
|
final Size size;
|
|
|
|
const FilmStrip(
|
|
this.composition, {
|
|
super.key,
|
|
required this.size,
|
|
this.delegates,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return CustomPaint(size: size, painter: _CustomerPainter(this));
|
|
}
|
|
}
|
|
|
|
class _CustomerPainter extends CustomPainter {
|
|
static const _columns = 5;
|
|
final FilmStrip parent;
|
|
|
|
_CustomerPainter(this.parent);
|
|
|
|
@override
|
|
void paint(Canvas canvas, Size size) {
|
|
var thumbSize = Size(size.width / _columns, size.width / _columns);
|
|
var drawable = LottieDrawable(parent.composition, frameRate: FrameRate.max);
|
|
if (parent.delegates != null) {
|
|
drawable.delegates = parent.delegates;
|
|
}
|
|
|
|
var index = 0;
|
|
for (var progress = 0.0; progress <= 1; progress += 0.05) {
|
|
var x = index % _columns;
|
|
var y = index ~/ _columns;
|
|
|
|
var rect =
|
|
Offset(x * thumbSize.width, y.toDouble() * thumbSize.height) &
|
|
thumbSize;
|
|
|
|
drawable
|
|
..setProgress(progress)
|
|
..draw(canvas, rect);
|
|
|
|
++index;
|
|
}
|
|
}
|
|
|
|
@override
|
|
bool shouldRepaint(CustomPainter oldDelegate) {
|
|
return true;
|
|
}
|
|
}
|