@@ -3,14 +3,14 @@ import 'animated_interpolation.dart';
33
44class AnimatedConfig {
55 AnimatedConfig ({
6- this .opacity = 1 ,
7- this .scale = 1 ,
8- this .translateX = 0 ,
9- this .translateY = 0 ,
10- this .skewX = 0 ,
11- this .skewY = 0 ,
12- this .rotateX = 0 ,
13- this .rotateY = 0 ,
6+ this .opacity,
7+ this .scale,
8+ this .translateX,
9+ this .translateY,
10+ this .skewX,
11+ this .skewY,
12+ this .rotateX,
13+ this .rotateY,
1414 });
1515 final double opacity;
1616 final double scale;
@@ -20,6 +20,8 @@ class AnimatedConfig {
2020 final double skewY;
2121 final double rotateX;
2222 final double rotateY;
23+
24+
2325}
2426
2527enum AnimatedType { opacity, scale, translateX, translateY, skewX, skewY, rotateX, rotateY }
@@ -36,6 +38,7 @@ class SmartAnimatedWidget extends StatefulWidget {
3638 this .curve,
3739 this .duration = _kDefaultDuration,
3840 this .autoPlay = false ,
41+ this .onTransitionEnd,
3942 }) : super (key: key);
4043 final AnimatedConfig from;
4144 final AnimatedConfig to;
@@ -44,6 +47,7 @@ class SmartAnimatedWidget extends StatefulWidget {
4447 final Curve curve;
4548 final Duration duration;
4649 final bool autoPlay;
50+ final VoidCallback onTransitionEnd;
4751
4852 @override
4953 SmartAnimatedWidgetState createState () => SmartAnimatedWidgetState ();
@@ -66,11 +70,16 @@ class SmartAnimatedWidgetState extends State<SmartAnimatedWidget> with SingleTic
6670 }
6771 _controller.addStatusListener ((status) {
6872 if (status == AnimationStatus .completed) {
73+ if (widget.onTransitionEnd!= null )widget.onTransitionEnd ();
6974 _animating = false ;
7075 }
7176 });
7277 }
7378
79+ reset (){
80+ _controller? .reset ();
81+ }
82+
7483 animate () {
7584 if (_animating == false ) {
7685 _controller.reset ();
@@ -108,47 +117,87 @@ class SmartAnimatedWidgetState extends State<SmartAnimatedWidget> with SingleTic
108117 if (widget.from != null && widget.to != null ) {
109118 AnimatedConfig fc = widget.from;
110119 AnimatedConfig tc = widget.to;
111- scaleTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.scale, tc.scale], curve: widget.curve);
112- translateXTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.translateX, tc.translateX], curve: widget.curve);
113- translateYTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.translateY, tc.translateY], curve: widget.curve);
114- skewXTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.skewX, tc.skewX], curve: widget.curve);
115- skewYTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.skewY, tc.skewY], curve: widget.curve);
116- rotateXTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.rotateX, tc.rotateX], curve: widget.curve);
117- rotateYTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.rotateY, tc.rotateY], curve: widget.curve);
118- opacityTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.opacity, tc.opacity], curve: widget.curve);
120+ scaleTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.scale?? 1 , tc.scale?? 1 ], curve: widget.curve);
121+ translateXTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.translateX?? 0 , tc.translateX?? 0 ], curve: widget.curve);
122+ translateYTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.translateY?? 0 , tc.translateY?? 0 ], curve: widget.curve);
123+ skewXTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.skewX?? 0 , tc.skewX?? 0 ], curve: widget.curve);
124+ skewYTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.skewY?? 0 , tc.skewY?? 0 ], curve: widget.curve);
125+ rotateXTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.rotateX?? 0 , tc.rotateX?? 0 ], curve: widget.curve);
126+ rotateYTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.rotateY?? 0 , tc.rotateY?? 0 ], curve: widget.curve);
127+ opacityTween = InterpolationTween (inputRange: inputRange, outputRange: [fc.opacity?? 1 , tc.opacity?? 1 ], curve: widget.curve);
119128 }
120129 if (widget.configMap != null ) {
121- List <double > inputRange = [];
122- List <double > scaleOutRange = [];
123- List <double > translateXOutRange = [];
124- List <double > translateYOutRange = [];
125- List <double > skewXOutRange = [];
126- List <double > skewYOutRange = [];
127- List <double > rotateXOutRange = [];
128- List <double > rotateYOutRange = [];
129- List <double > opacityOutRange = [];
130+ List <double > scaleOutRange = [], scaleInputRange = [];
131+ List <double > translateXOutRange = [], translateXInputRange = [];
132+ List <double > translateYOutRange = [], translateYInputRange = [];
133+ List <double > skewXOutRange = [], skewXInputRange = [];
134+ List <double > skewYOutRange = [], skewYInputRange = [];
135+ List <double > rotateXOutRange = [], rotateXInputRange = [];
136+ List <double > rotateYOutRange = [], rotateYInputRange = [];
137+ List <double > opacityOutRange = [], opacityInputRange = [];
130138 List <double > keysList = widget.configMap.keys.toList ();
139+ Map <double , AnimatedConfig > configs = widget.configMap;
131140 keysList.sort (); //从小到大排序
132141 for (int i = 0 ; i < keysList.length; i++ ) {
133142 double key = keysList.elementAt (i);
134- inputRange.add (key);
135- scaleOutRange.add (widget.configMap[key].scale);
136- translateXOutRange.add (widget.configMap[key].translateX);
137- translateYOutRange.add (widget.configMap[key].translateY);
138- skewXOutRange.add (widget.configMap[key].skewX);
139- skewYOutRange.add (widget.configMap[key].skewY);
140- rotateXOutRange.add (widget.configMap[key].rotateX);
141- rotateYOutRange.add (widget.configMap[key].rotateY);
142- opacityOutRange.add (widget.configMap[key].opacity);
143+ AnimatedConfig config = configs[key];
144+ if (config.scale != null ) {
145+ scaleInputRange.add (key);
146+ scaleOutRange.add (config.scale);
147+ }
148+ if (config.translateX != null ) {
149+ translateXInputRange.add (key);
150+ translateXOutRange.add (config.translateX);
151+ }
152+ if (config.translateY != null ) {
153+ translateYInputRange.add (key);
154+ translateYOutRange.add (config.translateY);
155+ }
156+ if (config.skewX != null ) {
157+ skewXInputRange.add (key);
158+ skewXOutRange.add (config.skewX);
159+ }
160+ if (config.skewY != null ) {
161+ skewYInputRange.add (key);
162+ skewYOutRange.add (config.skewY);
163+ }
164+ if (config.rotateX != null ) {
165+ rotateXInputRange.add (key);
166+ rotateXOutRange.add (config.rotateX);
167+ }
168+ if (config.rotateY != null ) {
169+ rotateYInputRange.add (key);
170+ rotateYOutRange.add (config.rotateY);
171+ }
172+ if (config.opacity != null ) {
173+ opacityInputRange.add (key);
174+ opacityOutRange.add (config.opacity);
175+ }
143176 }
144- scaleTween = InterpolationTween (inputRange: inputRange, outputRange: scaleOutRange, curve: widget.curve);
145- translateXTween = InterpolationTween (inputRange: inputRange, outputRange: translateXOutRange, curve: widget.curve);
146- translateYTween = InterpolationTween (inputRange: inputRange, outputRange: translateYOutRange, curve: widget.curve);
147- skewXTween = InterpolationTween (inputRange: inputRange, outputRange: skewXOutRange, curve: widget.curve);
148- skewYTween = InterpolationTween (inputRange: inputRange, outputRange: skewYOutRange, curve: widget.curve);
149- rotateXTween = InterpolationTween (inputRange: inputRange, outputRange: rotateXOutRange, curve: widget.curve);
150- rotateYTween = InterpolationTween (inputRange: inputRange, outputRange: rotateYOutRange, curve: widget.curve);
151- opacityTween = InterpolationTween (inputRange: inputRange, outputRange: opacityOutRange, curve: widget.curve);
177+
178+ ///获取默认的输入
179+ List <double > _defaultIR (List <double > ir) => ir.length > 0 ? ir : [0 , 1 ];
180+ Map <AnimatedType , double > _defaultORMap = {
181+ AnimatedType .opacity: 1 ,
182+ AnimatedType .scale: 1 ,
183+ AnimatedType .translateX: 0 ,
184+ AnimatedType .translateY: 0 ,
185+ AnimatedType .skewX: 0 ,
186+ AnimatedType .skewY: 0 ,
187+ AnimatedType .rotateX: 0 ,
188+ AnimatedType .rotateY: 0 ,
189+ };
190+ ///获取默认的输出
191+ List <double > _defaultOR (List <double > or, AnimatedType type) => or.length > 0 ? or : [_defaultORMap[type], _defaultORMap[type]];
192+
193+ scaleTween = InterpolationTween (inputRange: _defaultIR (scaleInputRange), outputRange: _defaultOR (scaleOutRange, AnimatedType .scale), curve: widget.curve);
194+ translateXTween = InterpolationTween (inputRange: _defaultIR (translateXInputRange), outputRange: _defaultOR (translateXOutRange, AnimatedType .translateX), curve: widget.curve);
195+ translateYTween = InterpolationTween (inputRange: _defaultIR (translateYInputRange), outputRange: _defaultOR (translateYOutRange, AnimatedType .translateY), curve: widget.curve);
196+ skewXTween = InterpolationTween (inputRange: _defaultIR (skewXInputRange), outputRange: _defaultOR (skewXOutRange, AnimatedType .skewX), curve: widget.curve);
197+ skewYTween = InterpolationTween (inputRange: _defaultIR (skewYInputRange), outputRange: _defaultOR (skewYOutRange, AnimatedType .skewY), curve: widget.curve);
198+ rotateXTween = InterpolationTween (inputRange: _defaultIR (rotateXInputRange), outputRange: _defaultOR (rotateXOutRange, AnimatedType .rotateX), curve: widget.curve);
199+ rotateYTween = InterpolationTween (inputRange: _defaultIR (rotateYInputRange), outputRange: _defaultOR (rotateYOutRange, AnimatedType .rotateY), curve: widget.curve);
200+ opacityTween = InterpolationTween (inputRange: _defaultIR (opacityInputRange), outputRange: _defaultOR (opacityOutRange, AnimatedType .opacity), curve: widget.curve);
152201 }
153202
154203 return Transform .scale (
0 commit comments