61 lines
1.7 KiB
Dart
61 lines
1.7 KiB
Dart
import 'dart:math' as Math;
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_circular_chart/src/animated_circular_chart.dart';
|
|
import 'package:flutter_circular_chart/src/circular_chart.dart';
|
|
import 'package:flutter_circular_chart/src/stack.dart';
|
|
|
|
class AnimatedCircularChartPainter extends CustomPainter {
|
|
AnimatedCircularChartPainter(this.animation) : super(repaint: animation);
|
|
|
|
final Animation<CircularChart> animation;
|
|
|
|
@override
|
|
void paint(Canvas canvas, Size size) {
|
|
_paintChart(canvas, size, animation.value);
|
|
}
|
|
|
|
@override
|
|
bool shouldRepaint(AnimatedCircularChartPainter old) => false;
|
|
}
|
|
|
|
class CircularChartPainter extends CustomPainter {
|
|
CircularChartPainter(this.chart);
|
|
|
|
final CircularChart chart;
|
|
|
|
@override
|
|
void paint(Canvas canvas, Size size) {
|
|
_paintChart(canvas, size, chart);
|
|
}
|
|
|
|
@override
|
|
bool shouldRepaint(CircularChartPainter old) => false;
|
|
}
|
|
|
|
const double _kRadiansPerDegree = Math.PI / 180;
|
|
|
|
void _paintChart(Canvas canvas, Size size, CircularChart chart) {
|
|
final Paint segmentPaint = new Paint()
|
|
..style = chart.chartType == CircularChartType.Radial
|
|
? PaintingStyle.stroke
|
|
: PaintingStyle.fill;
|
|
|
|
for (final CircularChartStack stack in chart.stacks) {
|
|
for (final segment in stack.segments) {
|
|
segmentPaint.color = segment.color;
|
|
segmentPaint.strokeWidth = stack.width;
|
|
canvas.drawArc(
|
|
new Rect.fromCircle(
|
|
center: new Offset(size.width / 2, size.height / 2),
|
|
radius: stack.radius,
|
|
),
|
|
stack.startAngle * _kRadiansPerDegree,
|
|
segment.sweepAngle * _kRadiansPerDegree,
|
|
chart.chartType == CircularChartType.Pie,
|
|
segmentPaint,
|
|
);
|
|
}
|
|
}
|
|
}
|