didvan-app/lib/views/widgets/video/play_btn_animation.dart

67 lines
1.6 KiB
Dart

import 'package:flutter/material.dart';
class PlayBtnAnimation extends StatefulWidget {
final Widget child;
final bool isAnimating;
final bool alwaysAnimate;
final Duration duration;
final Function()? onEnd;
const PlayBtnAnimation(
{Key? key,
required this.child,
required this.isAnimating,
this.duration = const Duration(milliseconds: 150),
this.onEnd,
this.alwaysAnimate = false})
: super(key: key);
@override
State<PlayBtnAnimation> createState() => _PlayBtnAnimationState();
}
class _PlayBtnAnimationState extends State<PlayBtnAnimation>
with SingleTickerProviderStateMixin {
late AnimationController controller;
late Animation<double> scale;
@override
void initState() {
super.initState();
final halfDuration = widget.duration.inMilliseconds ~/ 2;
controller = AnimationController(
vsync: this, duration: Duration(milliseconds: halfDuration));
scale = Tween<double>(begin: 1, end: 1.2).animate(controller);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
void didUpdateWidget(covariant PlayBtnAnimation oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.isAnimating != oldWidget.isAnimating) {
doAnimation();
}
}
Future doAnimation() async {
if (widget.isAnimating) {
await controller.forward();
await controller.reverse();
await Future.delayed(const Duration(milliseconds: 400));
widget.onEnd?.call();
}
}
@override
Widget build(BuildContext context) {
return ScaleTransition(scale: scale, child: widget.child);
}
}