我希望使用transform的AnimatedContainer属性为容器的比例设置动画效果;但是,比例没有转变,并且从头到尾直接跳跃。
代码段:
var container = new AnimatedContainer(
duration: const Duration(milliseconds: 200),
width: 50.0,
height: 50.0,
// selected is a bool that will be toggled
transform: selected ? new Matrix4.identity() : new Matrix4.identity().scaled(0.2,0.2),
decoration: new BoxDecoration(
shape: BoxShape.circle,
backgroundColor: Colors.blue[500],
),
child: new Center(
child: new Icon(
Icons.check,
color: Colors.white,
),
)
);
有关正在发生的事情的任何见解?
答案 0 :(得分:1)
我担心transform
是我们没有动画的属性之一(child
是另一个)。如果要为比例设置动画,可以使用ScaleTransition。
ScaleTransition:https://docs.flutter.io/flutter/widgets/ScaleTransition-class.html
Matrix lerp的错误:https://github.com/flutter/flutter/issues/443
答案 1 :(得分:1)
AnimatedContainer支持为其变换值设置动画,如下所示:
/// scale to 95%, centerred
final width = 200.0;
final height = 300.0;
bool shouldScaleDown = true;// change value when needed
AnimatedContainer(
color: Colors.blueAccent,
width: width,
height: height,
duration: Duration(milliseconds: 100),
transform: (shouldScaleDown
? (Matrix4.identity()
..translate(0.025 * width, 0.025 * height)// translate towards right and down
..scale(0.95, 0.95))// scale with to 95% anchorred at topleft of the AnimatedContainer
: Matrix4.identity()),
child: Container(),
);
答案 2 :(得分:0)
您可以使用Animated Builder进行动画处理,下面的代码将在4秒内将字体大小为20-35的文本缩放,让我将其分解为几个步骤,以使您更好地理解
1。您需要从 TickerProviderStateMixin 实现类。
2。您需要一个 AnimationController 和一个 Animation 变量;
3。将小部件包装在AnimatedBuilder中(注意AnimatedBuilder必须返回一个小部件,至少是一个容器),并将控制器添加为动画
animation: _controller,
和返回AnimatedWidget的构建器
4。在init方法中,通过vsync和Animation Duration初始化控制器。 而带有Tweenit的动画则采用开始和结束值,这些值定义了要制作动画的Widget的初始值和最终值
对我而言,在这种情况下,它是文本小部件,因此开始和结束值将与fontSize.fontSize相对应,它以animation.value
的形式接收变量值
5。最后,如何通过设置控制器的动画和“曲线”效果来指定要如何设置动画效果
这是一个可行的示例
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<SplashScreen>
with TickerProviderStateMixin {
AnimationController _controller;
Animation _animation;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color(0xFF005CA9),
body: Center(
child: AnimatedBuilder(
animation: _controller,
builder: (BuildContext context, Widget child) {
return Container(
child: Text(
'Hello World',
style: TextStyle(
color: Colors.white,
fontSize: _animation.value,
),
),
);
},
),
));
}
void initState() {
super.initState();
_controller =
AnimationController(vsync: this, duration: Duration(seconds: 4));
_animation = Tween<double>(
begin: 20,
end: 35,
).animate(
CurvedAnimation(
parent: _controller,
curve: Curves.ease,
),
);
_controller.forward();
}
}
上面的代码产生以下输出