123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404 |
- import 'dart:async';
- import 'package:douyin_demo/providers/RecommendProvider.dart';
- import 'package:flutter/material.dart';
- class AnimatedIconWidget extends StatefulWidget {
- AnimatedIconWidget(
- {Key key,
- @required this.animationList,
- @required this.icon,
- @required this.size,
- this.callback,
- this.callbackDelay,
- this.provider})
- : super(key: key);
- final List<IconAnimationStage> animationList;
- final IconData icon;
- final VoidCallback callback;
- final double size;
- final RecommendProvider provider;
- final Duration callbackDelay;
- _AnimatedIconWidgetState createState() => _AnimatedIconWidgetState();
- }
- class _AnimatedIconWidgetState extends State<AnimatedIconWidget>
- with TickerProviderStateMixin {
- List<IconAnimationStage> anis = List<IconAnimationStage>();
- List<AnimationController> controllers = List<AnimationController>();
- List<Animation<double>> animations = List<Animation<double>>();
- Animation<double> curAnim;
- Color curColor;
- int curIndex = 0;
- List<bool> ifAdded = List<bool>();
- double curSize;
- bool ifInit = true;
- loopAnimation(index) {
- curColor = curColor == null ? anis.first.color : curColor;
- if (index < controllers.length - 1) {
- if (!ifAdded[index]) {
- animations[index] = animations[index]
- ..addStatusListener((status) {
- if (status == AnimationStatus.completed) {
- curAnim = animations[index + 1];
- curColor = anis[index + 1].color;
- controllers[index + 1].forward(from: 0);
- loopAnimation(index + 1);
- }
- })
- ..addListener(() {
- setState(() {});
- });
- ifAdded[index] = true;
- }
- } else if (index == controllers.length - 1) {
- if (!ifAdded[index]) {
- animations[index] = animations[index]
- ..addStatusListener((status) {
- curColor = anis[index].color;
- if (status == AnimationStatus.completed) {
- if (widget.callback != null) {
- if (widget.callbackDelay == null) {
- widget.callback();
- } else {
- Timer(widget.callbackDelay, () {
- widget.callback();
- });
- }
- }
- }
- })
- ..addListener(() {
- setState(() {});
- });
- ifAdded[index] = true;
- }
- }
- }
- @override
- void initState() {
- super.initState();
- anis = widget.animationList;
- List.generate(anis.length, (index) {
- var curAni = anis[index];
- ifAdded.add(false);
- controllers.add(
- AnimationController(vsync: this, duration: anis[index].duration));
- animations.add(Tween(begin: curAni.start, end: curAni.end)
- .animate(controllers[index]));
- });
- curAnim = animations.first;
- loopAnimation(0);
- }
- @override
- Widget build(BuildContext context) {
- return IconButton(
- padding: EdgeInsets.all(0),
- onPressed: () {
- controllers.first.forward(from: 0);
- },
- icon: Icon(
- widget.icon,
- size: widget.size * curAnim.value,
- color: curColor,
- ),
- );
- }
- }
- class IconAnimationStage {
- double start;
- double end;
- Color color;
- Duration duration;
- IconAnimationStage({this.color, this.duration, this.end, this.start});
- }
|