Flutter数字计数动画插件number_counting_animation的使用

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

Flutter数字计数动画插件number_counting_animation的使用

NumberCountingAnimation 是一个简单的Flutter数字计数动画小部件。通过这个插件,您可以轻松地为数字添加动态效果,使得用户界面更加生动。

安装

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

dependencies:
  number_counting_animation: ^1.0.2

运行 flutter pub get 来安装该插件。

CountingAnimation 属性

以下是 CountingAnimation 小部件的主要属性及其描述:

类型 名称 描述 默认值
String value 显示的数值 -
TextStyle textStyle 文本样式 -
bool useChar 是否包含非动画字符 false
int scrollCount 动画滚动的总次数 40
Duration singleScrollDuration 每次滚动动画的持续时间 50ms
Duration lastDuration 最后一次动画的持续时间 50ms
Color bgColor 小部件背景颜色 transparent
bool useRefresh 当数值改变时重新启动动画 true

使用示例

下面是一个完整的示例代码,展示如何使用 CountingAnimation

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:number_counting_animation/number_counting_animation.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Counting Animation Demo', value: 12345),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title, required this.value});
  final String title;
  final int value;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int intValue = 0;
  String var1 = '';
  String var2 = '';
  String var3 = '';
  String var4 = '';

  void initData(int value) {
    intValue = value;
    var formatCurrency = NumberFormat.simpleCurrency(locale: "ko_KR", name: '', decimalDigits: 0);
    String formatStr = formatCurrency.format(value);

    var1 = value.toString();
    var2 = '₩${value.toString()}.123';
    var3 = '₩$formatStr';
    var4 = '[$formatStr]';
    setState(() {});
  }

  @override
  void initState() {
    super.initState();
    initData(widget.value);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      floatingActionButton: FloatingActionButton(
        child: const Icon(Icons.refresh),
        onPressed: () {
          initData(intValue + 1111);
        },
      ),
      body: Center(
        child: Column(
          children: [
            const Spacer(),
            CountingAnimation(
              value: var1,
              textStyle: const TextStyle(color: Colors.black, fontSize: 20),
              scrollCount: 20,
              singleScollDuration: const Duration(milliseconds: 50),
              lastDuration: const Duration(milliseconds: 1000),
            ),
            const Spacer(),
            CountingAnimation(
              value: var2,
              textStyle: const TextStyle(color: Colors.blue, fontSize: 20),
              useChar: true,
            ),
            const Spacer(),
            CountingAnimation(
              value: var3,
              textStyle: const TextStyle(color: Colors.blue, fontSize: 20),
              useChar: true,
            ),
            const Spacer(),
            CountingAnimation(
              value: var4,
              textStyle: const TextStyle(color: Colors.blue, fontSize: 20),
              useChar: true,
              scrollCount: 10,
              singleScollDuration: const Duration(milliseconds: 200),
              lastDuration: const Duration(milliseconds: 1000),
            ),
            const Spacer(),
          ],
        ),
      ),
    );
  }
}

示例说明

  • 在主页面中,我们创建了四个 CountingAnimation 小部件,每个小部件展示了不同的格式和动画设置。
  • 点击浮动按钮会增加显示的数值,并重新初始化动画。
  • useChar 属性用于控制是否包含非动画字符。
  • scrollCountsingleScrollDuration 控制动画的速度和步数。

通过这些示例,您可以看到如何灵活地使用 number_counting_animation 插件来增强您的应用体验。希望这对您有所帮助!


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用number_counting_animation插件来实现数字计数动画的示例代码。

首先,确保你已经在pubspec.yaml文件中添加了number_counting_animation依赖项:

dependencies:
  flutter:
    sdk: flutter
  number_counting_animation: ^x.y.z  # 请将x.y.z替换为当前最新版本号

然后,运行flutter pub get来获取依赖项。

接下来,在你的Dart文件中,你可以这样使用NumberCountingAnimation

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Number Counting Animation Demo'),
        ),
        body: Center(
          child: NumberCountingAnimationWidget(
            fromNumber: 0,
            toNumber: 1000,
            duration: Duration(seconds: 2), // 动画持续时间
            size: 50.0, // 数字字体大小
            color: Colors.blue, // 数字颜色
            style: TextStyle(fontWeight: FontWeight.bold), // 数字样式
            onCompleted: () {
              // 动画完成后的回调
              print('Animation completed!');
            },
          ),
        ),
      ),
    );
  }
}

// 自定义NumberCountingAnimationWidget,用于封装NumberCountingAnimation
class NumberCountingAnimationWidget extends StatefulWidget {
  final double fromNumber;
  final double toNumber;
  final Duration duration;
  final double size;
  final Color color;
  final TextStyle style;
  final VoidCallback onCompleted;

  NumberCountingAnimationWidget({
    required this.fromNumber,
    required this.toNumber,
    required this.duration,
    required this.size,
    required this.color,
    required this.style,
    this.onCompleted,
  });

  @override
  _NumberCountingAnimationWidgetState createState() => _NumberCountingAnimationWidgetState();
}

class _NumberCountingAnimationWidgetState extends State<NumberCountingAnimationWidget> with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: widget.duration,
      vsync: this,
    )..repeat(reverse: true); // 可以设置为repeat(reverse: true)来循环播放动画,或者只使用forward()播放一次

    _animation = Tween<double>(begin: widget.fromNumber, end: widget.toNumber).animate(_controller);

    _controller.addListener(() {
      setState(() {}); // 在动画值改变时调用setState来刷新UI
    });

    _controller.addStatusListener((status) {
      if (status == AnimationStatus.completed) {
        widget.onCompleted?.call(); // 动画完成后调用回调
      }
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return AnimatedBuilder(
      animation: _animation,
      child: Text('${_animation.value.toInt()}', style: widget.style.copyWith(color: widget.color, fontSize: widget.size)),
      builder: (context, child) {
        return child!;
      },
    );
  }
}

在这个示例中,我们创建了一个自定义的NumberCountingAnimationWidget,它封装了NumberCountingAnimation的逻辑(虽然number_counting_animation插件可能本身已经提供了类似的组件,但这里为了演示如何手动实现,我们做了封装)。

注意:

  1. NumberCountingAnimation插件可能有自己更简便的API来创建计数动画,这里我们为了展示原理,手动封装了一个类似功能的组件。
  2. AnimatedBuilder用于监听动画值的变化并更新UI。
  3. AnimationControllerTween用于控制动画的持续时间和数值范围。

你可以根据number_counting_animation插件的实际API调整上述代码,以使用插件提供的功能。如果插件有文档,请查阅文档以获取更多详细信息和示例。

回到顶部