Flutter动画效果插件animator的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter动画效果插件animator的使用

Flutter中的animator包是一个强大的动画库,它使得创建和控制动画变得异常简单。这个库提供了两种主要的Widget:AnimatorAnimateWidget,它们可以帮助开发者快速实现显式和隐式的动画效果。

AnimatorAnimateWidget

  • Animator 是最初引入的Widget,主要用于显式动画。
  • AnimateWidget 是一个更强大的Widget,它可以用于隐式动画、显式动画以及交错动画(staggered animation)。

AnimateWidget参数设置

AnimateWidget({
  Key? key, 
  double? initialValue,
  double lowerBound = 0.0,
  double upperBound = 1.0,
  Duration duration = const Duration(milliseconds: 500),
  Duration? reverseDuration,
  Curve curve = Curves.linear,
  Curve? reverseCurve,
  AnimationBehavior animationBehavior = AnimationBehavior.normal,
  int? repeats,
  int? cycles,
  void Function()? endAnimationListener,
  bool triggerOnInit = true,
  bool triggerOnRebuild = false,
  bool resetOnRebuild = false,
  required Widget Function(BuildContext, Animate) builder,
})

参数说明:

  • initialValue, lowerBound, upperBound: 动画控制器的初始值、下限和上限。
  • duration, reverseDuration: 动画正向和反向的时间。
  • curve, reverseCurve: 动画正向和反向的曲线。
  • animationBehavior: 控制器在AccessibilityFeatures.disableAnimations为true时的行为。
  • repeats, cycles: 定义动画重复次数或周期数。
  • endAnimationListener: 动画结束时触发的回调函数。
  • triggerOnInit, triggerOnRebuild, resetOnRebuild: 控制动画何时启动或重置。
  • builder: 构建动画内容的回调函数。

隐式动画示例

以下是如何使用AnimateWidget来创建一个类似AnimatedContainer的效果:

Center(
  child: AnimateWidget(
    duration: const Duration(seconds: 2),
    curve: Curves.fastOutSlowIn,
    builder: (context, animate) => Container(
      width: animate.call(selected ? 200.0 : 100.0),
      height: animate.call(selected ? 100.0 : 200.0, 'height'),
      color: animate.call(selected ? Colors.red : Colors.blue),
      alignment: animate.call(selected ? Alignment.center : AlignmentDirectional.topCenter),
      child: const FlutterLogo(size: 75),
    ),
  ),
);

显式动画示例

下面是一个显式动画的例子,通过tween来控制旋转角度:

AnimatedWidget(
  duration: const Duration(seconds: 2),
  builder: (context, animate) {
    final angle = animate.fromTween(
      (currentValue) => Tween(begin: 0, end: 2 * 3.14),
    )!;
    
    return Transform.rotate(
      angle: angle,
      child: const FlutterLogo(size: 75),
    );
  },
);

使用Flutter的过渡Widget

你还可以结合Flutter内置的过渡Widget,如PositionedTransition等,来创建复杂的动画效果:

AnimateWidget(
  builder: (context, animate) => PositionedTransition(
    rect: RelativeRectTween(
      begin: RelativeRect.fromSize(const Rect.fromLTWH(0, 0, smallLogo, smallLogo), biggest),
      end: RelativeRect.fromSize(
        Rect.fromLTWH(biggest.width - bigLogo, biggest.height - bigLogo, bigLogo, bigLogo),
        biggest,
      ),
    ).animate(animate.curvedAnimation),
    child: const Padding(padding: EdgeInsets.all(8), child: FlutterLogo()),
  ),
);

交错动画示例

交错动画允许你在同一时间线内对不同的属性应用不同的动画效果:

