flutter_circular_chart/lib/src/painter.dart

61 lines
1.7 KiB
Dart
Raw Normal View History

2017-11-02 23:48:58 +00:00
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,
);
}
}
}