From fbb27911621222d12968830fad1f349fc2550c83 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 4 Oct 2019 00:20:31 +0330 Subject: [PATCH 1/4] added functionality to apply cutOffY value on below or above bar area, and for sure changed BelowBarData to BarAreaData to reuse it for both areas, fixed issue #62 --- lib/src/chart/line_chart/line_chart_data.dart | 65 +++-- .../chart/line_chart/line_chart_painter.dart | 244 +++++++++++++++--- 2 files changed, 240 insertions(+), 69 deletions(-) diff --git a/lib/src/chart/line_chart/line_chart_data.dart b/lib/src/chart/line_chart/line_chart_data.dart index fe8b06ce7..55a8ac3ec 100644 --- a/lib/src/chart/line_chart/line_chart_data.dart +++ b/lib/src/chart/line_chart/line_chart_data.dart @@ -166,8 +166,11 @@ class LineChartBarData { final bool isStrokeCapRound; - /// to fill space below the bar line, - final BelowBarData belowBarData; + /// to fill space below the bar line + final BarAreaData belowBarData; + + /// to fill space above the bar line + final BarAreaData aboveBarData; /// to show dot spots upon the line chart final FlDotData dotData; @@ -182,7 +185,8 @@ class LineChartBarData { this.curveSmoothness = 0.35, this.preventCurveOverShooting = false, this.isStrokeCapRound = false, - this.belowBarData = const BelowBarData(), + this.belowBarData = const BarAreaData(), + this.aboveBarData = const BarAreaData(), this.dotData = const FlDotData(), }); @@ -190,7 +194,7 @@ class LineChartBarData { return LineChartBarData( show: b.show, barWidth: lerpDouble(a.barWidth, b.barWidth, t), - belowBarData: BelowBarData.lerp(a.belowBarData, b.belowBarData, t), + belowBarData: BarAreaData.lerp(a.belowBarData, b.belowBarData, t), curveSmoothness: b.curveSmoothness, isCurved: b.isCurved, isStrokeCapRound: b.isStrokeCapRound, @@ -203,10 +207,9 @@ class LineChartBarData { } } -/***** BelowBarData *****/ - -/// This class holds data about draw on below space of the bar line, -class BelowBarData { +/***** BarAreaData *****/ +/// This class holds data about draw on below or above space of the bar line, +class BarAreaData { final bool show; /// if you pass just one color, the solid color will be used, @@ -227,55 +230,65 @@ class BelowBarData { /// stop points of the gradient. final List gradientColorStops; - /// holds data for drawing a line from each spot the the bottom of the chart - final BelowSpotsLine belowSpotsLine; + /// holds data for drawing a line from each spot the the bottom, or top of the chart + final BarAreaSpotsLine spotsLine; - const BelowBarData({ - this.show = true, + /// cut the drawing below or above area to this y value + final double cutOffY; + + /// determines should or shouldn't apply cutOffY + final bool applyCutOffY; + + const BarAreaData({ + this.show = false, this.colors = const [Colors.blueGrey], this.gradientFrom = const Offset(0, 0), this.gradientTo = const Offset(1, 0), this.gradientColorStops, - this.belowSpotsLine = const BelowSpotsLine(), - }); + this.spotsLine = const BarAreaSpotsLine(), + this.cutOffY, + this.applyCutOffY = false, + }) : assert(applyCutOffY == true ? cutOffY != null : true); - static BelowBarData lerp(BelowBarData a, BelowBarData b, double t) { - return BelowBarData( + static BarAreaData lerp(BarAreaData a, BarAreaData b, double t) { + return BarAreaData( show: b.show, gradientFrom: Offset.lerp(a.gradientFrom, b.gradientFrom, t), gradientTo: Offset.lerp(a.gradientTo, b.gradientTo, t), - belowSpotsLine: BelowSpotsLine.lerp(a.belowSpotsLine, b.belowSpotsLine, t), + spotsLine: BarAreaSpotsLine.lerp(a.spotsLine, b.spotsLine, t), colors: lerpColorList(a.colors, b.colors, t), gradientColorStops: lerpDoubleList(a.gradientColorStops, b.gradientColorStops, t), + cutOffY: lerpDouble(a.cutOffY, b.cutOffY, t), + applyCutOffY: b.applyCutOffY, ); } } -typedef CheckToShowSpotBelowLine = bool Function(FlSpot spot); +typedef CheckToShowSpotLine = bool Function(FlSpot spot); bool showAllSpotsBelowLine(FlSpot spot) { return true; } -class BelowSpotsLine { +class BarAreaSpotsLine { final bool show; /// determines style of the line final FlLine flLineStyle; - /// a function to determine whether to show or hide the below line on the given spot - final CheckToShowSpotBelowLine checkToShowSpotBelowLine; + /// a function to determine whether to show or hide the below or above line on the given spot + final CheckToShowSpotLine checkToShowSpotLine; - const BelowSpotsLine({ + const BarAreaSpotsLine({ this.show = false, this.flLineStyle = const FlLine(), - this.checkToShowSpotBelowLine = showAllSpotsBelowLine, + this.checkToShowSpotLine = showAllSpotsBelowLine, }); - static BelowSpotsLine lerp(BelowSpotsLine a, BelowSpotsLine b, double t) { - return BelowSpotsLine( + static BarAreaSpotsLine lerp(BarAreaSpotsLine a, BarAreaSpotsLine b, double t) { + return BarAreaSpotsLine( show: b.show, - checkToShowSpotBelowLine: b.checkToShowSpotBelowLine, + checkToShowSpotLine: b.checkToShowSpotLine, flLineStyle: FlLine.lerp(a.flLineStyle, b.flLineStyle, t), ); } diff --git a/lib/src/chart/line_chart/line_chart_painter.dart b/lib/src/chart/line_chart/line_chart_painter.dart index 3bfb2e3f4..0adb10cf3 100644 --- a/lib/src/chart/line_chart/line_chart_painter.dart +++ b/lib/src/chart/line_chart/line_chart_painter.dart @@ -15,15 +15,17 @@ class LineChartPainter extends AxisChartPainter { final LineChartData targetData; /// [barPaint] is responsible to painting the bar line - /// [belowBarPaint] is responsible to fill the below space of our bar line + /// [barAreaPaint] is responsible to fill the below or above space of the bar line + /// [barAreaLinesPaint] is responsible to draw vertical lines on above or below of the bar line /// [dotPaint] is responsible to draw dots on spot points /// [clearAroundBorderPaint] is responsible to clip the border /// [extraLinesPaint] is responsible to draw extr lines /// [touchLinePaint] is responsible to draw touch indicators(below line and spot) /// [bgTouchTooltipPaint] is responsible to draw box backgroundTooltip of touched point; Paint barPaint, - belowBarPaint, - belowBarLinePaint, + barAreaPaint, + barAreaLinesPaint, + clearBarAreaPaint, dotPaint, clearAroundBorderPaint, extraLinesPaint, @@ -39,10 +41,15 @@ class LineChartPainter extends AxisChartPainter { touchedResponseSink: touchedResponseSink) { barPaint = Paint()..style = PaintingStyle.stroke; - belowBarPaint = Paint()..style = PaintingStyle.fill; + barAreaPaint = Paint()..style = PaintingStyle.fill; - belowBarLinePaint = Paint()..style = PaintingStyle.stroke; + barAreaLinesPaint = Paint()..style = PaintingStyle.stroke; + clearBarAreaPaint = Paint() + ..style = PaintingStyle.fill + ..color = const Color(0x000000000) + ..blendMode = BlendMode.dstIn; + dotPaint = Paint()..style = PaintingStyle.fill; clearAroundBorderPaint = Paint() @@ -118,9 +125,17 @@ class LineChartPainter extends AxisChartPainter { } void drawBarLine(Canvas canvas, Size viewSize, LineChartBarData barData) { - Path barPath = _generateBarPath(viewSize, barData); - drawBelowBar(canvas, viewSize, barPath, barData); - drawBar(canvas, viewSize, barPath, barData); + final barPath = _generateBarPath(viewSize, barData); + + final belowBarPath = _generateBelowBarPath(viewSize, barData, barPath); + final completelyFillBelowBarPath = _generateBelowBarPath(viewSize, barData, barPath, fillCompletely: true); + + final aboveBarPath = _generateAboveBarPath(viewSize, barData, barPath); + final completelyFillAboveBarPath = _generateAboveBarPath(viewSize, barData, barPath, fillCompletely: true); + + _drawBelowBar(canvas, viewSize, belowBarPath, completelyFillAboveBarPath, barData); + _drawAboveBar(canvas, viewSize, aboveBarPath, completelyFillBelowBarPath, barData); + _drawBar(canvas, viewSize, barPath, barData); } /// find the nearest spot base on the touched offset @@ -241,30 +256,33 @@ class LineChartPainter extends AxisChartPainter { return path; } - /// in this phase we get the generated [barPath] as input - /// that is the raw line bar. - /// then we make a copy from it and call it [belowBarPath], - /// we continue to complete the path to cover the below section. - /// then we close the path to fill the below space with a color or gradient. - void drawBelowBar( - Canvas canvas, Size viewSize, Path barPath, LineChartBarData barData) { - if (!barData.belowBarData.show) { - return; - } - - var belowBarPath = Path.from(barPath); + /// it generates below area path using a copy of [barPath], + /// if cutOffY is provided by the [BarAreaData], it cut the area to the provided cutOffY value, + /// if [fillCompletely] is true, the cutOffY will be ignored, + /// and a completely filled path will return, + Path _generateBelowBarPath(Size viewSize, LineChartBarData barData, Path barPath, {bool fillCompletely = false}) { + final belowBarPath = Path.from(barPath); - Size chartViewSize = getChartUsableDrawSize(viewSize); + final chartViewSize = getChartUsableDrawSize(viewSize); /// Line To Bottom Right double x = - getPixelX(barData.spots[barData.spots.length - 1].x, chartViewSize); - double y = chartViewSize.height + getTopOffsetDrawSize(); + getPixelX(barData.spots[barData.spots.length - 1].x, chartViewSize); + double y; + if (!fillCompletely && barData.belowBarData.applyCutOffY) { + y = getPixelY(barData.belowBarData.cutOffY, chartViewSize); + } else { + y = chartViewSize.height + getTopOffsetDrawSize(); + } belowBarPath.lineTo(x, y); /// Line To Bottom Left x = getPixelX(barData.spots[0].x, chartViewSize); - y = chartViewSize.height + getTopOffsetDrawSize(); + if (!fillCompletely && barData.belowBarData.applyCutOffY) { + y = getPixelY(barData.belowBarData.cutOffY, chartViewSize); + } else { + y = chartViewSize.height + getTopOffsetDrawSize(); + } belowBarPath.lineTo(x, y); /// Line To Top Left @@ -273,11 +291,63 @@ class LineChartPainter extends AxisChartPainter { belowBarPath.lineTo(x, y); belowBarPath.close(); + return belowBarPath; + } + + /// it generates above area path using a copy of [barPath], + /// if cutOffY is provided by the [BarAreaData], it cut the area to the provided cutOffY value, + /// if [fillCompletely] is true, the cutOffY will be ignored, + /// and a completely filled path will return, + Path _generateAboveBarPath(Size viewSize, LineChartBarData barData, Path barPath, {bool fillCompletely = false}) { + final aboveBarPath = Path.from(barPath); + + final chartViewSize = getChartUsableDrawSize(viewSize); + + /// Line To Top Right + double x = + getPixelX(barData.spots[barData.spots.length - 1].x, chartViewSize); + double y; + if (!fillCompletely && barData.aboveBarData.applyCutOffY) { + y = getPixelY(barData.aboveBarData.cutOffY, chartViewSize); + } else { + y = getTopOffsetDrawSize(); + } + aboveBarPath.lineTo(x, y); + + /// Line To Top Left + x = getPixelX(barData.spots[0].x, chartViewSize); + if (!fillCompletely && barData.aboveBarData.applyCutOffY) { + y = getPixelY(barData.aboveBarData.cutOffY, chartViewSize); + } else { + y = getTopOffsetDrawSize(); + } + aboveBarPath.lineTo(x, y); + + /// Line To Bottom Left + x = getPixelX(barData.spots[0].x, chartViewSize); + y = getPixelY(barData.spots[0].y, chartViewSize); + aboveBarPath.lineTo(x, y); + aboveBarPath.close(); + + return aboveBarPath; + } + + /// firstly we draw [belowBarPath], then if cutOffY value is provided in [BarAreaData], + /// [belowBarPath] maybe draw over the main bar line, + /// then to fix the problem we use [filledAboveBarPath] to clear the above section from this draw. + void _drawBelowBar(Canvas canvas, Size viewSize, Path belowBarPath, Path filledAboveBarPath, + LineChartBarData barData) { + if (!barData.belowBarData.show) { + return; + } + + final chartViewSize = getChartUsableDrawSize(viewSize); + /// here we update the [belowBarPaint] to draw the solid color - /// or the gradient based on the [BelowBarData] class. + /// or the gradient based on the [BarAreaData] class. if (barData.belowBarData.colors.length == 1) { - belowBarPaint.color = barData.belowBarData.colors[0]; - belowBarPaint.shader = null; + barAreaPaint.color = barData.belowBarData.colors[0]; + barAreaPaint.shader = null; } else { List stops = []; if (barData.belowBarData.gradientColorStops == null || @@ -285,16 +355,16 @@ class LineChartPainter extends AxisChartPainter { barData.belowBarData.colors.length) { /// provided gradientColorStops is invalid and we calculate it here barData.colors.asMap().forEach((index, color) { - double ss = 1.0 / barData.colors.length; - stops.add(ss * (index + 1)); + final percent = 1.0 / barData.colors.length; + stops.add(percent * (index + 1)); }); } else { stops = barData.belowBarData.gradientColorStops; } - var from = barData.belowBarData.gradientFrom; - var to = barData.belowBarData.gradientTo; - belowBarPaint.shader = ui.Gradient.linear( + final from = barData.belowBarData.gradientFrom; + final to = barData.belowBarData.gradientTo; + barAreaPaint.shader = ui.Gradient.linear( Offset( getLeftOffsetDrawSize() + (chartViewSize.width * from.dx), getTopOffsetDrawSize() + (chartViewSize.height * from.dy), @@ -308,14 +378,23 @@ class LineChartPainter extends AxisChartPainter { ); } - canvas.drawPath(belowBarPath, belowBarPaint); + if (barData.belowBarData.applyCutOffY) { + canvas.saveLayer(Rect.fromLTWH(0, 0, viewSize.width, viewSize.height), Paint()); + } + + canvas.drawPath(belowBarPath, barAreaPaint); + + // clear the above area that get out of the bar line + if (barData.belowBarData.applyCutOffY) { + canvas.drawPath(filledAboveBarPath, clearBarAreaPaint); + canvas.restore(); + } + /// draw below spots line - if (barData.belowBarData.belowSpotsLine != null) { + if (barData.belowBarData.spotsLine != null && barData.belowBarData.spotsLine.show) { for (FlSpot spot in barData.spots) { - if (barData.belowBarData.belowSpotsLine.show && - barData.belowBarData.belowSpotsLine - .checkToShowSpotBelowLine(spot)) { + if (barData.belowBarData.spotsLine.checkToShowSpotLine(spot)) { final Offset from = Offset( getPixelX(spot.x, chartViewSize), getPixelY(spot.y, chartViewSize), @@ -328,18 +407,97 @@ class LineChartPainter extends AxisChartPainter { viewSize.height - bottomPadding, ); - belowBarLinePaint.color = - barData.belowBarData.belowSpotsLine.flLineStyle.color; - belowBarLinePaint.strokeWidth = - barData.belowBarData.belowSpotsLine.flLineStyle.strokeWidth; + barAreaLinesPaint.color = + barData.belowBarData.spotsLine.flLineStyle.color; + barAreaLinesPaint.strokeWidth = + barData.belowBarData.spotsLine.flLineStyle.strokeWidth; + + canvas.drawLine(from, to, barAreaLinesPaint); + } + } + } + } + + /// firstly we draw [aboveBarPath], then if cutOffY value is provided in [BarAreaData], + /// [aboveBarPath] maybe draw over the main bar line, + /// then to fix the problem we use [filledBelowBarPath] to clear the above section from this draw. + void _drawAboveBar(Canvas canvas, Size viewSize, Path aboveBarPath, Path filledBelowBarPath, + LineChartBarData barData) { + if (!barData.aboveBarData.show) { + return; + } + final chartViewSize = getChartUsableDrawSize(viewSize); + + /// here we update the [aboveBarPaint] to draw the solid color + /// or the gradient based on the [BarAreaData] class. + if (barData.aboveBarData.colors.length == 1) { + barAreaPaint.color = barData.aboveBarData.colors[0]; + barAreaPaint.shader = null; + } else { + List stops = []; + if (barData.aboveBarData.gradientColorStops == null || + barData.aboveBarData.gradientColorStops.length != + barData.aboveBarData.colors.length) { + /// provided gradientColorStops is invalid and we calculate it here + barData.colors.asMap().forEach((index, color) { + final percent = 1.0 / barData.colors.length; + stops.add(percent * (index + 1)); + }); + } else { + stops = barData.aboveBarData.gradientColorStops; + } + + final from = barData.aboveBarData.gradientFrom; + final to = barData.aboveBarData.gradientTo; + barAreaPaint.shader = ui.Gradient.linear( + Offset( + getLeftOffsetDrawSize() + (chartViewSize.width * from.dx), + getTopOffsetDrawSize() + (chartViewSize.height * from.dy), + ), + Offset( + getLeftOffsetDrawSize() + (chartViewSize.width * to.dx), + getTopOffsetDrawSize() + (chartViewSize.height * to.dy), + ), + barData.aboveBarData.colors, + stops, + ); + } + + canvas.saveLayer(Rect.fromLTWH(0, 0, viewSize.width, viewSize.height), Paint()); + canvas.drawPath(aboveBarPath, barAreaPaint); + + // clear the above area that get out of the bar line + canvas.drawPath(filledBelowBarPath, clearBarAreaPaint); + canvas.restore(); + + /// draw above spots line + if (barData.aboveBarData.spotsLine != null && barData.aboveBarData.spotsLine.show) { + for (FlSpot spot in barData.spots) { + if (barData.aboveBarData.spotsLine + .checkToShowSpotLine(spot)) { + final Offset from = Offset( + getPixelX(spot.x, chartViewSize), + getPixelY(spot.y, chartViewSize), + ); + + final Offset to = Offset( + getPixelX(spot.x, chartViewSize), + getTopOffsetDrawSize(), + ); + + barAreaLinesPaint.color = + barData.aboveBarData.spotsLine.flLineStyle.color; + barAreaLinesPaint.strokeWidth = + barData.aboveBarData.spotsLine.flLineStyle.strokeWidth; - canvas.drawLine(from, to, belowBarLinePaint); + canvas.drawLine(from, to, barAreaLinesPaint); } } } } - void drawBar( + /// draw the main bar line by the [barPath] + void _drawBar( Canvas canvas, Size viewSize, Path barPath, LineChartBarData barData) { if (!barData.show) { return; From 06cfd6cf2f347debae9545061449642b61bc3d7d Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 4 Oct 2019 00:28:43 +0330 Subject: [PATCH 2/4] changed line_chart_sample4 to show the cutOffY feature --- .../samples/line_chart_sample1.dart | 16 ++++++------ .../samples/line_chart_sample2.dart | 4 +-- .../samples/line_chart_sample3.dart | 23 +++++++++--------- .../samples/line_chart_sample4.dart | 20 ++++++++++++--- .../samples/line_chart_sample5.dart | 6 ++--- .../samples/line_chart_sample6.dart | 4 +-- .../images/line_chart/line_chart_sample_4.png | Bin 47346 -> 39666 bytes 7 files changed, 42 insertions(+), 31 deletions(-) diff --git a/example/lib/line_chart/samples/line_chart_sample1.dart b/example/lib/line_chart/samples/line_chart_sample1.dart index 3329eab38..bc2ebceaa 100644 --- a/example/lib/line_chart/samples/line_chart_sample1.dart +++ b/example/lib/line_chart/samples/line_chart_sample1.dart @@ -135,7 +135,7 @@ class LineChartSample1State extends State { leftTitles: SideTitles( showTitles: true, textStyle: TextStyle( - color: Color(0xff75729e), + color: const Color(0xff75729e), fontWeight: FontWeight.bold, fontSize: 14, ), @@ -202,7 +202,7 @@ class LineChartSample1State extends State { dotData: FlDotData( show: false, ), - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: false, ), ), @@ -224,7 +224,7 @@ class LineChartSample1State extends State { dotData: FlDotData( show: false, ), - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: false, colors: [ Color(0x00aa4cfc), @@ -248,7 +248,7 @@ class LineChartSample1State extends State { dotData: FlDotData( show: false, ), - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: false, ), ), @@ -286,7 +286,7 @@ class LineChartSample1State extends State { leftTitles: SideTitles( showTitles: true, textStyle: TextStyle( - color: Color(0xff75729e), + color: const Color(0xff75729e), fontWeight: FontWeight.bold, fontSize: 14, ), @@ -356,7 +356,7 @@ class LineChartSample1State extends State { dotData: FlDotData( show: false, ), - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: false, ), ), @@ -378,7 +378,7 @@ class LineChartSample1State extends State { dotData: FlDotData( show: false, ), - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: true, colors: [ Color(0x33aa4cfc), @@ -403,7 +403,7 @@ class LineChartSample1State extends State { dotData: FlDotData( show: true, ), - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: false, ), ), diff --git a/example/lib/line_chart/samples/line_chart_sample2.dart b/example/lib/line_chart/samples/line_chart_sample2.dart index 6e6ea1085..0d385c350 100644 --- a/example/lib/line_chart/samples/line_chart_sample2.dart +++ b/example/lib/line_chart/samples/line_chart_sample2.dart @@ -139,7 +139,7 @@ class _LineChartSample2State extends State { dotData: const FlDotData( show: false, ), - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: true, colors: gradientColors.map((color) => color.withOpacity(0.3)).toList(), ), @@ -235,7 +235,7 @@ class _LineChartSample2State extends State { dotData: const FlDotData( show: false, ), - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: true, colors: [ ColorTween(begin: gradientColors[0], end: gradientColors[1]).lerp(0.2).withOpacity(0.1), diff --git a/example/lib/line_chart/samples/line_chart_sample3.dart b/example/lib/line_chart/samples/line_chart_sample3.dart index 03bac3812..c76aa6ae9 100644 --- a/example/lib/line_chart/samples/line_chart_sample3.dart +++ b/example/lib/line_chart/samples/line_chart_sample3.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; class LineChartSample3 extends StatelessWidget { - var weekDays = ['Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', ]; + final weekDays = ['Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', ]; @override Widget build(BuildContext context) { @@ -13,12 +13,12 @@ class LineChartSample3 extends StatelessWidget { children: [ Row( mainAxisSize: MainAxisSize.min, - children: [ - const Text('Average Line', + children: const [ + Text('Average Line', style: TextStyle(color: Colors.green, fontWeight: FontWeight.bold, fontSize: 16),), - const Text(' and ', + Text(' and ', style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 16),), - const Text('Indicators', + Text('Indicators', style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold, fontSize: 16),), ], ), @@ -71,7 +71,7 @@ class LineChartSample3 extends StatelessWidget { ), lineBarsData: [ LineChartBarData( - spots: [ + spots: const [ FlSpot(0, 1.3), FlSpot(1, 1), FlSpot(2, 1.8), @@ -85,22 +85,22 @@ class LineChartSample3 extends StatelessWidget { colors: [ Colors.orange, ], - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: true, colors: [ Colors.orange.withOpacity(0.5), Colors.orange.withOpacity(0.0), ], gradientColorStops: [0.5, 1.0], - gradientFrom: Offset(0, 0), - gradientTo: Offset(0, 1), - belowSpotsLine: BelowSpotsLine( + gradientFrom: const Offset(0, 0), + gradientTo: const Offset(0, 1), + spotsLine: BarAreaSpotsLine( show: true, flLineStyle: const FlLine( color: Colors.blue, strokeWidth: 2, ), - checkToShowSpotBelowLine: (spot) { + checkToShowSpotLine: (spot) { if (spot.x == 0 || spot.x == 6) { return false; } @@ -188,5 +188,4 @@ class LineChartSample3 extends StatelessWidget { ], ); } - } \ No newline at end of file diff --git a/example/lib/line_chart/samples/line_chart_sample4.dart b/example/lib/line_chart/samples/line_chart_sample4.dart index 45a97cb03..80a18c14f 100644 --- a/example/lib/line_chart/samples/line_chart_sample4.dart +++ b/example/lib/line_chart/samples/line_chart_sample4.dart @@ -5,6 +5,9 @@ class LineChartSample4 extends StatelessWidget { @override Widget build(BuildContext context) { + + const cutOffYValue = 5.0; + return SizedBox( width: 300, height: 140, @@ -14,7 +17,7 @@ class LineChartSample4 extends StatelessWidget { lineTouchData: const LineTouchData(enabled: false), lineBarsData: [ LineChartBarData( - spots: [ + spots: const [ FlSpot(0, 4), FlSpot(1, 3.5), FlSpot(2, 4.5), @@ -33,11 +36,19 @@ class LineChartSample4 extends StatelessWidget { colors: [ Colors.purpleAccent, ], - belowBarData: BelowBarData( + belowBarData: BarAreaData( + show: true, + colors: [Colors.deepPurple.withOpacity(0.4)], + cutOffY: cutOffYValue, + applyCutOffY: true, + ), + aboveBarData: BarAreaData( show: true, - colors: [Colors.deepPurple.withOpacity(0.2)], + colors: [Colors.orange.withOpacity(0.6)], + cutOffY: cutOffYValue, + applyCutOffY: true, ), - dotData: FlDotData( + dotData: const FlDotData( show: false, ), ), @@ -73,6 +84,7 @@ class LineChartSample4 extends StatelessWidget { return 'Nov'; case 11: return 'Dec'; + default: return ''; } } ), diff --git a/example/lib/line_chart/samples/line_chart_sample5.dart b/example/lib/line_chart/samples/line_chart_sample5.dart index 59b3e005d..e5c6f3b46 100644 --- a/example/lib/line_chart/samples/line_chart_sample5.dart +++ b/example/lib/line_chart/samples/line_chart_sample5.dart @@ -13,7 +13,7 @@ class LineChartSample5 extends StatelessWidget { LineChartData( lineTouchData: const LineTouchData(enabled: false), lineBarsData: [ - LineChartBarData( + const LineChartBarData( spots: [ FlSpot(0, 1), FlSpot(1, 2), @@ -25,7 +25,7 @@ class LineChartSample5 extends StatelessWidget { ], isCurved: true, barWidth: 4, - belowBarData: BelowBarData( + belowBarData: BarAreaData( show: true, ), dotData: FlDotData(show: false), @@ -63,7 +63,7 @@ class LineChartSample5 extends StatelessWidget { ) ), ), - gridData: FlGridData(show: false), + gridData: const FlGridData(show: false), borderData: FlBorderData( show: true, ), diff --git a/example/lib/line_chart/samples/line_chart_sample6.dart b/example/lib/line_chart/samples/line_chart_sample6.dart index 1264e69e3..888d493b9 100644 --- a/example/lib/line_chart/samples/line_chart_sample6.dart +++ b/example/lib/line_chart/samples/line_chart_sample6.dart @@ -85,7 +85,7 @@ class LineChartSample6 extends StatelessWidget { isCurved: true, isStrokeCapRound: true, barWidth: 10, - belowBarData: const BelowBarData( + belowBarData: const BarAreaData( show: false, ), dotData: FlDotData( @@ -103,7 +103,7 @@ class LineChartSample6 extends StatelessWidget { isCurved: true, isStrokeCapRound: true, barWidth: 10, - belowBarData: const BelowBarData( + belowBarData: const BarAreaData( show: false, ), dotData: FlDotData( diff --git a/repo_files/images/line_chart/line_chart_sample_4.png b/repo_files/images/line_chart/line_chart_sample_4.png index db76985d8f07f87d685f130fccb4dc56dac89b64..4ade56bde2fe8efb0b63b0734441d90ff7b042ba 100644 GIT binary patch literal 39666 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 I)HvvW04c1DW&i*H From 0f33614bebdf5ca88dafd933ce7b06e888e34032 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 4 Oct 2019 00:57:00 +0330 Subject: [PATCH 3/4] updated line_chart.md doc --- repo_files/documentations/line_chart.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/repo_files/documentations/line_chart.md b/repo_files/documentations/line_chart.md index 88890e853..4c3705e99 100644 --- a/repo_files/documentations/line_chart.md +++ b/repo_files/documentations/line_chart.md @@ -42,27 +42,30 @@ FlChart( |curveSmoothness| smoothness radius of the curve corners (works when isCurved is true) | 0.35| |preventCurveOverShooting|prevent overshooting when draw curve line on linear sequence spots, check this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/25)| false| |isStrokeCapRound| determines whether start and end of the bar line is Qubic or Round | false| -|belowBarData| check the [BelowBarData](#BelowBarData) |BelowBarData()| +|belowBarData| check the [BarAreaData](#BarAreaData) |BarAreaData| +|aboveBarData| check the [BarAreaData](#BarAreaData) |BarAreaData| |dotData| check the [FlDotData](#FlDotData) | FlDotData()| -### BelowBarData +### BarAreaData |PropName|Description|default value| |:-------|:----------|:------------| -|show|determines to show or hide the below bar|true| -|colors|colors the below bar area, if multiple colors provided it will be gradient|[Colors.blueGrey]| +|show|determines to show or hide the below, or above bar area|false| +|colors|colors the below, or above bar area, if multiple colors provided it will be gradient|[Colors.blueGrey]| |gradientFrom|determines start of the gradient, each number should be between 0 and 1, [Read More](https://api.flutter.dev/flutter/dart-ui/Gradient/Gradient.linear.html)|Offset(0, 0)| |gradientTo|determines end of the gradient, each number should be between 0 and 1, [Read More](https://api.flutter.dev/flutter/dart-ui/Gradient/Gradient.linear.html)|Offset(1, 0)| |gradientColorStops|gets the stop positions of the gradient color, [Read More](https://api.flutter.dev/flutter/dart-ui/Gradient/Gradient.linear.html)|null| -|belowSpotsLine| draw a line from each spot to the bottom of the chart|[BelowSpotsLine](#BelowSpotsLine)()| +|spotsLine| draw a line from each spot the the bottom, or top of the chart|[BarAreaSpotsLine](#BarAreaSpotsLine)()| +|cutOffY| cut the drawing below or above area to this y value (set `applyCutOffY` true if you want to set it)|null| +|applyCutOffY| determines should or shouldn't apply cutOffY (`scutOffY` should be provided)|false| -### BelowSpotsLine +### BarAreaSpotsLine |PropName|Description|default value| |:-------|:----------|:------------| -|show|determines show or hide the below spots line|true| +|show|determines show or hide the below, or above spots line|true| |flLineStyle|a [FlLine](base_chart.md#FlLine) object that determines style of the line|[Colors.blueGrey]| -|checkToShowSpotBelowLine|a function to determine whether to show or hide the below line on the given spot|showAllSpotsBelowLine| +|checkToShowSpotLine|a function to determine whether to show or hide the below or above line on the given spot|showAllSpotsBelowLine| ### FlDotData From e6cddc831127245bfff203ad0dac0a16f5afff37 Mon Sep 17 00:00:00 2001 From: imaNNeoFighT Date: Fri, 4 Oct 2019 00:57:15 +0330 Subject: [PATCH 4/4] bump version to 0.3.3 --- CHANGELOG.md | 10 ++++++++++ README.md | 2 +- pubspec.yaml | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76ae046c1..286ef247e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.3.3 +* BREAKING CHANGES +* added support for drawing below and above areas separately in LineChart +* added cutOffY feature in LineChart, see this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/62) +* added `aboveBarData` in [LineChartBarData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#linechartbardata) +* `BelowBarData` class renamed to [BarAreaData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#barareadata) to reuse for both above and below are +* `belowSpotsLine` renamed to `spotsLine` in [BarAreaData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#barareadata) +* `cutOffY` and `applyCutOffY` fields is added in [BarAreaData](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#barareadata) to handle cutting of drawing below or above area +* `BelowSpotsLine` renamed to [BarAreaSpotsLine](https://github.com/imaNNeoFighT/fl_chart/blob/master/repo_files/documentations/line_chart.md#barareaspotsline), and inside it `heckToShowSpotBelowLine` renamed to `heckToShowSpotLine` + ## 0.3.2 * provided default size (square with 30% smaller than screen) for the FLChart, fixed this [issue](https://github.com/imaNNeoFighT/fl_chart/issues/74). diff --git a/README.md b/README.md index 8ca95e5a0..9942c8207 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Thank you all! ```kotlin dependencies: - fl_chart: ^0.3.2 + fl_chart: ^0.3.3 ``` diff --git a/pubspec.yaml b/pubspec.yaml index 7cd06c866..75e9525b5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: fl_chart description: A powerful Flutter chart library, currently supporting Line Chart, Bar Chart and Pie Chart. -version: 0.3.2 +version: 0.3.3 author: Iman Khoshabi homepage: https://github.com/imaNNeoFighT/fl_chart