可以为动画定义曲线;有非线性进展。
Flutter 不提供“阶梯”曲线,但您可以相当轻松地制作一条:
class StepCurve extends Curve {
final int stepCount;
const StepCurve([this.stepCount = 2]) : assert(stepCount > 1);
@override
double transform(double t) {
final progress = (t * stepCount).truncate();
return 1 / (stepCount - 1) * progress;
}
}
然后,您可以通过将其关联到 a 来自由使用它CurveTween
:
@override
Widget build(BuildContext context) {
return AlignTransition(
alignment: AlignmentGeometryTween(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
)
.chain(CurveTween(curve: const StepCurve(5)))
.animate(animationController),
child: Container(
color: Colors.red,
width: 42.0,
height: 42.0,
),
);
}
另一种解决方案是使用TweenSequence。
class TestAnim extends StatefulWidget {
@override
_TestAnimState createState() => _TestAnimState();
}
class _TestAnimState extends State<TestAnim>
with SingleTickerProviderStateMixin {
AnimationController animationController;
@override
void initState() {
super.initState();
animationController = AnimationController(
vsync: this,
duration: const Duration(seconds: 1),
)..repeat();
}
@override
Widget build(BuildContext context) {
final colors = <Color>[
Colors.red,
Colors.blue,
Colors.lime,
Colors.purple,
];
return DecoratedBoxTransition(
decoration: TweenSequence(colorsToTween(colors).toList())
.animate(animationController),
child: const SizedBox.expand(),
);
}
}
Iterable<TweenSequenceItem<Decoration>> colorsToTween(
List<Color> colors) sync* {
for (int i = 0; i < colors.length - 1; i++) {
yield TweenSequenceItem<Decoration>(
tween: DecorationTween(
begin: BoxDecoration(color: colors[i]),
end: BoxDecoration(color: colors[i + 1]),
),
weight: 1.0,
);
}
}