欢迎访问宙启技术站
智能推送

使用Flutter怎么实现一个进度条效果

发布时间:2023-05-17 08:29:32

Flutter 是一款强大的移动应用开发框架,它提供了大量内置组件,并可以扩展自定义组件来帮助开发者创建美观和高效的应用程序。其中,进度条组件是非常常见的,它可以用于显示任务的完成度和预计剩余时间,让用户了解任务进展情况。本文将介绍使用 Flutter 实现进度条的方法。

一、进度条的结构

在 Flutter 中,进度条是一个非常简单的组件,它由一个居中的进度指示器和可选的进度百分比文本组成。有两种基本的进度条类型,一种是线性进度条,另一种是圆形进度条。下面让我们分别介绍这两种进度条的实现方法。

二、线性进度条的实现

1. 创建线性进度条

创建一个线性进度条非常简单,只需要使用 LinearProgressIndicator 组件即可:

LinearProgressIndicator()

这个组件会默认显示一个蓝色的进度条,如下图所示:

![linear1](https://user-images.githubusercontent.com/34699922/133035009-07e3e342-50c8-48e9-bc70-32d2d4e7bddc.png)

2. 自定义线性进度条

如果我们需要自定义线性进度条的样式,可以使用 LinearProgressIndicator 的一些属性和构造函数来进行定制化:

LinearProgressIndicator(
    value: 0.8,                  // 进度条的实际进度
    backgroundColor: Colors.grey,// 进度条的背景颜色
    valueColor: AlwaysStoppedAnimation<Color>(Colors.red),  // 进度条的颜色
    minHeight: 10,              // 进度条的最小高度
    semanticsLabel: 'Loading',  // 辅助功能的标签
)

这里介绍几个常用的属性:

- value:进度条的实际进度值,范围为 0.0 到 1.0,默认值为 null。

- backgroundColor:进度条的背景颜色,默认为 Colors.transparent。

- valueColor:进度条的颜色,使用 AlwaysStoppedAnimation 控制进度条颜色的渐变,可以使用自定义的颜色。

- minHeight:进度条的最小高度。

- semanticsLabel:为了帮助屏幕阅读器用户理解进度条的作用,可以使用语义标签。

3. 实现线性进度条动画

Flutter 提供了非常简单的方法来实现进度条的动画,可以让进度值实时变化,呈现出一种流畅的渐变效果。使用 Tween 动画对象可以在有限的时间内逐步地从初始值转换为最终值。下面是一个简单示例:

class LinearProgressBar extends StatefulWidget {
  @override
  _LinearProgressBarState createState() => _LinearProgressBarState();
}

class _LinearProgressBarState extends State<LinearProgressBar>  with SingleTickerProviderStateMixin {
  AnimationController animationController;
  Animation<double> animation;

  @override
  void initState() {
    super.initState();
    animationController = AnimationController(vsync: this, duration: Duration(seconds: 2));
    animation = Tween<double>(begin: 0, end: 1).animate(animationController)..addListener(() {
      setState(() {
        // 更新进度值
      });
    });
    animationController.repeat();
  }

  @override
  Widget build(BuildContext context) {
    return LinearProgressIndicator(value: animation.value,);
  }

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

以上代码中,我们创建了一个 AnimationController 对象,并将其与 Tween 对象组合进行了初始化,初始化后通过调用 animation.addListener 方法进行刷新,实现进度条动画。最后,通过 LinearProgressIndicator 组件将进度值传递给它,这样进度条就可以按照特定的步骤变化。

三、圆形进度条的实现

Flutter 提供了 CirculaProgressIndicator 组件来实现圆形进度条。同样的,可以使用构造函数或属性来自定义它的样式。下面介绍一下如何在 Flutter 中实现这个圆形进度条:

1. 创建圆形进度条

要创建一个圆形进度条,只需使用 CircularProgressIndicator 组件即可:

CircularProgressIndicator()

这个组件会默认显示一个蓝色的圆圈进度条,如下图所示:

![circular_1](https://user-images.githubusercontent.com/34699922/133035067-834a59a6-c375-495f-aa36-319bdd003bdf.png)

2. 自定义圆形进度条

同样的,可以使用 CircularProgressIndicator 的一些属性和构造函数来进行样式的自定义:

CircularProgressIndicator(
    value: 0.8,                      // 进度条的实际进度
    backgroundColor: Colors.grey,    // 进度条的背景颜色
    valueColor: AlwaysStoppedAnimation<Color>(Colors.red),  // 进度条的颜色
    strokeWidth: 5.0,               // 进度条的宽度
    semanticsLabel: 'Loading',      // 辅助功能的标签
)

其中极有可能的常用属性与线性进度条类似,不做过多说明。

3. 用动画实现圆形进度条

要在 Flutter 中实现圆形进度条的动画,我们需要使用 Tween 动画创建一个 AnimationController 对象,然后将它与 CircularProgressIndicator 组件配合使用,这样就能够控制进度条的渐变效果。接下来看一下这个动画是如何实现的:

class CircularProgressBar extends StatefulWidget {
  @override
  _CircularProgressBarState createState() => _CircularProgressBarState();
}

class _CircularProgressBarState extends State<CircularProgressBar>  with SingleTickerProviderStateMixin {
  AnimationController animationController;
  Animation<double> animation;

  @override
  void initState() {
    super.initState();
    animationController = AnimationController(vsync: this, duration: Duration(seconds: 2));
    animation = Tween<double>(begin: 0, end: 1).animate(animationController)..addListener(() {
      setState(() {
        // 更新进度值
      });
    });
    animationController.repeat();
  }

  @override
  Widget build(BuildContext context) {
    return CircularProgressIndicator(
      value: animation.value,
      strokeWidth: 5.0,
    );
  }

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

以上代码中,我们创建了一个 AnimationController 对象,并将其与 Tween 对象组合进行了初始化。接下来,为动画对象设置监听器,当进度值发生变化时,会自动调用 setState 来刷新其界面。最后,通过 CircularProgressIndicator 组件将进度值传递给它,这样进度条就可以按照特定的步骤变化。

四、实现环形进度条

除了线性进度条和圆形进度条以外,Flutter 还提供了 CircularPercentIndicator 组件来实现环形进度条。CircularPercentIndicator 组件支持更多自定义属性来呈现环形进度条。与上面两个进度条类似,也需要使用构造函数或属性来自定义其样式。下面介绍一下使用 Flutter 实现环形进度条的方法:

1. 创建环形进度条

要创建 CircularPercentIndicator 组件,请先导入其依赖:

dependencies:
  percent_indicator: ^2.1.2

然后,使用以下方式即可创建环形进度条:

`dart

CircularPercentIndicator(

radius: 100.0, // 圆形进度条的半径

lineWidth: 10.0, // 进度条的宽度

percent: 0.8, // 进度条的实际进度

center: Text("80%"),