Flutter动画计数插件animated_flip_counter的使用

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

Flutter动画计数插件animated_flip_counter的使用

animated_flip_counter 是一个隐式动画小部件,可以在数字之间进行翻转动画。它对于显示不断变化的信息非常有用。

使用方法

Animated Counter

通过传递 value 参数和可选的 duration(持续时间)以及 curve(曲线),就像其他Flutter中的隐式动画小部件一样简单。

AnimatedFlipCounter(
  duration: Duration(milliseconds: 500),
  value: _value, // 传递一个值,例如2014
)

Decimal Display

使用 fractionDigits 参数指定在小数点后显示多少位数字。它可以处理负值。

AnimatedFlipCounter(
  value: _value,
  fractionDigits: 2, // 小数精度
  suffix: "%",
  textStyle: TextStyle(
      fontSize: 40,
      color: _value >= 0 ? Colors.green : Colors.red,
  ),
)

Custom Style

使用熟悉的 TextStyle 参数进行样式设置,并使用 prefixsuffix 添加额外文本。

AnimatedFlipCounter(
  value: _value,
  prefix: "Level ",
  textStyle: TextStyle(
    fontSize: 80,
    fontWeight: FontWeight.bold,
    letterSpacing: -8.0,
    color: Colors.yellow,
    shadows: [
      BoxShadow(
        color: Colors.orange,
        offset: Offset(8, 8),
        blurRadius: 8,
      ),
    ],
  ),
)

示例Demo

下面是一个完整的示例代码,展示了如何在Flutter应用中使用 AnimatedFlipCounter

import 'package:animated_flip_counter/animated_flip_counter.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(
      home: MyHomePage(),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  double _value = 0.0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('AnimatedFlipCounter Demo'),
      ),
      body: Scrollbar(
        child: ListView(
          children: [
            AnimatedFlipCounter(
              value: _value,
            ),
            AnimatedFlipCounter(
              value: 10000000 + _value,
              fractionDigits: 2,
              wholeDigits: 8,
              hideLeadingZeroes: true,
              thousandSeparator: ',',
            ),
            AnimatedFlipCounter(
              value: 10000000 + _value,
              fractionDigits: 2,
              wholeDigits: 8,
              hideLeadingZeroes: true,
            ),
            AnimatedFlipCounter(
              value: 10000000 + _value,
              fractionDigits: 2,
              thousandSeparator: ',',
            ),
            AnimatedFlipCounter(
              value: 10000000 + _value,
              fractionDigits: 2,
            ),
            AnimatedFlipCounter(
              value: _value,
              duration: const Duration(seconds: 1),
              padding: const EdgeInsets.all(8),
              curve: Curves.elasticOut,
              wholeDigits: 4,
              fractionDigits: 2,
              hideLeadingZeroes: true,
              thousandSeparator: ',',
              textStyle: const TextStyle(fontSize: 32, color: Colors.purple),
            ),
            AnimatedFlipCounter(
              value: _value,
              duration: const Duration(seconds: 1),
              curve: Curves.bounceOut,
              wholeDigits: 4,
              fractionDigits: 2,
              thousandSeparator: ',',
              textStyle: const TextStyle(fontSize: 32, color: Colors.blue),
            ),
            AnimatedFlipCounter(
              value: _value,
              // 使用 "infix" 在负号和数字之间显示值
              infix: ' \$',
              fractionDigits: 2,
              wholeDigits: 8,
              hideLeadingZeroes: true,
              // 某些语言如法语使用逗号作为小数分隔符
              decimalSeparator: ',',
              thousandSeparator: '.',
              padding: const EdgeInsets.all(8),
              textStyle: TextStyle(
                fontSize: 48,
                fontWeight: FontWeight.bold,
                letterSpacing: -8.0,
                color: _value < 0 ? Colors.red : Colors.green,
                shadows: const [
                  BoxShadow(
                    color: Colors.yellow,
                    offset: Offset(2, 4),
                    blurRadius: 4,
                  ),
                ],
              ),
            ),
            AnimatedFlipCounter(
              value: (_value * 10000) + 0.48,
              fractionDigits: 2,
              wholeDigits: 8,
              hideLeadingZeroes: true,
              thousandSeparator: ',',
            ),
            const Padding(
              padding: EdgeInsets.all(16),
              child: Divider(),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [0.01, 0.48, 1, 5, 400].map(_buildButtons).toList(),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildButtons(num value) {
    return Column(
      children: [
        ElevatedButton(
          child: Text('+$value'),
          onPressed: () => setState(() => _value += value),
        ),
        const SizedBox(height: 8),
        ElevatedButton(
          child: Text('-$value'),
          onPressed: () => setState(() => _value -= value),
        ),
      ],
    );
  }
}

这个示例展示了如何使用 AnimatedFlipCounter 来创建动态更新的计数器,并且可以调整其样式、格式和动画效果。通过点击按钮,你可以增加或减少计数器的值,观察到平滑的翻转动画效果。


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

1 回复

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


当然,下面是一个关于如何使用 animated_flip_counter 插件的 Flutter 代码示例。这个插件允许你创建一个带有动画效果的数字计数器。

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

dependencies:
  flutter:
    sdk: flutter
  animated_flip_counter: ^x.y.z  # 替换为最新版本号

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

接下来,你可以在你的 Dart 文件中使用 AnimatedFlipCounter 组件。以下是一个完整的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Animated Flip Counter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Animated Flip Counter Demo'),
        ),
        body: Center(
          child: FlipCounterDemo(),
        ),
      ),
    );
  }
}

class FlipCounterDemo extends StatefulWidget {
  @override
  _FlipCounterDemoState createState() => _FlipCounterDemoState();
}

class _FlipCounterDemoState extends State<FlipCounterDemo> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        AnimatedFlipCounter(
          value: _counter,
          duration: Duration(milliseconds: 500), // 动画持续时间
          size: 50.0, // 数字字体大小
          textStyle: TextStyle(color: Colors.black, fontWeight: FontWeight.bold), // 数字样式
        ),
        SizedBox(height: 20.0),
        ElevatedButton(
          onPressed: _incrementCounter,
          child: Text('Increment'),
        ),
      ],
    );
  }
}

在这个示例中,我们做了以下工作:

  1. 导入必要的包,包括 flutter/material.dartanimated_flip_counter/animated_flip_counter.dart
  2. 创建一个简单的 Flutter 应用,其中包含一个 AnimatedFlipCounter 组件和一个按钮。
  3. 使用 AnimatedFlipCounter 组件来显示计数器值,并设置了一些属性,如动画持续时间 (duration)、字体大小 (size) 和文本样式 (textStyle)。
  4. 创建一个按钮来增加计数器的值,并通过调用 setState 方法来刷新界面。

当你运行这个应用并点击按钮时,AnimatedFlipCounter 组件会以动画形式显示新的计数器值。

回到顶部