Flutter动画进度条插件flutter_animated_progress_bar的使用

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

Flutter动画进度条插件flutter_animated_progress_bar的使用

Animated Progress Bar 插件介绍

Animated Progress Bar 是一个用于视频或音频的动画进度条组件,它具有以下特性:

  • ✅ 完全控制动画
  • ✅ 高度可定制化
  • ✅ 边缘不裁剪以呈现现代外观(见音频示例)
  • ✅ 拇指相关组件绘制在所有组件之上,实现炫酷效果(见视频示例)

功能演示

注意:此组件本身并不播放任何媒体!

快速示例

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

  @override
  State<Example> createState() => _ExampleState();
}

class _ExampleState extends State<Example> with TickerProviderStateMixin {
  late final ProgressBarController _controller;

  @override
  void initState() {
    super.initState();
    _controller = ProgressBarController(vsync: this);
  }

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

  @override
  Widget build(BuildContext context) {
    return ProgressBar(
      controller: _controller,
      progress: const Duration(seconds: 30),
      buffered: const Duration(seconds: 35),
      total: const Duration(minutes: 1),
      onSeek: (position) {
        print('New position: $position');
      },
    );
  }
}

使用说明

初始化 ProgressBarController

首先,你需要一个 ProgressBarController 来运行动画。类似于 AnimationController,你需要传递一个 TickerProvider,这可以通过在构造函数中配置 vsync 参数来完成。

class _ExampleState extends State<Example> with TickerProviderStateMixin {...}

然后添加 ProgressBarController

_controller = ProgressBarController(vsync: this);

接下来,添加媒体的 progresstotal 持续时间。你还可以添加媒体的 buffered 位置。

ProgressBar(
    controller: _controller,
    progress: const Duration(seconds: 30),
    buffered: const Duration(seconds: 35),
    total: const Duration(minutes: 1),
    onSeek: (position) {
        print('New position: $position');
    },
);

不要忘记在不再需要时 dispose 控制器。

自定义 ProgressBarController

你可以通过以下方式自定义动画的持续时间:

_controller = ProgressBarController(
      vsync: this,
      barAnimationDuration: const Duration(milliseconds: 300),
      thumbAnimationDuration: const Duration(milliseconds: 200),
      waitingDuration: const Duration(seconds: 3),
    );

如果你想要更进一步,控制器提供了对动画的完全控制:

_controller.forward();                      // 展开进度条,等待然后收缩。
_controller.expandBar();                    // 展开进度条。
_controller.collapseBar();                  // 收缩进度条。
_controller.stopBarAnimation();             // 停止进度条动画,如果正在运行。

_controller.expandThumb();                  // 展开拇指。
_controller.collapseThumb();                // 收缩拇指。
_controller.stopThumbAnimation();           // 停止拇指动画,如果正在运行。

_controller.expandBar(                      // 使用自定义持续时间和曲线展开进度条。
  duration: const Duration(seconds:1),      
  curve: Curves.easeIn,
);

这些启动动画的方法返回一个 TickerFuture 对象,当动画成功完成时会完成。这意味着你可以 await 它们以确保动画完成。

进度条自定义参数

你可以通过以下参数自定义 ProgressBar

参数 类型 描述
alignment ProgressBarAlignment 进度条相对于其总大小的对齐方式
barCapShape BarCapShape 左右边缘的形状
progressBarIndicator ProgressBarIndicator 要绘制的指示器
collapsedBarHeight double 进度条的最小高度
collapsedThumbRadius double 拇指的最小半径
expandedBarHeight double 进度条的最大高度
expandedThumbRadius double 拇指的最大半径
thumbGlowRadius double 拇指周围的光晕半径
thumbElevation double 拇头周围的阴影大小
thumbGlowColor Color 拇指周围光晕的颜色
backgroundBarColor Color 背景进度条的颜色
collapsedProgressBarColor Color 折叠后的进度条颜色
collapsedBufferedBarColor Color 折叠后的缓冲进度条颜色
collapsedThumbColor Color 折叠后的拇指颜色
expandedProgressBarColor Color? 展开后的进度条颜色
expandedBufferedBarColor Color? 展开后的缓冲进度条颜色
expandedThumbColor Color? 展开后的拇指颜色
lerpColorsTransition bool 在折叠和展开状态之间转换时是否线性插值颜色
showBufferedWhenCollapsed bool 折叠时是否显示缓冲进度条

