Skip to content

Commit d01a8b5

Browse files
imaNNeoezmegy
authored andcommitted
Implemented auto calculate interval function, and used for titles, and grid lines, it prevents performance issues, like imaNNeo#101, imaNNeo#322.
1 parent 4b836c7 commit d01a8b5

File tree

9 files changed

+168
-32
lines changed

9 files changed

+168
-32
lines changed

lib/src/chart/bar_chart/bar_chart_painter.dart

+6-2
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,8 @@ class BarChartPainter extends AxisChartPainter<BarChartData> with TouchHandler<B
284284

285285
// Left Titles
286286
final leftTitles = targetData.titlesData.leftTitles;
287+
final leftInterval =
288+
leftTitles.interval ?? getEfficientInterval(viewSize.height, data.verticalDiff);
287289
if (leftTitles.showTitles) {
288290
double verticalSeek = data.minY;
289291
while (verticalSeek <= data.maxY) {
@@ -309,12 +311,14 @@ class BarChartPainter extends AxisChartPainter<BarChartData> with TouchHandler<B
309311
tp.paint(canvas, Offset(x, y));
310312
canvas.restore();
311313

312-
verticalSeek += leftTitles.interval;
314+
verticalSeek += leftInterval;
313315
}
314316
}
315317

316318
// Right Titles
317319
final rightTitles = targetData.titlesData.rightTitles;
320+
final rightInterval =
321+
rightTitles.interval ?? getEfficientInterval(viewSize.height, data.verticalDiff);
318322
if (rightTitles.showTitles) {
319323
double verticalSeek = data.minY;
320324
while (verticalSeek <= data.maxY) {
@@ -340,7 +344,7 @@ class BarChartPainter extends AxisChartPainter<BarChartData> with TouchHandler<B
340344
tp.paint(canvas, Offset(x, y));
341345
canvas.restore();
342346

343-
verticalSeek += rightTitles.interval;
347+
verticalSeek += rightInterval;
344348
}
345349
}
346350

lib/src/chart/base/axis_chart/axis_chart_data.dart

+14-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:fl_chart/src/chart/base/axis_chart/axis_chart_painter.dart';
66
import 'package:fl_chart/src/chart/base/base_chart/base_chart_data.dart';
77
import 'package:fl_chart/src/utils/lerp.dart';
88
import 'package:flutter/material.dart';
9+
import 'package:fl_chart/src/utils/utils.dart';
910

