Flutter动画渐变插件animate_gradient的使用

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

Flutter动画渐变插件animate_gradient的使用

Animate Gradient

pub Animated-Gradient

此包让您无需任何麻烦即可创建动画渐变。只需传递主颜色和次要颜色,您就可以完成操作。您可以使用对齐方式来实现惊人的效果。有关更多信息,请阅读以下文档。

使用方法

创建您的第一个动画渐变

仅需要两个必需参数:primaryColorssecondaryColors

  • primaryColors 的长度必须大于或等于 2。
  • secondaryColors 的长度必须等于 primaryColors 的长度。
import 'package:animate_gradient/animate_gradient.dart';

AnimateGradient(
  primaryColors: const [
    Colors.pink,
    Colors.pinkAccent,
    Colors.white,
  ],
  secondaryColors: const [
    Colors.blue,
    Colors.blueAccent,
    Colors.white,
  ],
  child: YourWidget(),
),

效果图1

玩转对齐方式

对齐方式是可选的。您可以传递以下对齐方式:

  • primaryBegin
  • primaryEnd
  • secondaryBegin
  • secondaryEnd

这样可以产生一些疯狂的效果。

import 'package:animate_gradient/animate_gradient.dart';

AnimateGradient(
  primaryBegin: Alignment.topLeft,
  primaryEnd: Alignment.bottomLeft,
  secondaryBegin: Alignment.bottomLeft,
  secondaryEnd: Alignment.topRight,
  primaryColors: const [
    Colors.pink,
    Colors.pinkAccent,
    Colors.white,
  ],
  secondaryColors: const [
    Colors.white,
    Colors.blueAccent,
    Colors.blue,
  ],
  child: YourWidget(),
),

效果图2

另外!使用 AlignemntGeometry 进行更好的控制

对于以 RTL 格式构建的应用程序,普通的 Alignments 并不总是有效。因此,您可以使用 AlignmentGeometry

  • primaryBegin --> primaryBeginGeometry
  • primaryEnd --> primaryEndGeometry
  • secondaryBegin --> secondaryBeginGeometry
  • secondaryEnd --> secondaryEndGeometry

此外,您还有一个额外的属性 textDirectionForGeometry。这将用于解析 AlignmentGeometry

import 'package:animate_gradient/animate_gradient.dart';

AnimateGradient(
  primaryBeginGeometry: const AlignmentDirectional(0, 1),
  primaryEndGeometry: const AlignmentDirectional(0, 2),
  secondaryBeginGeometry: const AlignmentDirectional(2, 0),
  secondaryEndGeometry: const AlignmentDirectional(0, -0.8),
  textDirectionForGeometry: TextDirection.rtl,
  primaryColors: const [
    Colors.pink,
    Colors.pinkAccent,
    Colors.white,
  ],
  secondaryColors: const [
    Colors.white,
    Colors.blueAccent,
    Colors.blue,
  ],
  child: YourWidget(),
),

效果图3

请注意,AlignmentGeometry 的优先级高于 Alignment

可用属性

属性 类型 描述
primaryColors List 动画的起始颜色
secondaryColors List 动画的结束颜色
primaryBegin Alignment? primaryColors 的起始对齐方式
primaryEnd Alignment? primaryColors 的结束对齐方式
secondaryBegin Alignment? secondaryColors 的起始对齐方式
secondaryEnd Alignment? secondaryColors 的结束对齐方式
primaryBeginGeometry AlignmentGeometry? primaryColors 的起始 AlignmentGeometry
primaryEndGeometry AlignmentGeometry? primaryColors 的结束 AlignmentGeometry
secondaryBeginGeometry AlignmentGeometry? secondaryColors 的起始 AlignmentGeometry
secondaryEndGeometry AlignmentGeometry? secondaryColors 的结束 AlignmentGeometry
textDirectionForGeometry TextDierction? 用于解析 AlignmentGeometry 的文本方向
duration Duration? 转换之间的持续时间
controller AnimationController? 自定义动画控制器
animateAlignments bool? 是否要动画化对齐方式
reverse bool? 是否要反转动画
child Widget? 子组件

