77 lines
2.3 KiB
Dart
77 lines
2.3 KiB
Dart
|
import 'dart:math';
|
||
|
|
||
|
import 'package:flutter/material.dart';
|
||
|
|
||
|
import 'circular_slider_paint.dart' show CircularSliderMode;
|
||
|
import 'utils.dart';
|
||
|
|
||
|
class SliderPainter extends CustomPainter {
|
||
|
CircularSliderMode mode;
|
||
|
double startAngle;
|
||
|
double endAngle;
|
||
|
double sweepAngle;
|
||
|
Color selectionColor;
|
||
|
Color handlerColor;
|
||
|
double handlerOutterRadius;
|
||
|
bool showRoundedCapInSelection;
|
||
|
bool showHandlerOutter;
|
||
|
double sliderStrokeWidth;
|
||
|
|
||
|
Offset initHandler;
|
||
|
Offset endHandler;
|
||
|
Offset center;
|
||
|
double radius;
|
||
|
|
||
|
SliderPainter({
|
||
|
@required this.mode,
|
||
|
@required this.startAngle,
|
||
|
@required this.endAngle,
|
||
|
@required this.sweepAngle,
|
||
|
@required this.selectionColor,
|
||
|
@required this.handlerColor,
|
||
|
@required this.handlerOutterRadius,
|
||
|
@required this.showRoundedCapInSelection,
|
||
|
@required this.showHandlerOutter,
|
||
|
@required this.sliderStrokeWidth,
|
||
|
});
|
||
|
|
||
|
@override
|
||
|
void paint(Canvas canvas, Size size) {
|
||
|
Paint progress = _getPaint(color: selectionColor);
|
||
|
|
||
|
center = Offset(size.width / 2, size.height / 2);
|
||
|
radius = min(size.width / 2, size.height / 2) - sliderStrokeWidth;
|
||
|
|
||
|
canvas.drawArc(Rect.fromCircle(center: center, radius: radius),
|
||
|
-pi / 2 + startAngle, sweepAngle, false, progress);
|
||
|
|
||
|
Paint handler = _getPaint(color: handlerColor, style: PaintingStyle.fill);
|
||
|
Paint handlerOutter = _getPaint(color: handlerColor, width: 2.0);
|
||
|
|
||
|
// draw handlers
|
||
|
if (mode == CircularSliderMode.doubleHandler) {
|
||
|
initHandler = radiansToCoordinates(center, -pi / 2 + startAngle, radius);
|
||
|
canvas.drawCircle(initHandler, 8.0, handler);
|
||
|
canvas.drawCircle(initHandler, handlerOutterRadius, handlerOutter);
|
||
|
}
|
||
|
|
||
|
endHandler = radiansToCoordinates(center, -pi / 2 + endAngle, radius);
|
||
|
canvas.drawCircle(endHandler, 8.0, handler);
|
||
|
if (showHandlerOutter) {
|
||
|
canvas.drawCircle(endHandler, handlerOutterRadius, handlerOutter);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Paint _getPaint({@required Color color, double width, PaintingStyle style}) =>
|
||
|
Paint()
|
||
|
..color = color
|
||
|
..strokeCap =
|
||
|
showRoundedCapInSelection ? StrokeCap.round : StrokeCap.butt
|
||
|
..style = style ?? PaintingStyle.stroke
|
||
|
..strokeWidth = width ?? sliderStrokeWidth;
|
||
|
|
||
|
@override
|
||
|
bool shouldRepaint(CustomPainter oldDelegate) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|