Flutter动画效果插件magic_animate的使用

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

Flutter动画效果插件magic_animate的使用

Magic Animate

精美的动画效果灵感来源于magic.css,每个动画都以可定制的小部件形式呈现。

特性

使用Flutter完全实现了Magic.css动画库的交互效果。

开始使用

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

dependencies:
  magic_animate: ^x.x.x

然后,在你的Dart文件中导入magic_animate包:

import 'package:magic_animate/magic_animate.dart';

支持的动画

Magic Animate支持多种动画效果,包括但不限于以下几种:

  • MBoingWidget
  • MBombWidget
  • MFoolishWidget
  • MHole_outWidget
  • MMagicWidget
  • MOpenWidget
  • MPerspectiveWidget
  • MPuffWidget
  • MRotateWidget
  • MSlideWidget
  • MSpaceWidget
  • MSwapWidget
  • MSwashWidget
  • MTinWidget
  • MTwisterInWidget
  • MVanishWidget

使用方法

每个动画小部件都有一个onController函数,该函数返回一个AnimationController,允许你通过AnimationController来控制动画的状态。以下是一个使用示例:

class MXXXWidget extends StatefulWidget {
  final Widget child;
  final Duration duration;
  final MagicControllerFn onController;
  final MXXXType type;
  const MXXXWidget({
    super.key,
    required this.child,
    required this.onController,
    required this.type,
    this.duration = const Duration(milliseconds: 1000),
  });

  [@override](/user/override)
  State<MXXXWidget> createState() => _MXXXWidgetState();
}

class _MXXXWidgetState extends State<MXXXWidget> {
  late AnimationController _controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this, duration: widget.duration);
    widget.onController(_controller);
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return widget.child;
  }
}

完整示例

下面是一个完整的示例代码,展示了如何使用Magic Animate插件创建一个具有多种动画效果的页面。

import 'package:example/conts.dart';
import 'package:example/magic_item.dart';
import 'package:example/magic_wrap.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: 'Magic Animate',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFFFD287F)),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _selAnimation = '';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color(0xFF17171E),
      body: Column(
        children: [
          Container(
            height: 200,
            width: double.infinity,
            alignment: Alignment.center,
            child: Stack(
              alignment: Alignment.center,
              children: [
                Container(
                  height: 100,
                  width: 100,
                  decoration: BoxDecoration(
                    color: const Color(0xFF3A3947),
                    borderRadius: BorderRadius.circular(10),
                  ),
                ),
                Positioned(
                  child: MagicWrap(
                    type: _selAnimation,
                    child: Container(
                      height: 100,
                      width: 100,
                      decoration: BoxDecoration(
                        color: const Color(0xFFFD287F),
                        borderRadius: BorderRadius.circular(10),
                      ),
                      child: const Icon(Icons.flutter_dash, size: 50, color: Colors.white),
                    ),
                  ),
                ),
              ],
            ),
          ),
          Expanded(
            child: SingleChildScrollView(
              child: Padding(
                padding: const EdgeInsets.only(bottom: 100),
                child: Column(
                  mainAxisSize: MainAxisSize.min,
                  children: magicList
                      .map((e) => MagicItem(
                            group: e,
                            onChange: (value) {
                              setState(() {
                                _selAnimation = value;
                              });
                            },
                          ))
                      .toList(),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用magic_animate插件来实现动画效果的代码案例。magic_animate是一个可以帮助你轻松创建复杂动画效果的Flutter插件。

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

dependencies:
  flutter:
    sdk: flutter
  magic_animate: ^最新版本号  # 请替换为当前最新版本号

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

接下来是一个简单的例子,演示如何使用magic_animate来实现一个基本的动画效果。

main.dart

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

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

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

class MagicAnimateExample extends StatefulWidget {
  @override
  _MagicAnimateExampleState createState() => _MagicAnimateExampleState();
}

class _MagicAnimateExampleState extends State<MagicAnimateExample> with SingleTickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);
  }

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

  @override
  Widget build(BuildContext context) {
    return MagicAnimate(
      animation: _controller,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.blue,
        child: Center(
          child: Text(
            'Animate',
            style: TextStyle(color: Colors.white, fontSize: 20),
          ),
        ),
      ),
      tween: Tween<double>(begin: 0, end: 300).animate(
        CurvedAnimation(
          parent: _controller,
          curve: Curves.easeInOut,
        ),
      ),
      builder: (context, value) {
        return Transform.translate(
          offset: Offset(value, 0),
          child: child,
        );
      },
    );
  }
}

解释

  1. 依赖安装:在pubspec.yaml中添加magic_animate依赖,然后运行flutter pub get

  2. 创建动画控制器:在_MagicAnimateExampleState中,我们创建了一个AnimationController,并设置了动画的持续时间和vsync(用于与屏幕刷新率同步)。

  3. 动画初始化与释放:在initState中初始化动画控制器,并在dispose中释放它。

  4. 使用MagicAnimate

    • animation:传入动画控制器。
    • child:这是你想要动画化的Widget。
    • tween:定义动画的值范围,这里我们使用了一个Tween<double>从0到300。
    • builder:一个函数,接收上下文和当前动画值,并返回动画化的Widget。在这个例子中,我们使用Transform.translate来根据动画值移动Widget。

这个简单的例子展示了如何使用magic_animate来实现一个基本的平移动画。当然,magic_animate插件提供了更多高级功能,你可以根据需求查阅其官方文档来获取更多信息和高级用法。

回到顶部