Flutter动画效果插件annimation的使用

Flutter动画效果插件annimation的使用

特性

通过使用此插件,您可以轻松创建自定义动画。首先,您可以在Annimation Web App中设计您的动画,然后将其导出为JSON文件,并在Flutter项目中导入并使用该插件。

开始使用

安装插件

pubspec.yaml文件中添加以下依赖项:

dependencies:
  annimation: ^版本号

运行以下命令以获取依赖项:

flutter pub get

使用方法

以下是一个完整的示例代码,展示了如何使用annimation插件来实现动画效果:

import 'package:annimation/annimation.dart'; // 导入插件
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AnnimationExample(), // 主页面
    );
  }
}

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

  [@override](/user/override)
  State<AnnimationExample> createState() => _AnnimationExampleState();
}

class _AnnimationExampleState extends State<AnnimationExample>
    with TickerProviderStateMixin {
  AnimationController? newanimationController;
  Map<String, dynamic> proj = {};
  AnimationData? animationData;

  [@override](/user/override)
  void dispose() {
    newanimationController?.dispose(); // 释放动画控制器
    super.dispose();
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    loadData(); // 加载动画数据

    newanimationController = AnimationController(
        vsync: this, duration: const Duration(milliseconds: 1500)); // 创建动画控制器
    newanimationController!.addListener(() {
      setState(() {}); // 动画状态更新时刷新UI
    });
  }

  StateSetter state = (fn) {};
  [@override](/user/override)
  Widget build(BuildContext context) {
    double boxW = MediaQuery.of(context).size.width * 0.5; // 计算屏幕宽度的一半
    return SafeArea(
      child: Scaffold(
        body: StatefulBuilder( // 使用StatefulBuilder管理局部状态
            builder: (BuildContext context, StateSetter _state) {
          state = _state;
          return SingleChildScrollView(
            child: Wrap(
              children: [
                // 第一个动画组件
                InkWell(
                  onTap: () {
                    if (newanimationController!.status == AnimationStatus.completed) {
                      newanimationController!.reverse(); // 如果动画已完成,则反向播放
                    } else {
                      newanimationController!.reset(); // 否则重置动画
                      newanimationController?.forward(); // 播放动画
                    }
                  },
                  child: (animationData != null && newanimationController != null)
                      ? Container(
                          child: AnimationFromAssetAnimationDataFileWithAnimationController(
                            animationController: newanimationController!, // 使用动画控制器
                            animationData: animationData!, // 使用动画数据
                            parentSize: Size(boxW, boxW), // 设置父容器大小
                          ),
                        )
                      : FlutterLogo(), // 默认显示FlutterLogo
                ),

                // 其他动画组件
                AnimationFromAssetFileWithTimeDuration(
                  filePath: "assets/circlebounce3.json", // JSON文件路径
                  animationDuration: Duration(milliseconds: 2000), // 动画持续时间
                  size: Size(boxW, boxW), // 动画尺寸
                  clickAnimationDirection: ClickAnimationDirection.forwardReverse, // 点击方向
                ),
                AnimationFromAssetFileWithTimeDuration(
                  filePath: "assets/anim.json",
                  repeat: true, // 循环播放
                  animationDuration: Duration(milliseconds: 2000),
                  size: Size(boxW, boxW),
                  clickAnimationDirection: ClickAnimationDirection.forwardReverse,
                ),
                AnimationFromAssetFileWithTimeDuration(
                  filePath: "assets/PlayPause.json",
                  animationDuration: Duration(milliseconds: 400),
                  size: Size(boxW, boxW),
                  singleColor: Colors.green, // 单一颜色
                  clickAnimationDirection: ClickAnimationDirection.forwardReverse,
                ),
                AnimationFromAssetFileWithTimeDuration(
                  filePath: "assets/MultiPolygon.json",
                  animationDuration: Duration(milliseconds: 2000),
                  size: Size(boxW, boxW),
                  repeat: true,
                  clickAnimationDirection: ClickAnimationDirection.forwardReverse,
                ),
                AnimationFromAssetFileWithTimeDuration(
                  filePath: "assets/HomeMenu.json",
                  animationDuration: Duration(milliseconds: 800),
                  size: Size(boxW, boxW),
                  repeat: true,
                  clickAnimationDirection: ClickAnimationDirection.forwardReverse,
                ),
                AnimationFromAssetFileWithTimeDuration(
                  filePath: "assets/PlayPause1.json",
                  animationDuration: Duration(milliseconds: 1500),
                  size: Size(boxW, boxW),
                  repeat: true,
                  clickAnimationDirection: ClickAnimationDirection.forwardReverse,
                ),
                AnimationFromAssetFileWithTimeDuration(
                  filePath: "assets/circlebounce2.json",
                  size: Size(boxW, boxW),
                  repeat: true,
                ),
              ],
            ),
          );
        }),
      ),
    );
  }

  void loadData() async {
    try {
      animationData = await AnimationData.loadAnimationDataFromAsset("assets/Segments.json");
    } catch (e) {}

    if (animationData != null) {
      if (mounted) {
        setState(() {}); // 更新UI
      }
    }
  }
}

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

