workouttest_app/lib/widgets/victory_widget.dart
2022-10-29 10:01:00 +02:00

109 lines
3.3 KiB
Dart

import 'package:confetti/confetti.dart';
import 'package:ezanimation/ezanimation.dart';
import 'package:flutter/material.dart';
import 'dart:math';
import 'package:flutter/scheduler.dart';
class VictoryConfetti extends StatefulWidget {
@override
_VictoryConfettiState createState() => _VictoryConfettiState();
}
class _VictoryConfettiState extends State<VictoryConfetti> {
late ConfettiController _controllerBottomCenter;
@override
void initState() {
_controllerBottomCenter = ConfettiController(duration: const Duration(seconds: 2));
SchedulerBinding.instance.addPostFrameCallback((_) {
Future.delayed(Duration(milliseconds: 500)).then((value) => _controllerBottomCenter.play());
});
super.initState();
}
@override
void dispose() {
_controllerBottomCenter.dispose();
super.dispose();
}
Path drawStar(Size size) {
// Method to convert degree to radians
double degToRad(double deg) => deg * (pi / 180.0);
const numberOfPoints = 5;
final halfWidth = size.width / 2;
final externalRadius = halfWidth;
final internalRadius = halfWidth / 2.5;
final degreesPerStep = degToRad(360 / numberOfPoints);
final halfDegreesPerStep = degreesPerStep / 2;
final path = Path();
final fullAngle = degToRad(360);
path.moveTo(size.width, halfWidth);
for (double step = 0; step < fullAngle; step += degreesPerStep) {
path.lineTo(halfWidth + externalRadius * cos(step), halfWidth + externalRadius * sin(step));
path.lineTo(halfWidth + internalRadius * cos(step + halfDegreesPerStep), halfWidth + internalRadius * sin(step + halfDegreesPerStep));
}
path.close();
return path;
}
@override
Widget build(BuildContext context) {
return Container(
child: Align(
alignment: Alignment.bottomCenter,
child: ConfettiWidget(
confettiController: _controllerBottomCenter,
blastDirectionality: BlastDirectionality.explosive, // don't specify a direction, blast randomly
numberOfParticles: 20,
colors: const [Colors.green, Colors.blue, Colors.pink, Colors.orange, Colors.purple], // manually specify the colors to be used
createParticlePath: drawStar, // define a custom shape/path.
),
),
);
}
}
class Victory extends StatefulWidget {
final bool? victory;
const Victory({this.victory});
@override
_VictoryState createState() => _VictoryState();
}
class _VictoryState extends State<Victory> {
final EzAnimation animation = EzAnimation(1.0, 200.0, Duration(seconds: 3), reverseCurve: Curves.easeIn);
@override
void initState() {
animation.start();
animation.addStatusListener((status) {
if (status == AnimationStatus.completed) {}
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
child: AnimatedBuilder(
animation: animation,
builder: (context, snapshot) {
return Center(
child: Container(
width: animation.value,
height: animation.value,
child: Row(children: [
VictoryConfetti(),
widget.victory != null && widget.victory == true ? Image.asset("asset/image/WT_cup_victory400.png") : Offstage(),
]),
),
);
}));
}
}