Skip to content

Commit d59ef0f

Browse files
committed
refactor
1 parent 121eeb6 commit d59ef0f

File tree

1 file changed

+91
-42
lines changed

1 file changed

+91
-42
lines changed

lib/animated_config.dart

Lines changed: 91 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import 'animated_interpolation.dart';
33

44
class 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

2527
enum 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

Comments
 (0)