10

我正在寻找使用 AnimatedContainer 的transform属性为容器的比例设置动画;然而,尺度没有被转换并且直接从开始到结束跳跃。

代码片段:

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

关于发生了什么的任何见解?

4

3 回答 3

4

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(),
);
于 2020-03-12T03:33:06.777 回答
2

恐怕transform是我们不设置动画的属性之一(child是另一个)。如果要为比例设置动画,可以使用 ScaleTransition。

ScaleTransition:https ://docs.flutter.io/flutter/widgets/ScaleTransition-class.html

Matrix lerp 的错误:https ://github.com/flutter/flutter/issues/443

于 2017-03-08T20:46:36.400 回答
1

您可以使用 Animated Builder 制作动画,下面的代码将在 4 秒内从字体大小 20-35 缩放文本让我将其分解为步骤,以便您更好地理解

1.你需要从TickerProviderStateMixin实现你的类。

2.你需要一个AnimationController和一个Animation变量;

3.将您的小部件包装在 AnimatedBuilder 中(注意 AnimatedBuilder 必须返回一个 Widget 至少一个容器)并将控制器添加到动画中

animation: _controller,

和返回 AnimatedWidget 的 builder

4.在init方法中用vsync和动画持续时间初始化控制器。并且带有 Tweenit 的动画采用 begin 和 end 值,它们定义了要动画的 Widget 的初始值和最终值

对我来说,在这种情况下,它是文本小部件,因此开始和结束值将对应于 fontSize.which 接收变量值作为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();
  }
}

上面的代码产生以下输出

在此处输入图像描述

于 2019-02-22T03:16:45.347 回答