Flutter圆形进度指示器插件circular的使用

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

Flutter圆形进度指示器插件circular的使用

简介

circular_slider 是一个用于Flutter应用中的圆形滑块和查看器插件。它允许用户在特定范围内选择值,并以圆形滑块的形式显示这些值。

示例GIF

特性

  • 在特定范围内选择值
  • 以圆形滑块形式显示值

开始使用

添加包

首先,在您的 pubspec.yaml 文件中添加 circular 包:

flutter pub add circular

导入包

在需要使用的 Dart 文件中导入该包:

import 'package:circular/circular.dart';

使用方法

圆形滑块 (Circular Slider)

CircularSlider(
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(200),
    boxShadow: const [
      BoxShadow(
          offset: Offset(-10, -10),
          color: Colors.white,
          blurRadius: 20,
          spreadRadius: 1),
      BoxShadow(
          offset: Offset(10, 10),
          color: Color.fromARGB(255, 158, 158, 158),
          blurRadius: 20,
          spreadRadius: 1)
    ]),
  maxValue: 100,
  radius: 100,
  child: Text(
    value.toString(),
    style: TextStyle(fontSize: 30),
  ),
  color: Color(0xffEEEEEE),
  sliderColor: Color(0xff62CBDA),
  unSelectedColor: Color(0xffD7DEE7),
  onDrag: (value) {
    setState(() {
      this.value = value;
    });
  },
)

圆形查看器 (Circular Viewer)

CircularViewer(
  decoration: BoxDecoration(
      borderRadius: BorderRadius.circular(200),
      boxShadow: const [
        BoxShadow(
            offset: Offset(-10, -10),
            color: Colors.white,
            blurRadius: 20,
            spreadRadius: 1),
        BoxShadow(
            offset: Offset(10, 10),
            color: Color.fromARGB(255, 158, 158, 158),
            blurRadius: 20,
            spreadRadius: 1)
      ]),
  value: 50,
  maxValue: 100,
  radius: 100,
  textStyle: TextStyle(fontSize: 30),
  color: Color(0xffEEEEEE),
  sliderColor: Color(0xff62CBDA),
  unSelectedColor: Color(0xffD7DEE7),
)

完整示例代码

以下是一个完整的示例代码,展示了如何使用 CircularSliderCircularViewer

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

void main() {
  runApp(const MaterialApp(
    debugShowCheckedModeBanner: false,
    home: Scaffold(body: Center(child: Home())),
  ));
}

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

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  int angle = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Container(
          color: const Color(0xffEEEEEE),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [
              SizedBox(
                width: 200, //! 这个宽度不应小于
                height: 200,
                child: CircularSlider(
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(200),
                      boxShadow: const [
                        BoxShadow(
                            offset: Offset(-10, -10),
                            color: Colors.white,
                            blurRadius: 20,
                            spreadRadius: 1),
                        BoxShadow(
                            offset: Offset(10, 10),
                            color: Color.fromARGB(255, 158, 158, 158),
                            blurRadius: 20,
                            spreadRadius: 1)
                      ]),
                  maxValue: 100,
                  radius: 100, //! 这个值乘以2 (SizedBox的宽高 >= 半径 * 2)
                  child: Text(
                    angle.toString(),
                    style: const TextStyle(fontSize: 30),
                  ),
                  color: const Color(0xffEEEEEE),
                  sliderColor: const Color(0xff62CBDA),
                  unSelectedColor: const Color(0xffD7DEE7),
                  onDrag: (angle) {
                    setState(() {
                      this.angle = angle;
                    });
                  },
                ),
              ),
              CircularViewer(
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(200),
                    boxShadow: const [
                      BoxShadow(
                          offset: Offset(-10, -10),
                          color: Colors.white,
                          blurRadius: 20,
                          spreadRadius: 1),
                      BoxShadow(
                          offset: Offset(10, 10),
                          color: Color.fromARGB(255, 158, 158, 158),
                          blurRadius: 20,
                          spreadRadius: 1)
                    ]),
                value: 50,
                maxValue: 100,
                radius: 100,
                textStyle: const TextStyle(fontSize: 30),
                color: const Color(0xffEEEEEE),
                sliderColor: const Color(0xff62CBDA),
                unSelectedColor: const Color(0xffD7DEE7),
              )
            ],
          ),
          alignment: Alignment.center,
        ),
      ),
    );
  }
}