class _MyStaggeredWidgetState extends State<MyStatefulWidget> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      behavior: HitTestBehavior.opaque,
      onTap: () {
        setState(() {});
      },
      child: AnimateWidget(
        duration: const Duration(milliseconds: 2000),
        cycles: 2,
        triggerOnRebuild: true,
        triggerOnInit: false,
        builder: (context, animate) {
          final padding = animate
              .setCurve(Interval(0.250, 0.375, curve: Curves.ease))
              .fromTween(
                (_) => EdgeInsetsTween(
                  begin: const EdgeInsets.only(bottom: 16.0),
                  end: const EdgeInsets.only(bottom: 75.0),
                ),
              );
          // 其他属性类似设置...
          return Center(
            child: Container(
              width: 300.0,
              height: 300.0,
              decoration: BoxDecoration(
                color: Colors.black.withOpacity(0.1),
                border: Border.all(color: Colors.black.withOpacity(0.5)),
              ),
              child: Container(
                padding: padding,
                alignment: Alignment.bottomCenter,
                child: Opacity(
                  opacity: opacity,
                  child: Container(
                    width: containerWidget,
                    height: containerHeight,
                    decoration: BoxDecoration(
                      color: color,
                      border: Border.all(color: Colors.indigo[300]!, width: 3.0),
                      borderRadius: borderRadius,
                    ),
                  ),
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}

示例项目

为了更好地理解如何使用animator库,可以参考以下完整的示例代码:

import 'package:flutter/material.dart';
import 'package:animator/animator.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Animator Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text("Animator demo"),
        ),
        body: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  goto(Widget page, BuildContext context) {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => page,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          ElevatedButton(
            child: Text("Basic Animation 0"),
            onPressed: () => goto(BasicAnimation0(), context),
          ),
          ElevatedButton(
            child: Text("Basic Animation 1"),
            onPressed: () => goto(BasicAnimation1(), context),
          ),
          ElevatedButton(
            child: Text("Basic Animation 2"),
            onPressed: () => goto(MyCustomPainterAnimation(), context),
          ),
          ElevatedButton(
            child: Text("Implicit animation"),
            onPressed: () => goto(BasicAnimation3(), context),
          ),
        ],
      ),
    );
  }
}

以上代码展示了如何创建一个包含多个基本动画演示的应用程序。每个按钮点击后会导航到不同的页面,展示不同类型的动画效果。


更多关于Flutter动画效果插件animator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动画效果插件animator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何在Flutter中使用animator插件来实现动画效果的示例。animator是一个在Flutter社区中较为流行的动画库,尽管它不是官方的库,但它提供了很多便捷的动画功能。以下是一个简单的示例,展示了如何使用animator插件来创建一个淡入淡出的动画效果。

首先,你需要在你的pubspec.yaml文件中添加animator依赖:

dependencies:
  flutter:
    sdk: flutter
  animator: ^3.0.0  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中,你可以使用animator来创建动画。以下是一个完整的示例,展示了如何实现一个淡入淡出的动画效果:

import 'package:flutter/material.dart';
import 'package:animator/animator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Animator Example'),
        ),
        body: Center(
          child: FadeInOutAnimationExample(),
        ),
      ),
    );
  }
}

class FadeInOutAnimationExample extends StatefulWidget {
  @override
  _FadeInOutAnimationExampleState createState() => _FadeInOutAnimationExampleState();
}

class _FadeInOutAnimationExampleState extends State<FadeInOutAnimationExample> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);  // 无限循环动画,正向和反向

    _animation = _controller.drive(Tween<double>(begin: 0.0, end: 1.0).chain(CurveTween(curve: Curves.easeInOut)));
  }

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

  @override
  Widget build(BuildContext context) {
    return Animator<double>(
      tween: Tween<double>(begin: 0.0, end: 1.0),
      duration: _controller.duration,
      curve: Curves.easeInOut,
      builder: (anim) {
        return AnimatedOpacity(
          opacity: anim.value,
          child: Container(
            width: 200,
            height: 200,
            color: Colors.blue,
            child: Center(
              child: Text(
                'Fade In Out',
                style: TextStyle(color: Colors.white, fontSize: 24),
              ),
            ),
          ),
        );
      },
      animation: _animation,
    );
  }
}

在这个示例中,我们创建了一个FadeInOutAnimationExample组件,它使用AnimatorAnimatedOpacity来实现淡入淡出的动画效果。Animator组件用于管理动画,而AnimatedOpacity则用于根据动画值调整其子组件的透明度。

注意:

  1. AnimationController用于控制动画的时长和循环。
  2. Tween用于定义动画的起始和结束值。
  3. CurveTweenCurves.easeInOut用于定义动画的缓动效果。
  4. Animatorbuilder回调函数接收动画值,并返回需要应用动画效果的Widget。

这个示例演示了如何使用animator插件来实现基本的动画效果。你可以根据实际需求进一步调整和扩展这个示例。

回到顶部