Flutter - 如何自动启用 AnimatedOpacity?
Flutter - How to enable AnimatedOpacity automatically?
我正在创建一个仪表板,其中包含两个小部件、文本和两个容器的补间动画。但是,我想让这两个Container的不透明度慢慢的从不可见变为可见...所以我使用了AnimatedOpacity。但是我不知道怎么做...
任何帮助将不胜感激..
class _IntroState extends State<Intro> with SingleTickerProviderStateMixin {
Animation animation;
AnimationController animationController;
@override
void initState() {
super.initState();
animationController = AnimationController(
duration: Duration(seconds: 2),
vsync: this,
);
animation = Tween(begin: -1.0, end: 0.0).animate(CurvedAnimation(
parent: animationController, curve: Curves.fastOutSlowIn));
animationController.forward();
}
@override
Widget build(BuildContext context) {
bool _visible = false;
final double width = MediaQuery.of(context).size.width;
return AnimatedBuilder(
animation: animationController,
builder: (BuildContext context, Widget child) {
return Scaffold(
//BODDY
body: ListView(
hildren:<Widget>[
new Stack(
children: <Widget>[
new Transform(
//ANIMATED OPACITY
new AnimatedOpacity(
opacity: _visible ? 0.0 : 1.0,
duration: Duration(milliseconds: 500),
child: new Padding(
padding: const EdgeInsets.symmetric(
horizontal: 12.0),
child: new Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Container(
child: Column(
children: <Widget>[
//THIS THE CONTAINER
new Container(. . .),
new Container(. . .)
而不是 AnimatedOpacity
,使用 FadeTransition
小部件。这使您可以手动控制动画:
@override
Widget build(BuildContext context) {
return FadeTransition(
opacity: animationController.drive(CurveTween(curve: Curves.easeOut)),
child: ...,
);
}
我完全推荐使用上面@boformer 的回答。
但是,我试过你的代码,想向你展示如何调用 setState 来触发 AnimatedOpacity
,这样你就可以看到它在没有 onTap
或 [=13] 的情况下也能正常工作=] 正如您在上面的评论中所想的那样。
我得到了你的代码并试了一下。我所做的是,简单地向您的动画控制器添加一个状态侦听器,并在控制器完成时添加一个状态侦听器。我在 setState
中触发了可见性布尔值。然后它会改变容器的可见性。
// When animation finished change the visibility.
animationController.addStatusListener((status){
if (status == AnimationStatus.completed) {
setState(() {
// This is opposite, because it's implemented opposite in your code.
_visible = false;
});
}
});
对于希望在页面呈现后立即自动淡出小部件并且仍想使用 AnimatedOpacity
的任何人,您可以调用以更改 WidgetsBinding 的 addPostFrameCallback回调。
将下面的代码放入您的 initState
。
WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() {
_opacity = 1;
});
});
要使 StatelessWidget
或 StatefulWidget
在创建时自动淡入,TweenAnimationBuilder
提供了一个更简单的解决方案:
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return TweenAnimationBuilder<double>(
tween: Tween<double>(begin: 0.0, end: 1.0),
curve: Curves.ease,
duration: const Duration(seconds: 1),
builder: (BuildContext context, double opacity, Widget? child) {
return Opacity(
opacity: opacity,
child: Container(width: 20, height: 20, color: Colors.red)
);
});
}
}
查看我的 Codepen 以获得完整示例:https://codepen.io/atok/pen/BaZVRPr
此致
我正在创建一个仪表板,其中包含两个小部件、文本和两个容器的补间动画。但是,我想让这两个Container的不透明度慢慢的从不可见变为可见...所以我使用了AnimatedOpacity。但是我不知道怎么做...
任何帮助将不胜感激..
class _IntroState extends State<Intro> with SingleTickerProviderStateMixin {
Animation animation;
AnimationController animationController;
@override
void initState() {
super.initState();
animationController = AnimationController(
duration: Duration(seconds: 2),
vsync: this,
);
animation = Tween(begin: -1.0, end: 0.0).animate(CurvedAnimation(
parent: animationController, curve: Curves.fastOutSlowIn));
animationController.forward();
}
@override
Widget build(BuildContext context) {
bool _visible = false;
final double width = MediaQuery.of(context).size.width;
return AnimatedBuilder(
animation: animationController,
builder: (BuildContext context, Widget child) {
return Scaffold(
//BODDY
body: ListView(
hildren:<Widget>[
new Stack(
children: <Widget>[
new Transform(
//ANIMATED OPACITY
new AnimatedOpacity(
opacity: _visible ? 0.0 : 1.0,
duration: Duration(milliseconds: 500),
child: new Padding(
padding: const EdgeInsets.symmetric(
horizontal: 12.0),
child: new Row(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Container(
child: Column(
children: <Widget>[
//THIS THE CONTAINER
new Container(. . .),
new Container(. . .)
而不是 AnimatedOpacity
,使用 FadeTransition
小部件。这使您可以手动控制动画:
@override
Widget build(BuildContext context) {
return FadeTransition(
opacity: animationController.drive(CurveTween(curve: Curves.easeOut)),
child: ...,
);
}
我完全推荐使用上面@boformer 的回答。
但是,我试过你的代码,想向你展示如何调用 setState 来触发 AnimatedOpacity
,这样你就可以看到它在没有 onTap
或 [=13] 的情况下也能正常工作=] 正如您在上面的评论中所想的那样。
我得到了你的代码并试了一下。我所做的是,简单地向您的动画控制器添加一个状态侦听器,并在控制器完成时添加一个状态侦听器。我在 setState
中触发了可见性布尔值。然后它会改变容器的可见性。
// When animation finished change the visibility.
animationController.addStatusListener((status){
if (status == AnimationStatus.completed) {
setState(() {
// This is opposite, because it's implemented opposite in your code.
_visible = false;
});
}
});
对于希望在页面呈现后立即自动淡出小部件并且仍想使用 AnimatedOpacity
的任何人,您可以调用以更改 WidgetsBinding 的 addPostFrameCallback回调。
将下面的代码放入您的 initState
。
WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() {
_opacity = 1;
});
});
要使 StatelessWidget
或 StatefulWidget
在创建时自动淡入,TweenAnimationBuilder
提供了一个更简单的解决方案:
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return TweenAnimationBuilder<double>(
tween: Tween<double>(begin: 0.0, end: 1.0),
curve: Curves.ease,
duration: const Duration(seconds: 1),
builder: (BuildContext context, double opacity, Widget? child) {
return Opacity(
opacity: opacity,
child: Container(width: 20, height: 20, color: Colors.red)
);
});
}
}
查看我的 Codepen 以获得完整示例:https://codepen.io/atok/pen/BaZVRPr
此致