Flutter圆形滑块插件flutter_circular_slider的使用

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

Flutter圆形滑块插件flutter_circular_slider的使用

flutter_circular_slider

Build Status License: MIT Pub

一个高度可定制的圆形滑块插件,适用于Flutter。

开始使用

安装

pubspec.yaml文件中添加以下依赖:

flutter_circular_slider: ^latest_version

然后运行以下命令以安装依赖:

flutter packages get

基本用法

创建一个新的Flutter项目:

flutter create myapp

编辑lib/main.dart文件如下:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.blueGrey,
      body: Center(
        child: Container(
          child: DoubleCircularSlider(
            100,  // 分割数
            0,    // 初始值
            20,   // 结束值
          ),
        ),
      ),
    );
  }
}

此代码中提供了两种不同的选项:

  • SingleCircularSlider: 单个滑块,可以通过拖动或点击来移动。
  • DoubleCircularSlider: 双滑块,需要通过拖动来调整两个滑块的位置。

Basic Slider

构造函数参数

以下是DoubleCircularSliderSingleCircularSlider的构造函数参数说明:

参数名称 默认值 描述
divisions 圆形滑块被分割为多少部分。
init (仅对DoubleCircularSlider)初始选择值,必须大于0且小于divisions
end (仅对DoubleCircularSlider)结束选择值,必须大于0且小于divisions
position (仅对SingleCircularSlider)选择值,必须大于0且小于divisions
height 220.0 滑块画布的高度。
width 220.0 滑块画布的宽度。
primarySectors 0 主扇区数量,绘制在selectionColor颜色上。
secondarySectors 0 次要扇区数量,绘制在baseColor颜色上。
child null 显示在滑块中心的小部件。
onSelectionChange 每次用户交互时触发,返回初始值、结束值以及圈数。
onSelectionEnd 用户完成一次交互时触发。
baseColor Color.fromRGBO(255, 255, 255, 0.1) 滑块基础颜色。
selectionColor Color.fromRGBO(255, 255, 255, 0.3) 滑块选中区域的颜色。
handlerColor Colors.white 滑块控制柄的颜色。
handlerOutterRadius 12.0 控制柄外圈半径。
showRoundedCapInSelection false 是否在非控制柄区域显示圆角。
showHandlerOutter true 是否显示控制柄外圈。
sliderStrokeWidth 12.0 滑块线条宽度(厚度)。
shouldCountLaps false 如果为true,则onSelectionChange还会返回圈数。

使用场景

完整选择移动

Move Selection

单滑块

Single Slider

圈数

Single Slider Laps Double Slider Laps

睡眠时间选择
import 'dart:math';

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        body: SafeArea(
      child: Container(
          decoration: BoxDecoration(
            image: DecorationImage(
              image: AssetImage('images/background_morning.png'),
              fit: BoxFit.cover,
            ),
          ),
          child: SleepPage()),
    ));
  }
}

class SleepPage extends StatefulWidget {
  [@override](/user/override)
  _SleepPageState createState() => _SleepPageState();
}

class _SleepPageState extends State<SleepPage> {
  final baseColor = Color.fromRGBO(255, 255, 255, 0.3);

  int initTime;
  int endTime;

  int inBedTime;
  int outBedTime;

  [@override](/user/override)
  void initState() {
    super.initState();
    _shuffle();
  }

  void _shuffle() {
    setState(() {
      initTime = _generateRandomTime();
      endTime = _generateRandomTime();
      inBedTime = initTime;
      outBedTime = endTime;
    });
  }

  void _updateLabels(int init, int end) {
    setState(() {
      inBedTime = init;
      outBedTime = end;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        Text(
          'How long did you stay in bed?',
          style: TextStyle(color: Colors.white),
        ),
        DoubleCircularSlider(
          288,
          initTime,
          endTime,
          height: 260.0,
          width: 260.0,
          primarySectors: 6,
          secondarySectors: 24,
          baseColor: Color.fromRGBO(255, 255, 255, 0.1),
          selectionColor: baseColor,
          handlerColor: Colors.white,
          handlerOutterRadius: 12.0,
          onSelectionChange: _updateLabels,
          sliderStrokeWidth: 12.0,
          child: Padding(
            padding: const EdgeInsets.all(42.0),
            child: Center(
                child: Text('${_formatIntervalTime(inBedTime, outBedTime)}',
                    style: TextStyle(fontSize: 36.0, color: Colors.white))),
          ),
        ),
        Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
          _formatBedTime('IN THE', inBedTime),
          _formatBedTime('OUT OF', outBedTime),
        ]),
        FlatButton(
          child: Text('S H U F F L E'),
          color: baseColor,
          textColor: Colors.white,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(50.0),
          ),
          onPressed: _shuffle,
        ),
      ],
    );
  }

  Widget _formatBedTime(String pre, int time) {
    return Column(
      children: [
        Text(pre, style: TextStyle(color: baseColor)),
        Text('BED AT', style: TextStyle(color: baseColor)),
        Text(
          '${_formatTime(time)}',
          style: TextStyle(color: Colors.white),
        )
      ],
    );
  }

  String _formatTime(int time) {
    if (time == 0 || time == null) {
      return '00:00';
    }
    var hours = time ~/ 12;
    var minutes = (time % 12) * 5;
    return '$hours:$minutes';
  }

  String _formatIntervalTime(int init, int end) {
    var sleepTime = end > init ? end - init : 288 - init + end;
    var hours = sleepTime ~/ 12;
    var minutes = (sleepTime % 12) * 5;
    return '${hours}h${minutes}m';
  }

  int _generateRandomTime() => Random().nextInt(288);
}

