📜  Flutter-动画(1)

📅  最后修改于: 2023-12-03 15:30:49.661000             🧑  作者: Mango

Flutter 动画

Flutter 可以轻松实现多种类型的动画,例如补间动画、物理模拟等。

补间动画

补间动画是通过将起始和结束的值进行平滑地转换来创建动画效果的一种方式。在 Flutter 中,Animation 类和其子类可以用于实现补间动画。

Tween

Tween 是一个对值进行线性插值的类,它可以用于在两个值之间产生平滑的动画。

例如,以下代码将会在 2 秒内将一个容器从高度为 0.0 变为高度为 200.0:

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 2),
    );
    _animation = Tween(begin: 0.0, end: 200.0).animate(_controller)
      ..addListener(() {
        setState(() {});
      });
    _controller.forward();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      height: _animation.value,
      color: Colors.blue,
    );
  }
}
CurvedAnimation

CurvedAnimation 可用于在动画的启动和停止之间应用曲线。

例如,以下代码将会在 2 秒内将一个容器从高度为 0.0 变为高度为 200.0,并在动画开始时使用一个缓入曲线,并在动画结束时使用一个缓出曲线:

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 2),
    );
    _animation = Tween(begin: 0.0, end: 200.0).animate(
      CurvedAnimation(
        parent: _controller,
        curve: Curves.easeInOut,
        reverseCurve: Curves.easeInOut,
      ),
    )
      ..addListener(() {
        setState(() {});
      });
    _controller.forward();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      height: _animation.value,
      color: Colors.blue,
    );
  }
}
物理模拟

Flutter 可以使用 AnimatedPhysics 来模拟物理运动,并产生动画效果。

例如,以下代码将在 2 秒内将一个容器从高度为 0.0 变为高度为 200.0,使用一个比较真实的物理模拟效果:

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 2),
    );
    _animation = Tween(begin: 0.0, end: 200.0).animate(
      AnimatedPhysics(
        parent: _controller,
        velocity: 0.0,
      ),
    )
      ..addListener(() {
        setState(() {});
      });
    _controller.forward();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      height: _animation.value,
      color: Colors.blue,
    );
  }
}