1011
/// This is the base class for axis base charts data
1112
/// that contains a [FlGridData] that holds data for showing grid lines,
@@ -27,6 +28,12 @@ abstract class AxisChartData extends BaseChartData with EquatableMixin {
2728
/// A background color which is drawn behind th chart.
2829
Color backgroundColor;
2930

31+
/// Difference of [maxY] and [minY]
32+
double get verticalDiff => maxY - minY;
33+
34+
/// Difference of [maxX] and [minX]
35+
double get horizontalDiff => maxX - minX;
36+
3037
AxisChartData({
3138
FlGridData gridData,
3239
FlAxisTitleData axisTitleData,
@@ -243,8 +250,8 @@ class SideTitles with EquatableMixin {
243250
/// [textStyle] determines the text style of them,
244251
/// [margin] determines margin of texts from the border line,
245252
///
246-
/// by default, texts are showing with 1.0 interval,
247-
/// you can change this value using [interval],
253+
/// texts are showing with provided [interval],
254+
/// or you can let it be null to be calculated using [getEfficientInterval],
248255
///
249256
/// you can change rotation of drawing titles using [rotateAngle].
250257
SideTitles({
@@ -264,7 +271,7 @@ class SideTitles with EquatableMixin {
264271
fontSize: 11,
265272
),
266273
margin = margin ?? 6,
267-
interval = interval ?? 1.0,
274+
interval = interval,
268275
rotateAngle = rotateAngle ?? 0.0;
269276

270277
/// Lerps a [SideTitles] based on [t] value, check [Tween.lerp].
@@ -352,7 +359,7 @@ class FlGridData with EquatableMixin {
352359
/// Determines showing or hiding all horizontal lines.
353360
final bool drawHorizontalLine;
354361

355-
/// Determines interval between horizontal lines.
362+
/// Determines interval between horizontal lines, left it null to be auto calculated.
356363
final double horizontalInterval;
357364

358365
/// Gives you a y value, and gets a [FlLine] that represents specified line.
@@ -364,7 +371,7 @@ class FlGridData with EquatableMixin {
364371
/// Determines showing or hiding all vertical lines.
365372
final bool drawVerticalLine;
366373

367-
/// Determines interval between vertical lines.
374+
/// Determines interval between vertical lines, left it null to be auto calculated.
368375
final double verticalInterval;
369376

370377
/// Gives you a x value, and gets a [FlLine] that represents specified line.
@@ -407,11 +414,11 @@ class FlGridData with EquatableMixin {
407414
CheckToShowGrid checkToShowVerticalLine,
408415
}) : show = show ?? true,
409416
drawHorizontalLine = drawHorizontalLine ?? true,
410-
horizontalInterval = horizontalInterval ?? 1.0,
417+
horizontalInterval = horizontalInterval,
411418
getDrawingHorizontalLine = getDrawingHorizontalLine ?? defaultGridLine,
412419
checkToShowHorizontalLine = checkToShowHorizontalLine ?? showAllGrids,
413420
drawVerticalLine = drawVerticalLine ?? false,
414-
verticalInterval = verticalInterval ?? 1.0,
421+
verticalInterval = verticalInterval,
415422
getDrawingVerticalLine = getDrawingVerticalLine ?? defaultGridLine,
416423
checkToShowVerticalLine = checkToShowVerticalLine ?? showAllGrids;
417424

lib/src/chart/base/axis_chart/axis_chart_painter.dart

+13-10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:fl_chart/src/chart/bar_chart/bar_chart_painter.dart';
44
import 'package:fl_chart/src/chart/base/base_chart/base_chart_painter.dart';
55
import 'package:fl_chart/src/chart/line_chart/line_chart_painter.dart';
66
import 'package:fl_chart/src/extensions/canvas_extension.dart';
7+
import 'package:fl_chart/src/utils/utils.dart';
78
import 'package:flutter/material.dart';
89

910
import 'axis_chart_data.dart';
@@ -201,14 +202,15 @@ abstract class AxisChartPainter<D extends AxisChartData> extends BaseChartPainte
201202
final Size usableViewSize = getChartUsableDrawSize(viewSize);
202203
// Show Vertical Grid
203204
if (data.gridData.drawVerticalLine) {
204-
double verticalSeek = data.minX + data.gridData.verticalInterval;
205+
final int verticalInterval = data.gridData.verticalInterval ??
206+
getEfficientInterval(viewSize.width, data.horizontalDiff);
207+
double verticalSeek = data.minX + verticalInterval;
205208

206209
final double delta = data.maxX - data.minX;
207-
final int count = delta ~/ data.gridData.verticalInterval;
210+
final int count = delta ~/ verticalInterval;
208211
final double lastPosition = count * verticalSeek;
209212
final bool lastPositionOverlapsWithBorder = lastPosition == data.maxX;
210-
final end =
211-
lastPositionOverlapsWithBorder ? data.maxX - data.gridData.verticalInterval : data.maxX;
213+
final end = lastPositionOverlapsWithBorder ? data.maxX - verticalInterval : data.maxX;
212214

213215
while (verticalSeek <= end) {
214216
if (data.gridData.checkToShowVerticalLine(verticalSeek)) {
@@ -223,21 +225,22 @@ abstract class AxisChartPainter<D extends AxisChartData> extends BaseChartPainte
223225
final double y2 = usableViewSize.height + getTopOffsetDrawSize();
224226
canvas.drawDashedLine(Offset(x1, y1), Offset(x2, y2), _gridPaint, flLineStyle.dashArray);
225227
}
226-
verticalSeek += data.gridData.verticalInterval;
228+
verticalSeek += verticalInterval;
227229
}
228230
}
229231

230232
// Show Horizontal Grid
231233
if (data.gridData.drawHorizontalLine) {
232-
double horizontalSeek = data.minY + data.gridData.horizontalInterval;
234+
final int horizontalInterval = data.gridData.horizontalInterval ??
235+
getEfficientInterval(viewSize.height, data.verticalDiff);
236+
double horizontalSeek = data.minY + horizontalInterval;
233237

234238
final double delta = data.maxY - data.minY;
235-
final int count = delta ~/ data.gridData.horizontalInterval;
239+
final int count = delta ~/ horizontalInterval;
236240
final double lastPosition = count * horizontalSeek;
237241
final bool lastPositionOverlapsWithBorder = lastPosition == data.maxY;
238242

239-
final end =
240-
lastPositionOverlapsWithBorder ? data.maxY - data.gridData.horizontalInterval : data.maxY;
243+
final end = lastPositionOverlapsWithBorder ? data.maxY - horizontalInterval : data.maxY;
241244

242245
while (horizontalSeek <= end) {
243246
if (data.gridData.checkToShowHorizontalLine(horizontalSeek)) {
@@ -253,7 +256,7 @@ abstract class AxisChartPainter<D extends AxisChartData> extends BaseChartPainte
253256
canvas.drawDashedLine(Offset(x1, y1), Offset(x2, y2), _gridPaint, flLine.dashArray);
254257
}
255258

256-
horizontalSeek += data.gridData.horizontalInterval;
259+
horizontalSeek += horizontalInterval;
257260
}
258261
}
259262
}

lib/src/chart/base/base_chart/base_chart_data.dart

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:equatable/equatable.dart';
2+
import 'package:fl_chart/src/utils/utils.dart';
23
import 'package:flutter/material.dart';
34

45
import 'base_chart_painter.dart';
@@ -127,9 +128,9 @@ typedef GetTitleFunction = String Function(double value);
127128

128129
/// The default [SideTitles.getTitles] function.
129130
///
130-
/// It maps the axis number to a string and returns it.
131+
/// formats the axis number to a shorter string using [formatNumber].
131132
String defaultGetTitle(double value) {
132-
return '$value';
133+
return formatNumber(value);
133134
}
134135

135136
/// This class holds the touch response details.

lib/src/chart/line_chart/line_chart_painter.dart

+12-4
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,8 @@ class LineChartPainter extends AxisChartPainter<LineChartData>
872872

873873
// Left Titles
874874
final leftTitles = targetData.titlesData.leftTitles;
875+
final leftInterval =
876+
leftTitles.interval ?? getEfficientInterval(viewSize.height, data.verticalDiff);
875877
if (leftTitles.showTitles) {
876878
double verticalSeek = data.minY;
877879
while (verticalSeek <= data.maxY) {
@@ -897,12 +899,14 @@ class LineChartPainter extends AxisChartPainter<LineChartData>
897899
tp.paint(canvas, Offset(x, y));
898900
canvas.restore();
899901

900-
verticalSeek += leftTitles.interval;
902+
verticalSeek += leftInterval;
901903
}
902904
}
903905

904906
// Top titles
905907
final topTitles = targetData.titlesData.topTitles;
908+
final topInterval =
909+
topTitles.interval ?? getEfficientInterval(viewSize.width, data.horizontalDiff);
906910
if (topTitles.showTitles) {
907911
double horizontalSeek = data.minX;
908912
while (horizontalSeek <= data.maxX) {
@@ -929,12 +933,14 @@ class LineChartPainter extends AxisChartPainter<LineChartData>
929933
tp.paint(canvas, Offset(x, y));
930934
canvas.restore();
931935

932-
horizontalSeek += topTitles.interval;
936+
horizontalSeek += topInterval;
933937
}
934938
}
935939

936940
// Right Titles
937941
final rightTitles = targetData.titlesData.rightTitles;
942+
final rightInterval =
943+
rightTitles.interval ?? getEfficientInterval(viewSize.height, data.verticalDiff);
938944
if (rightTitles.showTitles) {
939945
double verticalSeek = data.minY;
940946
while (verticalSeek <= data.maxY) {
@@ -961,12 +967,14 @@ class LineChartPainter extends AxisChartPainter<LineChartData>
961967
tp.paint(canvas, Offset(x, y));
962968
canvas.restore();
963969

964-
verticalSeek += rightTitles.interval;
970+
verticalSeek += rightInterval;
965971
}
966972
}
967973

968974
// Bottom titles
969975
final bottomTitles = targetData.titlesData.bottomTitles;
976+
final bottomInterval =
977+
bottomTitles.interval ?? getEfficientInterval(viewSize.width, data.horizontalDiff);
970978
if (bottomTitles.showTitles) {
971979
double horizontalSeek = data.minX;
972980
while (horizontalSeek <= data.maxX) {
@@ -991,7 +999,7 @@ class LineChartPainter extends AxisChartPainter<LineChartData>
991999
tp.paint(canvas, Offset(x, y));
9921000
canvas.restore();
9931001

994-
horizontalSeek += bottomTitles.interval;
1002+
horizontalSeek += bottomInterval;
9951003
}
9961004
}
9971005
}

lib/src/chart/scatter_chart/scatter_chart_painter.dart

+12-4
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ class ScatterChartPainter extends AxisChartPainter<ScatterChartData>
6565

6666
// Left Titles
6767
final leftTitles = targetData.titlesData.leftTitles;
68+
final leftInterval =
69+
leftTitles.interval ?? getEfficientInterval(viewSize.height, data.verticalDiff);
6870
if (leftTitles.showTitles) {
6971
double verticalSeek = data.minY;
7072
while (verticalSeek <= data.maxY) {
@@ -90,12 +92,14 @@ class ScatterChartPainter extends AxisChartPainter<ScatterChartData>
9092
tp.paint(canvas, Offset(x, y));
9193
canvas.restore();
9294

93-
verticalSeek += leftTitles.interval;
95+
verticalSeek += leftInterval;
9496
}
9597
}
9698

9799
// Top titles
98100
final topTitles = targetData.titlesData.topTitles;
101+
final topInterval =
102+
topTitles.interval ?? getEfficientInterval(viewSize.width, data.horizontalDiff);
99103
if (topTitles.showTitles) {
100104
double horizontalSeek = data.minX;
101105
while (horizontalSeek <= data.maxX) {
@@ -122,12 +126,14 @@ class ScatterChartPainter extends AxisChartPainter<ScatterChartData>
122126
tp.paint(canvas, Offset(x, y));
123127
canvas.restore();
124128

125-
horizontalSeek += topTitles.interval;
129+
horizontalSeek += topInterval;
126130
}
127131
}
128132

129133
// Right Titles
130134
final rightTitles = targetData.titlesData.rightTitles;
135+
final rightInterval =
136+
rightTitles.interval ?? getEfficientInterval(viewSize.height, data.verticalDiff);
131137
if (rightTitles.showTitles) {
132138
double verticalSeek = data.minY;
133139
while (verticalSeek <= data.maxY) {
@@ -154,12 +160,14 @@ class ScatterChartPainter extends AxisChartPainter<ScatterChartData>
154160
tp.paint(canvas, Offset(x, y));
155161
canvas.restore();
156162

157-
verticalSeek += rightTitles.interval;
163+
verticalSeek += rightInterval;
158164
}
159165
}
160166

161167
// Bottom titles
162168
final bottomTitles = targetData.titlesData.bottomTitles;
169+
final bottomInterval =
170+
bottomTitles.interval ?? getEfficientInterval(viewSize.width, data.horizontalDiff);
163171
if (bottomTitles.showTitles) {
164172
double horizontalSeek = data.minX;
165173
while (horizontalSeek <= data.maxX) {
@@ -186,7 +194,7 @@ class ScatterChartPainter extends AxisChartPainter<ScatterChartData>
186194
tp.paint(canvas, Offset(x, y));
187195
canvas.restore();
188196

189-
horizontalSeek += bottomTitles.interval;
197+
horizontalSeek += bottomInterval;
190198
}
191199
}
192200
}

0 commit comments

Comments
 (0)