更多关于Flutter圆形滑块插件flutter_circular_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter圆形滑块插件flutter_circular_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_circular_slider 是一个用于在 Flutter 应用中创建圆形滑块的插件。它允许用户通过拖动滑块来选择值,通常用于选择角度、时间、百分比等。以下是如何使用 flutter_circular_slider 插件的详细步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_circular_slider 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_circular_slider: ^2.0.0

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入 flutter_circular_slider 插件:

import 'package:flutter_circular_slider/flutter_circular_slider.dart';

3. 使用 CircularSlider 组件

CircularSliderflutter_circular_slider 插件中的主要组件。你可以通过配置不同的参数来自定义滑块的外观和行为。

以下是一个简单的示例,展示如何使用 CircularSlider

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Circular Slider Example'),
        ),
        body: Center(
          child: CircularSlider(
            onSelectionChange: (double startAngle, double endAngle) {
              print('Start Angle: $startAngle, End Angle: $endAngle');
            },
            height: 200.0,
            width: 200.0,
            initialAngle: 0.0,
            endAngle: 180.0,
            baseColor: Colors.grey[300],
            selectionColor: Colors.blue,
            handlerColor: Colors.blue[700],
            handlerOutterRadius: 12.0,
            showRoundedCapInSelection: true,
            showHandlerOutter: true,
            child: Text(
              'Select Angle',
              style: TextStyle(fontSize: 16.0),
            ),
          ),
        ),
      ),
    );
  }
}

4. 参数说明

CircularSlider 组件提供了多个参数来定制滑块的外观和行为。以下是一些常用参数的说明:

  • onSelectionChange: 当滑块的值发生变化时触发的回调函数。它返回两个值:startAngleendAngle,分别表示滑块的起始角度和结束角度。
  • heightwidth: 滑块的高度和宽度。
  • initialAngle: 滑块的初始角度。
  • endAngle: 滑块的结束角度。
  • baseColor: 滑块的背景颜色。
  • selectionColor: 滑块选中部分的颜色。
  • handlerColor: 滑块手柄的颜色。
  • handlerOutterRadius: 滑块手柄的外半径。
  • showRoundedCapInSelection: 是否在选中部分显示圆角。
  • showHandlerOutter: 是否显示手柄的外圈。
  • child: 滑块中心的子组件,通常用于显示文本或其他内容。

5. 运行应用

保存文件并运行应用,你将看到一个圆形滑块。你可以通过拖动滑块来改变其值,并在控制台中看到输出的角度值。

6. 进一步定制

你可以根据需要进一步定制滑块的外观和行为。例如,你可以通过调整 baseColorselectionColorhandlerColor 来改变滑块的颜色,或者通过调整 heightwidth 来改变滑块的大小。

7. 处理滑块值

你可以通过 onSelectionChange 回调函数来处理滑块的值。例如,你可以将滑块的值显示在界面上,或者根据滑块的值执行某些操作。

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  double startAngle = 0.0;
  double endAngle = 180.0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Circular Slider Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              CircularSlider(
                onSelectionChange: (double start, double end) {
                  setState(() {
                    startAngle = start;
                    endAngle = end;
                  });
                },
                height: 200.0,
                width: 200.0,
                initialAngle: startAngle,
                endAngle: endAngle,
                baseColor: Colors.grey[300],
                selectionColor: Colors.blue,
                handlerColor: Colors.blue[700],
                handlerOutterRadius: 12.0,
                showRoundedCapInSelection: true,
                showHandlerOutter: true,
                child: Text(
                  'Select Angle',
                  style: TextStyle(fontSize: 16.0),
                ),
              ),
              SizedBox(height: 20.0),
              Text('Start Angle: ${startAngle.toStringAsFixed(1)}'),
              Text('End Angle: ${endAngle.toStringAsFixed(1)}'),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!