Flutter动画效果插件animate_do的使用

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

Flutter动画效果插件animate_do的使用

简介

animate_do 是一个受 Animate.css 启发的Flutter动画包,它完全基于Flutter的动画系统构建,没有外部依赖。该包适用于iOS、Android、Linux、Mac、Web和Windows平台,并且支持Dart 3版本以及空安全(Null-Safety)。

Animate_do demo animation

开始使用

animate_do 包非常易于使用。每个动画都包含默认值,这些默认值看起来非常美观,但你也可以根据需要更改属性。

动画组件通用属性

Property Type Description
key Key (可选) Widget键
child Widget 要动画化的子Widget
duration Duration 动画持续时间
delay Duration 动画延迟时间
from double 初始或最终位置,用于滑动或淡入淡出效果
animate boolean 设置为true以启动动画(适用于setState, Bloc, Provider, Redux等状态管理方式)
infinite boolean 是否无限循环动画
spins double 指定旋转次数(如Spin, Roulette, PerfectSpin等动画)
manualTrigger boolean 是否手动触发动画(需配合controller属性使用)
controller Function 提供对动画控制器的访问(高级用例中使用)
onFinish Function 动画结束时调用的回调函数
curve Curve 自定义动画曲线

可用动画

FadeIn 动画

  • FadeIn
  • FadeInDown
  • FadeInDownBig
  • FadeInUp
  • FadeInUpBig
  • FadeInLeft
  • FadeInLeftBig
  • FadeInRight
  • FadeInRightBig

FadeOut 动画

  • FadeOut
  • FadeOutDown
  • FadeOutDownBig
  • FadeOutUp
  • FadeOutUpBig
  • FadeOutLeft
  • FadeOutLeftBig
  • FadeOutRight
  • FadeOutRightBig

BounceIn 动画

  • BounceInDown
  • BounceInUp
  • BounceInLeft
  • BounceInRight

ElasticIn 动画

  • ElasticIn
  • ElasticInDown
  • ElasticInUp
  • ElasticInLeft
  • ElasticInRight

SlideIns 动画

  • SlideInDown
  • SlideInUp
  • SlideInLeft
  • SlideInRight

FlipIn 动画

  • FlipInX
  • FlipInY

Zooms 动画

  • ZoomIn
  • ZoomOut

SpecialIn 动画

  • JelloIn

Attention Seeker 动画

  • Bounce
  • Dance
  • Flash
  • Pulse
  • Roulette
  • ShakeX
  • ShakeY
  • Spin
  • SpinPerfect
  • Swing

所有Attention Seeker动画都可以通过设置infinite属性来实现无限循环。

示例代码

基本示例

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      theme: ThemeData.light(useMaterial3: true),
      home: Scaffold(
        body: Center(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[
              FadeInLeft(child: const Square()),
              FadeInUp(child: const Square()),
              FadeInDown(child: const Square()),
              FadeInRight(child: const Square()),
            ],
          ),
        ),
      ),
    );
  }
}

class Square extends StatelessWidget {
  const Square({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 50,
      height: 50,
      color: Colors.blueAccent,
    );
  }
}

带有切换功能的基本示例

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool animate = true;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      theme: ThemeData.light(useMaterial3: true),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Toggle Animation'),
          actions: [
            IconButton(
              icon: const Icon(Icons.refresh),
              onPressed: () {
                setState(() {
                  animate = !animate;
                });
              },
            )
          ],
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: <Widget>[
                FadeIn(animate: animate, child: const Square()),
                FadeInUp(animate: animate, child: const Square()),
                FadeInDown(animate: animate, child: const Square()),
                FadeInLeft(animate: animate, child: const Square()),
                FadeInRight(animate: animate, child: const Square()),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

class Square extends StatelessWidget {
  const Square({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 50,
      height: 50,
      color: Colors.blueAccent,
    );
  }
}

使用 onFinish 回调

FadeIn(
  animate: animate,
  delay: const Duration(milliseconds: 100),
  onFinish: (direction) => print('$direction'),
  child: const Square(),
)

手动触发动画

如果你需要更细粒度地控制动画,可以使用 manualTriggercontroller 属性:

class ManualTriggerExample extends StatefulWidget {
  const ManualTriggerExample({Key? key}) : super(key: key);

  @override
  State<ManualTriggerExample> createState() => _ManualTriggerExampleState();
}

class _ManualTriggerExampleState extends State<ManualTriggerExample>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this);
  }

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

  void triggerAnimation() {
    _controller.forward();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Manual Trigger Example'),
      ),
      body: Center(
        child: FadeInUp(
          manualTrigger: true,
          controller: (controller) => _controller = controller,
          child: const Square(),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: triggerAnimation,
        child: const Icon(Icons.play_arrow),
      ),
    );
  }
}

以上是关于 animate_do 插件的详细说明及示例代码。希望对你有所帮助!如果需要更多帮助,请随时提问。


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

1 回复

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


当然,animate_do 是一个在 Flutter 中非常流行的动画效果插件,它提供了一系列简单且易于使用的动画组件。以下是如何在 Flutter 项目中使用 animate_do 插件来实现一些基本动画效果的代码示例。

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

dependencies:
  flutter:
    sdk: flutter
  animate_do: ^2.0.0  # 请检查最新版本号

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

示例代码

以下是一个简单的 Flutter 应用示例,展示了如何使用 animate_do 插件中的几种动画效果:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Animate Do Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              // FadeIn 动画
              FadeIn(
                child: Container(
                  padding: EdgeInsets.all(16.0),
                  color: Colors.blue,
                  child: Text(
                    'Fade In',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                duration: 1000,  // 动画持续时间,单位为毫秒
              ),
              SizedBox(height: 20),

              // FlipInX 动画
              FlipInX(
                child: Container(
                  padding: EdgeInsets.all(16.0),
                  color: Colors.green,
                  child: Text(
                    'Flip In X',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                duration: 1000,
              ),
              SizedBox(height: 20),

              // SlideInLeft 动画
              SlideInLeft(
                child: Container(
                  padding: EdgeInsets.all(16.0),
                  color: Colors.red,
                  child: Text(
                    'Slide In Left',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                duration: 1000,
              ),
              SizedBox(height: 20),

              // ZoomIn 动画
              ZoomIn(
                child: Container(
                  padding: EdgeInsets.all(16.0),
                  color: Colors.purple,
                  child: Text(
                    'Zoom In',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                duration: 1000,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

解释

  1. FadeIn:这个动画会使子组件从完全透明渐变到完全不透明。
  2. FlipInX:这个动画会使子组件在 X 轴上翻转进入屏幕。
  3. SlideInLeft:这个动画会使子组件从屏幕左侧滑动进入。
  4. ZoomIn:这个动画会使子组件从缩放到正常大小。

每个动画组件都有一个 duration 属性,你可以通过调整这个属性来改变动画的持续时间。

注意事项

  • 确保你已经正确安装了 animate_do 插件。
  • 根据需要调整动画的持续时间和其他属性。
  • 你可以在 animate_do 的官方文档中查找更多动画效果和详细的使用说明。

这个示例展示了 animate_do 插件的基本用法,希望对你有帮助!

回到顶部