要快速尝试所有这些功能,请查看 Playground

示例代码

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

void main() {
  runApp(const MaterialApp(home: AnimatedProgressBarExample()));
}

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

  @override
  State<AnimatedProgressBarExample> createState() => _AnimatedProgressBarExampleState();
}

class _AnimatedProgressBarExampleState extends State<AnimatedProgressBarExample> with TickerProviderStateMixin {
  late final ProgressBarController _controller;

  @override
  void initState() {
    super.initState();
    _controller = ProgressBarController(vsync: this);
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Animated Progress Bar Example')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ProgressBar(
              controller: _controller,
              progress: const Duration(seconds: 30),
              buffered: const Duration(seconds: 35),
              total: const Duration(minutes: 1),
              onSeek: (position) {
                print('New position: $position');
              },
            ),
            ElevatedButton(
              onPressed: () {
                _controller.forward();
              },
              child: const Text('Start Animation'),
            ),
            ElevatedButton(
              onPressed: () {
                _controller.stopBarAnimation();
              },
              child: const Text('Stop Animation'),
            ),
          ],
        ),
      ),
    );
  }
}

以上代码展示了如何创建一个包含动画进度条的应用,并通过按钮控制动画的开始和停止。希望这对您有所帮助!如果有任何问题或建议,请随时反馈。


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

1 回复

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


当然,下面是一个使用 flutter_animated_progress_bar 插件来创建动画进度条的示例代码。这个插件允许你以多种方式展示进度条,并且支持高度自定义。

首先,确保在你的 pubspec.yaml 文件中添加 flutter_animated_progress_bar 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_animated_progress_bar: ^1.0.7  # 请确保使用最新版本

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

接下来是一个完整的 Flutter 应用示例,展示了如何使用 flutter_animated_progress_bar

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Animated Progress Bar Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ProgressBarScreen(),
    );
  }
}

class ProgressBarScreen extends StatefulWidget {
  @override
  _ProgressBarScreenState createState() => _ProgressBarScreenState();
}

class _ProgressBarScreenState extends State<ProgressBarScreen> with SingleTickerProviderStateMixin {
  double _progress = 0.0;

  @override
  void initState() {
    super.initState();
    _animateProgress();
  }

  void _animateProgress() {
    Future.delayed(Duration(seconds: 5), () {
      setState(() {
        _progress = 1.0;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animated Progress Bar Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            AnimatedProgressBar(
              progress: _progress,
              animationDuration: 2000,
              width: double.infinity,
              padding: EdgeInsets.symmetric(vertical: 10.0),
              borderRadius: 25.0,
              backgroundColor: Colors.grey[300]!,
              progressColor: Colors.blue,
              autoStart: true,
            ),
            SizedBox(height: 20.0),
            Text(
              'Progress: ${(_progress * 100).toInt()}%',
              style: TextStyle(fontSize: 20),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 依赖添加:在 pubspec.yaml 文件中添加 flutter_animated_progress_bar 依赖。
  2. 主应用结构:使用 MaterialAppScaffold 创建一个基本的 Flutter 应用结构。
  3. 状态管理:使用 StatefulWidgetSingleTickerProviderStateMixin 来管理进度条的状态。
  4. 动画启动:在 initState 方法中,使用 Future.delayed 来模拟一个异步任务,并在 5 秒后将进度更新为 1.0。
  5. 进度条组件:使用 AnimatedProgressBar 组件,并传递必要的参数如 progressanimationDurationwidthpaddingborderRadiusbackgroundColorprogressColor
  6. 显示进度:使用 Text 组件来显示当前的进度百分比。

运行这个示例代码,你将看到一个从 0% 到 100% 的动画进度条,并在 5 秒内完成进度。

这个示例展示了 flutter_animated_progress_bar 插件的基本用法,你可以根据需要进一步自定义和扩展。

回到顶部