Flutter圆形滑块插件flutter_circular_slider的使用
Flutter圆形滑块插件flutter_circular_slider的使用
flutter_circular_slider
一个高度可定制的圆形滑块插件,适用于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
: 双滑块,需要通过拖动来调整两个滑块的位置。
构造函数参数
以下是DoubleCircularSlider
和SingleCircularSlider
的构造函数参数说明:
参数名称 | 默认值 | 描述 |
---|---|---|
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 还会返回圈数。 |
使用场景
完整选择移动
单滑块
圈数
睡眠时间选择
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
更多关于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
组件
CircularSlider
是 flutter_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
: 当滑块的值发生变化时触发的回调函数。它返回两个值:startAngle
和endAngle
,分别表示滑块的起始角度和结束角度。height
和width
: 滑块的高度和宽度。initialAngle
: 滑块的初始角度。endAngle
: 滑块的结束角度。baseColor
: 滑块的背景颜色。selectionColor
: 滑块选中部分的颜色。handlerColor
: 滑块手柄的颜色。handlerOutterRadius
: 滑块手柄的外半径。showRoundedCapInSelection
: 是否在选中部分显示圆角。showHandlerOutter
: 是否显示手柄的外圈。child
: 滑块中心的子组件,通常用于显示文本或其他内容。
5. 运行应用
保存文件并运行应用,你将看到一个圆形滑块。你可以通过拖动滑块来改变其值,并在控制台中看到输出的角度值。
6. 进一步定制
你可以根据需要进一步定制滑块的外观和行为。例如,你可以通过调整 baseColor
、selectionColor
和 handlerColor
来改变滑块的颜色,或者通过调整 height
和 width
来改变滑块的大小。
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)}'),
],
),
),
),
);
}
}