如何使用AnimatedContainer进行动画变换(例如缩放)

时间:2017-03-08 04:17:27

标签: dart flutter

我希望使用transformAnimatedContainer属性为容器的比例设置动画效果;但是,比例没有转变,并且从头到尾直接跳跃。

代码段:

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,
    ),
  )
);

有关正在发生的事情的任何见解?

3 个答案:

答案 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();
  }
}

上面的代码产生以下输出

enter image description here