额外信息

  • 故事: 作者在制作了魔幻圆圈后,决定将其功能化,因此创建了这个包。
  • 贡献: 欢迎任何贡献!
  • 许可证: MIT LICENSE

希望这篇指南能帮助您快速上手并使用 circular_slider 插件。如果您有任何问题或建议,请随时联系开发者或在GitHub上提交问题。


更多关于Flutter圆形进度指示器插件circular的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter圆形进度指示器插件circular的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用circular_progress_indicator插件来创建圆形进度指示器的示例代码。请注意,circular_progress_indicator是一个假定的插件名称,因为在Flutter的官方插件库中,通常使用circular_progress_bar或者通过自定义绘制来实现类似的功能。不过,为了符合你的要求,我会展示一个自定义圆形进度指示器的代码示例。

首先,你需要在你的pubspec.yaml文件中添加依赖(虽然这里我们自定义实现,但通常插件的使用会需要这一步):

dependencies:
  flutter:
    sdk: flutter
  # 如果有相关插件,会在这里添加,例如:
  # circular_progress_indicator: ^x.y.z

然后,在你的Flutter项目中创建一个自定义的圆形进度指示器。以下是一个简单的实现:

import 'package:flutter/material.dart';
import 'dart:math' as math;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Circular Progress Indicator'),
        ),
        body: Center(
          child: CircularProgressIndicatorWidget(
            progress: 0.75, // 设置进度值,0.0 到 1.0 之间
            strokeWidth: 8.0,
            backgroundColor: Colors.grey[300]!,
            progressColor: Colors.blue,
          ),
        ),
      ),
    );
  }
}

class CircularProgressIndicatorWidget extends StatelessWidget {
  final double progress;
  final double strokeWidth;
  final Color backgroundColor;
  final Color progressColor;

  CircularProgressIndicatorWidget({
    required this.progress,
    required this.strokeWidth,
    required this.backgroundColor,
    required this.progressColor,
  });

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      painter: CircularProgressPainter(
        progress: progress,
        strokeWidth: strokeWidth,
        backgroundColor: backgroundColor,
        progressColor: progressColor,
      ),
      size: Size.square(200.0), // 你可以根据需要调整大小
    );
  }
}

class CircularProgressPainter extends CustomPainter {
  final double progress;
  final double strokeWidth;
  final Color backgroundColor;
  final Color progressColor;

  CircularProgressPainter({
    required this.progress,
    required this.strokeWidth,
    required this.backgroundColor,
    required this.progressColor,
  });

  @override
  void paint(Canvas canvas, Size size) {
    final Paint backgroundPaint = Paint()
      ..color = backgroundColor
      ..style = PaintingStyle.stroke
      ..strokeWidth = strokeWidth;

    final Paint progressPaint = Paint()
      ..color = progressColor
      ..style = PaintingStyle.stroke
      ..strokeWidth = strokeWidth
      ..strokeCap = StrokeCap.round;

    final double radius = (size.width - strokeWidth) / 2;
    final Rect rect = Rect.fromCircle(center: Offset(size.width / 2, size.height / 2), radius: radius);

    // 画背景圆
    canvas.drawCircle(rect.center, radius, backgroundPaint);

    // 计算进度圆弧的起始和结束角度(以弧度为单位)
    final double startAngle = -math.pi / 2;
    final double sweepAngle = progress * 2 * math.pi;

    // 画进度圆弧
    canvas.drawArc(rect, startAngle, sweepAngle, false, progressPaint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return oldDelegate != this;
  }
}

在这个示例中,我们创建了一个自定义的CircularProgressIndicatorWidget,它使用CustomPaintCustomPainter来绘制一个圆形的进度指示器。你可以通过调整progressstrokeWidthbackgroundColorprogressColor来定制进度指示器的外观。

这个自定义的圆形进度指示器可以像其他Flutter组件一样在你的应用中使用,只需将其添加到你的widget树中即可。

回到顶部