示例代码

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

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Animated Gradient',
      home: App(),
    );
  }
}

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

  @override
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  bool isChanged = false;
  List<Color> primaryColors = const [
    Colors.white,
    Colors.pinkAccent,
    Colors.pink,
  ];
  List<Color> secondaryColors = const [
    Colors.blue,
    Colors.blueAccent,
    Colors.white,
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: AnimateGradient(
        primaryBeginGeometry: const AlignmentDirectional(0, 1),
        primaryEndGeometry: const AlignmentDirectional(0, 2),
        secondaryBeginGeometry: const AlignmentDirectional(2, 0),
        secondaryEndGeometry: const AlignmentDirectional(0, -0.8),
        textDirectionForGeometry: TextDirection.rtl,
        primaryColors: primaryColors,
        secondaryColors: secondaryColors,
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const Text(
                'Animated Gradient',
                style: TextStyle(
                  fontSize: 36,
                  color: Colors.white,
                ),
              ),
              ElevatedButton(
                onPressed: _changeColors,
                style: _buttonStyle(),
                child: const Text(
                  'Change Colors',
                  style: TextStyle(color: Colors.black),
                ),
              )
            ],
          ),
        ),
      ),
    );
  }

  ButtonStyle _buttonStyle() {
    return ButtonStyle(
      shape: MaterialStatePropertyAll(
        RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(8),
        ),
      ),
    );
  }

  void _changeColors() {
    if (isChanged) {
      isChanged = false;
      primaryColors = const [
        Colors.pink,
        Colors.pinkAccent,
        Colors.white,
      ];
      secondaryColors = const [
        Colors.white,
        Colors.blueAccent,
        Colors.blue,
      ];
    } else {
      isChanged = true;
      primaryColors = [
        Colors.red,
        Colors.redAccent,
        Colors.white,
      ];
      secondaryColors = [
        Colors.white,
        Colors.tealAccent,
        Colors.teal,
      ];
    }

    setState(() {});
  }
}

作者

此插件由 Vikas Kumar 开发。


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用animate_gradient插件来实现动画渐变的代码示例。animate_gradient插件允许你创建带有渐变动画的背景或前景。

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

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

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

接下来是一个完整的示例代码,展示如何使用AnimateGradient来创建一个带有渐变动画的容器:

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

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

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

class AnimatedGradientWidget extends StatefulWidget {
  @override
  _AnimatedGradientWidgetState createState() => _AnimatedGradientWidgetState();
}

class _AnimatedGradientWidgetState extends State<AnimatedGradientWidget> with SingleTickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 5),
      vsync: this,
    )..repeat(reverse: true);  // 不断重复动画,并且正反向交替
  }

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

  @override
  Widget build(BuildContext context) {
    return AnimateGradient(
      colors: [Colors.blue, Colors.red, Colors.yellow],
      begin: Alignment.topLeft,
      end: Alignment.bottomRight,
      animation: _controller,
      child: Container(
        width: 300,
        height: 300,
        child: Center(
          child: Text(
            'Animate Gradient',
            style: TextStyle(fontSize: 24, color: Colors.white),
          ),
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖项:在pubspec.yaml文件中添加animate_gradient依赖项。

  2. 导入包:在代码顶部导入animate_gradient包。

  3. 主应用MyApp是一个简单的Flutter应用,包含一个Scaffold,其中包含一个AppBar和一个居中的AnimatedGradientWidget

  4. 动画组件AnimatedGradientWidget是一个StatefulWidget,用于管理动画状态。

  5. 动画控制器:在initState方法中初始化一个AnimationController,设置动画的持续时间为5秒,并使动画不断重复且正反向交替。

  6. 释放资源:在dispose方法中释放动画控制器资源。

  7. 构建动画:使用AnimateGradient组件,设置渐变颜色数组、渐变的开始和结束位置,以及动画控制器。动画将应用于一个包含文本的Container

这样,你就可以在Flutter应用中实现一个带有渐变动画效果的背景了。希望这个示例能帮助你更好地理解animate_gradient插件的使用!

回到顶部