📅  最后修改于: 2023-12-03 15:42:29.066000             🧑  作者: Mango
有时我们需要将小部件放在堆栈中,但是它们可能不太对齐。这时我们可以使用AnimatedAlign
来制作一个颤动对齐的动画效果。
import 'package:flutter/material.dart';
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
return Container(
width: 50.0,
height: 50.0,
color: Colors.blue,
);
}
}
这是我们要在堆栈中对齐的小部件。
AnimatedAlign
:Stack(
children: [
AnimatedAlign(
alignment: Alignment.bottomCenter,
duration: Duration(milliseconds: 500),
curve: Curves.easeInOut,
child: MyWidget(),
),
],
)
这里我们定义了一个AnimatedAlign
的小部件,将它的子控件设置为MyWidget()
。alignment
属性设置为Alignment.bottomCenter
表示要对齐的位置。
AnimatedAlign(
...
duration: Duration(milliseconds: 500),
curve: Curves.easeInOut,
onEnd: () {
setState(() {});
},
child: MyWidget(),
)
我们添加了duration
属性,将动画时长设置为500毫秒。curve
属性设置了动画的速率。我们还在动画结束时调用setState
方法,以便重新绘制小部件。
为了制作颤动效果,我们需要在AnimatedAlign
的alignment
属性中使用一个Tween
对象。我们使用TweenSequence
来制作一个逐渐变化的动画效果:
AnimatedAlign(
alignment: TweenSequence([
TweenSequenceItem(
tween: Tween(begin: Alignment.bottomCenter, end: Alignment.bottomCenter),
weight: 1,
),
TweenSequenceItem(
tween: Tween(begin: Alignment.bottomCenter, end: Alignment.bottomCenter.translate(20, 0)),
weight: 1,
),
TweenSequenceItem(
tween: Tween(begin: Alignment.bottomCenter.translate(20, 0), end: Alignment.bottomCenter.translate(-20, 0)),
weight: 1,
),
TweenSequenceItem(
tween: Tween(begin: Alignment.bottomCenter.translate(-20, 0), end: Alignment.bottomCenter),
weight: 1,
),
]).animate(animationController),
duration: Duration(milliseconds: 500),
onEnd: () {
setState(() {});
},
child: MyWidget(),
)
我们在alignment
属性中使用了一个TweenSequence
对象,它包含了一个Tween
对象数组,它们被放到TweenSequenceItem
的weight
中。这个数组制作了我们的颤动动画效果。
import 'package:flutter/material.dart';
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> with SingleTickerProviderStateMixin {
late final AnimationController animationController = AnimationController(
vsync: this,
duration: Duration(seconds: 1),
)..repeat();
@override
Widget build(BuildContext context) {
return Stack(
children: [
AnimatedAlign(
alignment: TweenSequence([
TweenSequenceItem(
tween: Tween(begin: Alignment.bottomCenter, end: Alignment.bottomCenter),
weight: 1,
),
TweenSequenceItem(
tween: Tween(begin: Alignment.bottomCenter, end: Alignment.bottomCenter.translate(20, 0)),
weight: 1,
),
TweenSequenceItem(
tween: Tween(begin: Alignment.bottomCenter.translate(20, 0), end: Alignment.bottomCenter.translate(-20, 0)),
weight: 1,
),
TweenSequenceItem(
tween: Tween(begin: Alignment.bottomCenter.translate(-20, 0), end: Alignment.bottomCenter),
weight: 1,
),
]).animate(animationController),
duration: Duration(milliseconds: 500),
onEnd: () {
setState(() {});
},
child: MyWidget(),
),
],
);
}
}
class Example extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: MyWidget(),
),
);
}
}
Note: 以上代码仅供参考,您可以根据自己的实际情况做出相应的修改。