1 回复

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


在Flutter中,animation 并不是一个单独的插件,而是Flutter框架内置的核心库之一,用于创建和管理动画效果。Flutter的动画系统非常强大,允许你创建各种复杂的动画效果。下面是一个简单的指南,帮助你理解如何使用Flutter的动画系统。

1. 基本概念

  • AnimationController: 控制动画的播放、暂停、停止等操作。它需要一个TickerProvider(通常是SingleTickerProviderStateMixinTickerProviderStateMixin)来驱动动画。
  • Animation: 表示动画的值,可以是doubleColorSize等类型。Animation对象通常由AnimationController生成。
  • Tween: 定义动画的起始值和结束值。Tween可以与AnimationController结合使用,生成一个Animation对象。

2. 基本步骤

  1. 创建AnimationController:

    AnimationController controller;
    [@override](/user/override)
    void initState() {
      super.initState();
      controller = AnimationController(
        vsync: this,
        duration: Duration(seconds: 2),
      );
    }
    
  2. 定义TweenAnimation:

    Animation<double> animation;
    [@override](/user/override)
    void initState() {
      super.initState();
      controller = AnimationController(
        vsync: this,
        duration: Duration(seconds: 2),
      );
      animation = Tween<double>(begin: 0, end: 300).animate(controller);
    }
    
  3. 启动动画:

    controller.forward();
    
  4. build方法中使用动画:

    [@override](/user/override)
    Widget build(BuildContext context) {
      return AnimatedBuilder(
        animation: animation,
        builder: (context, child) {
          return Container(
            width: animation.value,
            height: animation.value,
            color: Colors.blue,
          );
        },
      );
    }
    
  5. 释放资源:

    [@override](/user/override)
    void dispose() {
      controller.dispose();
      super.dispose();
    }
    

3. 完整示例

以下是一个完整的示例,展示如何使用Flutter的动画系统创建一个简单的缩放动画:

import 'package:flutter/material.dart';

class ScaleAnimationExample extends StatefulWidget {
  [@override](/user/override)
  _ScaleAnimationExampleState createState() => _ScaleAnimationExampleState();
}

class _ScaleAnimationExampleState extends State<ScaleAnimationExample>
    with SingleTickerProviderStateMixin {
  AnimationController controller;
  Animation<double> animation;

  [@override](/user/override)
  void initState() {
    super.initState();
    controller = AnimationController(
      vsync: this,
      duration: Duration(seconds: 2),
    );
    animation = Tween<double>(begin: 0, end: 300).animate(controller)
      ..addListener(() {
        setState(() {});
      });
    controller.forward();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Scale Animation'),
      ),
      body: Center(
        child: Container(
          width: animation.value,
          height: animation.value,
          color: Colors.blue,
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    controller.dispose();
    super.dispose();
  }
}

void main() {
  runApp(MaterialApp(
    home: ScaleAnimationExample(),
  ));
}
回到顶部