我看过Staggered animations来链接动画,但是在那里他们将一个动画用于一个小部件的属性,例如一个不透明的动画控制着淡入,但是如果我想先淡入然后再淡出相同的小部件怎么办?我的意思是我已经创建了淡入淡出的动画,并用于小部件的不透明度值,如下所示:
_opacityDontWorry = Tween(
begin: 0.0,
end: 1.0,
).animate(
CurvedAnimation(parent: _animationController, curve: Interval(0.0, 0.75, curve: Curves.easeIn)),
);
所以这两个现在像这样绑定在一起:
Opacity(
opacity: _opacityDontWorry.value,
child: Text("Don't worry"),
)
这项工作正常,我的不透明度逐渐淡入,但是淡入后我希望它在短暂的停顿后淡出,但是我该怎么做呢?是否创建新的Tween并用它覆盖_opacityDontWorry?我什至在正确的路径上,如何链接改变小部件上相同属性的多个动画?
谢谢
索伦
答案 0 :(得分:1)
您可以在addStatusListener
上使用Animation
。检查动画何时完成,然后在reverse()
上调用AnimationController
。
如果需要,可以在reverse()
内调用Future.delayed()
进行暂停。
我为您制作了此示例:
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
AnimationController _animationController;
Animation _opacityDontWorry;
@override
void initState() {
super.initState();
_animationController = AnimationController(duration: Duration(seconds: 1), vsync: this);
_opacityDontWorry = Tween(
begin: 0.0,
end: 1.0,
).animate(
CurvedAnimation(parent: _animationController, curve: Curves.easeIn),
)..addStatusListener((status) {
if (status == AnimationStatus.completed) {
Future.delayed(Duration(seconds: 3), () {
_animationController.reverse();
});
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton.extended(
label: Text('Animate'),
onPressed: () => _animationController.forward(),
),
body: Center(
child: AnimatedBuilder(
animation: _opacityDontWorry,
builder: (context, widget) {
return Opacity(
opacity: _opacityDontWorry.value,
child: Text("Don't worry"),
);
},
),
),
);
}
}
更新
如果需要播放此动画,然后再调用另一个动画,则可以将不透明度值提取到变量中。然后根据需要从多个连续动画中更新该值。
_firstAnimation = Tween(
begin: 0.0,
end: 1.0,
).animate(
CurvedAnimation(parent: _animationController, curve: Interval(0.0, 0.20, curve: Curves.easeIn)),
)..addListener(() {
setState(() => _opacity = _firstAnimation.value);
});
// Leave an interval pause if you need
_secondAnimation = Tween(
begin: 1.0,
end: 0.0,
).animate(
CurvedAnimation(parent: _animationController, curve: Interval(0.40, 0.60, curve: Curves.easeIn)),
)..addListener(() {
setState(() => _opacity = _secondAnimation.value);
});
在小部件的不透明度属性中,不要使用_firstAnimation.value
,而要使用_opacity
。
答案 1 :(得分:0)
可能这是一个较晚的答案。但是,TweenSequence是正确的类,可以为一个或多个相同的属性设置动画。 Docs reference。