@nativescript-community/ui-chart 1.2.35 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/animation/ChartAnimator.d.ts +47 -4
- package/animation/ChartAnimator.js +49 -11
- package/animation/ChartAnimator.js.map +1 -1
- package/animation/Tween.d.ts +1 -1
- package/animation/Tween.js +4 -2
- package/animation/Tween.js.map +1 -1
- package/buffer/AbstractBuffer.d.ts +28 -3
- package/buffer/AbstractBuffer.js +22 -3
- package/buffer/AbstractBuffer.js.map +1 -1
- package/buffer/BarBuffer.d.ts +8 -12
- package/buffer/BarBuffer.js +33 -36
- package/buffer/BarBuffer.js.map +1 -1
- package/buffer/HorizontalBarBuffer.js +13 -10
- package/buffer/HorizontalBarBuffer.js.map +1 -1
- package/charts/BarChart.d.ts +70 -15
- package/charts/BarChart.js +92 -63
- package/charts/BarChart.js.map +1 -1
- package/charts/BarLineChartBase.d.ts +494 -73
- package/charts/BarLineChartBase.js +788 -407
- package/charts/BarLineChartBase.js.map +1 -1
- package/charts/BubbleChart.d.ts +11 -5
- package/charts/BubbleChart.js +10 -8
- package/charts/BubbleChart.js.map +1 -1
- package/charts/CandleStickChart.d.ts +8 -5
- package/charts/CandleStickChart.js +9 -10
- package/charts/CandleStickChart.js.map +1 -1
- package/charts/Chart.d.ts +424 -92
- package/charts/Chart.js +590 -290
- package/charts/Chart.js.map +1 -1
- package/charts/CombinedChart.d.ts +59 -29
- package/charts/CombinedChart.js +74 -67
- package/charts/CombinedChart.js.map +1 -1
- package/charts/HorizontalBarChart.d.ts +37 -7
- package/charts/HorizontalBarChart.js +97 -59
- package/charts/HorizontalBarChart.js.map +1 -1
- package/charts/LineChart.d.ts +3 -5
- package/charts/LineChart.js +6 -10
- package/charts/LineChart.js.map +1 -1
- package/charts/PieChart.d.ts +218 -64
- package/charts/PieChart.js +278 -168
- package/charts/PieChart.js.map +1 -1
- package/charts/PieRadarChartBase.d.ts +107 -18
- package/charts/PieRadarChartBase.js +156 -73
- package/charts/PieRadarChartBase.js.map +1 -1
- package/charts/RadarChart.d.ts +75 -35
- package/charts/RadarChart.js +114 -103
- package/charts/RadarChart.js.map +1 -1
- package/charts/ScatterChart.d.ts +10 -5
- package/charts/ScatterChart.js +11 -10
- package/charts/ScatterChart.js.map +1 -1
- package/components/AxisBase.d.ts +271 -101
- package/components/AxisBase.js +264 -254
- package/components/AxisBase.js.map +1 -1
- package/components/ComponentBase.d.ts +54 -19
- package/components/ComponentBase.js +60 -48
- package/components/ComponentBase.js.map +1 -1
- package/components/Description.d.ts +18 -9
- package/components/Description.js +12 -26
- package/components/Description.js.map +1 -1
- package/components/IMarker.d.ts +30 -1
- package/components/IMarker.js.map +1 -1
- package/components/Legend.d.ts +155 -58
- package/components/Legend.js +208 -172
- package/components/Legend.js.map +1 -1
- package/components/LegendEntry.d.ts +38 -0
- package/components/LegendEntry.js +34 -0
- package/components/LegendEntry.js.map +1 -1
- package/components/LimitLine.d.ts +40 -22
- package/components/LimitLine.js +44 -56
- package/components/LimitLine.js.map +1 -1
- package/components/MarkerImage.d.ts +1 -0
- package/components/MarkerImage.js +97 -0
- package/components/MarkerImage.js.map +1 -0
- package/components/XAxis.d.ts +41 -10
- package/components/XAxis.js +42 -24
- package/components/XAxis.js.map +1 -1
- package/components/YAxis.d.ts +114 -37
- package/components/YAxis.js +138 -106
- package/components/YAxis.js.map +1 -1
- package/data/BarData.d.ts +32 -4
- package/data/BarData.js +92 -24
- package/data/BarData.js.map +1 -1
- package/data/BarDataSet.d.ts +35 -18
- package/data/BarDataSet.js +42 -47
- package/data/BarDataSet.js.map +1 -1
- package/data/BarEntry.d.ts +3 -0
- package/data/BarEntry.js.map +1 -1
- package/data/BarLineScatterCandleBubbleData.d.ts +5 -0
- package/data/BarLineScatterCandleBubbleData.js +5 -0
- package/data/BarLineScatterCandleBubbleData.js.map +1 -1
- package/data/BarLineScatterCandleBubbleDataSet.d.ts +11 -3
- package/data/BarLineScatterCandleBubbleDataSet.js +11 -7
- package/data/BarLineScatterCandleBubbleDataSet.js.map +1 -1
- package/data/BaseDataSet.d.ts +129 -71
- package/data/BaseDataSet.js +146 -169
- package/data/BaseDataSet.js.map +1 -1
- package/data/BaseEntry.d.ts +3 -0
- package/data/BaseEntry.js.map +1 -1
- package/data/BubbleData.d.ts +7 -1
- package/data/BubbleData.js +8 -2
- package/data/BubbleData.js.map +1 -1
- package/data/BubbleDataSet.d.ts +7 -7
- package/data/BubbleDataSet.js +8 -15
- package/data/BubbleDataSet.js.map +1 -1
- package/data/BubbleEntry.d.ts +1 -0
- package/data/BubbleEntry.js.map +1 -1
- package/data/CandleData.js.map +1 -1
- package/data/CandleDataSet.d.ts +64 -30
- package/data/CandleDataSet.js +67 -74
- package/data/CandleDataSet.js.map +1 -1
- package/data/CandleEntry.d.ts +4 -0
- package/data/CandleEntry.js.map +1 -1
- package/data/ChartData.d.ts +273 -18
- package/data/ChartData.js +398 -93
- package/data/ChartData.js.map +1 -1
- package/data/CombinedData.d.ts +39 -12
- package/data/CombinedData.js +87 -71
- package/data/CombinedData.js.map +1 -1
- package/data/DataSet.d.ts +59 -8
- package/data/DataSet.js +114 -26
- package/data/DataSet.js.map +1 -1
- package/data/Entry.js.map +1 -1
- package/data/LineData.d.ts +5 -0
- package/data/LineData.js +5 -0
- package/data/LineData.js.map +1 -1
- package/data/LineDataSet.d.ts +80 -49
- package/data/LineDataSet.js +90 -135
- package/data/LineDataSet.js.map +1 -1
- package/data/LineRadarDataSet.d.ts +27 -17
- package/data/LineRadarDataSet.js +22 -35
- package/data/LineRadarDataSet.js.map +1 -1
- package/data/LineScatterCandleRadarDataSet.d.ts +30 -15
- package/data/LineScatterCandleRadarDataSet.js +36 -39
- package/data/LineScatterCandleRadarDataSet.js.map +1 -1
- package/data/PieData.d.ts +26 -0
- package/data/PieData.js +28 -2
- package/data/PieData.js.map +1 -1
- package/data/PieDataSet.d.ts +40 -36
- package/data/PieDataSet.js +36 -88
- package/data/PieDataSet.js.map +1 -1
- package/data/PieEntry.d.ts +3 -0
- package/data/PieEntry.js.map +1 -1
- package/data/RadarData.d.ts +10 -4
- package/data/RadarData.js +5 -6
- package/data/RadarData.js.map +1 -1
- package/data/RadarDataSet.d.ts +7 -21
- package/data/RadarDataSet.js +10 -49
- package/data/RadarDataSet.js.map +1 -1
- package/data/RadarEntry.js.map +1 -1
- package/data/ScatterData.d.ts +4 -1
- package/data/ScatterData.js +5 -2
- package/data/ScatterData.js.map +1 -1
- package/data/ScatterDataSet.d.ts +24 -14
- package/data/ScatterDataSet.js +26 -31
- package/data/ScatterDataSet.js.map +1 -1
- package/formatter/DefaultAxisValueFormatter.d.ts +17 -3
- package/formatter/DefaultAxisValueFormatter.js +12 -5
- package/formatter/DefaultAxisValueFormatter.js.map +1 -1
- package/formatter/DefaultFillFormatter.js +7 -7
- package/formatter/DefaultFillFormatter.js.map +1 -1
- package/formatter/DefaultValueFormatter.js.map +1 -1
- package/formatter/IAxisValueFormatter.d.ts +20 -2
- package/formatter/IAxisValueFormatter.js.map +1 -1
- package/formatter/IFillFormatter.d.ts +25 -0
- package/formatter/IFillFormatter.js.map +1 -1
- package/formatter/IValueFormatter.d.ts +21 -0
- package/formatter/IValueFormatter.js.map +1 -1
- package/formatter/ValueFormatter.d.ts +60 -0
- package/formatter/ValueFormatter.js +60 -0
- package/formatter/ValueFormatter.js.map +1 -1
- package/highlight/BarHighlighter.d.ts +22 -2
- package/highlight/BarHighlighter.js +43 -17
- package/highlight/BarHighlighter.js.map +1 -1
- package/highlight/ChartHighlighter.d.ts +87 -5
- package/highlight/ChartHighlighter.js +126 -23
- package/highlight/ChartHighlighter.js.map +1 -1
- package/highlight/CombinedHighlighter.d.ts +6 -0
- package/highlight/CombinedHighlighter.js +31 -16
- package/highlight/CombinedHighlighter.js.map +1 -1
- package/highlight/Highlight.d.ts +54 -1
- package/highlight/Highlight.js +5 -0
- package/highlight/Highlight.js.map +1 -1
- package/highlight/HorizontalBarHighlighter.d.ts +1 -1
- package/highlight/HorizontalBarHighlighter.js +14 -13
- package/highlight/HorizontalBarHighlighter.js.map +1 -1
- package/highlight/IHighlighter.d.ts +11 -1
- package/highlight/IHighlighter.js.map +1 -1
- package/highlight/PieHighlighter.js +2 -2
- package/highlight/PieHighlighter.js.map +1 -1
- package/highlight/PieRadarHighlighter.d.ts +12 -1
- package/highlight/PieRadarHighlighter.js +12 -4
- package/highlight/PieRadarHighlighter.js.map +1 -1
- package/highlight/RadarHighlighter.d.ts +12 -0
- package/highlight/RadarHighlighter.js +24 -10
- package/highlight/RadarHighlighter.js.map +1 -1
- package/index.d.ts +11 -0
- package/index.js +15 -0
- package/index.js.map +1 -0
- package/interfaces/dataprovider/BarDataProvider.d.ts +4 -4
- package/interfaces/dataprovider/BarLineScatterCandleBubbleDataProvider.d.ts +8 -3
- package/interfaces/dataprovider/BubbleDataProvider.d.ts +1 -1
- package/interfaces/dataprovider/CandleDataProvider.d.ts +1 -1
- package/interfaces/dataprovider/ChartInterface.d.ts +17 -22
- package/interfaces/dataprovider/CombinedDataProvider.d.ts +1 -1
- package/interfaces/dataprovider/LineDataProvider.d.ts +1 -1
- package/interfaces/dataprovider/ScatterDataProvider.d.ts +1 -1
- package/interfaces/datasets/IBarDataSet.d.ts +8 -22
- package/interfaces/datasets/IBarLineScatterCandleBubbleDataSet.d.ts +1 -3
- package/interfaces/datasets/IBubbleDataSet.d.ts +3 -9
- package/interfaces/datasets/ICandleDataSet.d.ts +44 -41
- package/interfaces/datasets/IDataSet.d.ts +35 -151
- package/interfaces/datasets/ILineDataSet.d.ts +15 -54
- package/interfaces/datasets/ILineRadarDataSet.d.ts +7 -28
- package/interfaces/datasets/ILineScatterCandleRadarDataSet.d.ts +5 -4
- package/interfaces/datasets/IPieDataSet.d.ts +22 -40
- package/interfaces/datasets/IRadarDataSet.d.ts +7 -13
- package/interfaces/datasets/IScatterDataSet.d.ts +17 -16
- package/jobs/AnimatedMoveViewJob.d.ts +3 -0
- package/jobs/AnimatedMoveViewJob.js +12 -8
- package/jobs/AnimatedMoveViewJob.js.map +1 -1
- package/jobs/AnimatedViewPortJob.d.ts +7 -8
- package/jobs/AnimatedViewPortJob.js +16 -23
- package/jobs/AnimatedViewPortJob.js.map +1 -1
- package/jobs/AnimatedZoomJob.d.ts +8 -5
- package/jobs/AnimatedZoomJob.js +30 -26
- package/jobs/AnimatedZoomJob.js.map +1 -1
- package/jobs/MoveViewJob.d.ts +3 -0
- package/jobs/MoveViewJob.js +10 -7
- package/jobs/MoveViewJob.js.map +1 -1
- package/jobs/ViewPortJob.d.ts +3 -5
- package/jobs/ViewPortJob.js +5 -11
- package/jobs/ViewPortJob.js.map +1 -1
- package/jobs/ZoomJob.js +14 -14
- package/jobs/ZoomJob.js.map +1 -1
- package/listener/BarLineChartTouchListener.d.ts +83 -1
- package/listener/BarLineChartTouchListener.js +169 -67
- package/listener/BarLineChartTouchListener.js.map +1 -1
- package/listener/ChartTouchListener.d.ts +39 -5
- package/listener/ChartTouchListener.js +38 -11
- package/listener/ChartTouchListener.js.map +1 -1
- package/listener/PieRadarChartTouchListener.d.ts +81 -1
- package/listener/PieRadarChartTouchListener.js +212 -16
- package/listener/PieRadarChartTouchListener.js.map +1 -1
- package/model/GradientColor.js.map +1 -1
- package/package.json +23 -15
- package/renderer/AxisRenderer.d.ts +66 -7
- package/renderer/AxisRenderer.js +69 -21
- package/renderer/AxisRenderer.js.map +1 -1
- package/renderer/BarChartRenderer.d.ts +11 -0
- package/renderer/BarChartRenderer.js +99 -71
- package/renderer/BarChartRenderer.js.map +1 -1
- package/renderer/BarLineScatterCandleBubbleRenderer.d.ts +37 -0
- package/renderer/BarLineScatterCandleBubbleRenderer.js +36 -8
- package/renderer/BarLineScatterCandleBubbleRenderer.js.map +1 -1
- package/renderer/BubbleChartRenderer.d.ts +6 -2
- package/renderer/BubbleChartRenderer.js +51 -40
- package/renderer/BubbleChartRenderer.js.map +1 -1
- package/renderer/CandleStickChartRenderer.d.ts +1 -1
- package/renderer/CandleStickChartRenderer.js +64 -50
- package/renderer/CandleStickChartRenderer.js.map +1 -1
- package/renderer/CombinedChartRenderer.d.ts +20 -1
- package/renderer/CombinedChartRenderer.js +72 -42
- package/renderer/CombinedChartRenderer.js.map +1 -1
- package/renderer/DataRenderer.d.ts +78 -4
- package/renderer/DataRenderer.js +65 -6
- package/renderer/DataRenderer.js.map +1 -1
- package/renderer/HorizontalBarChartRenderer.d.ts +5 -2
- package/renderer/HorizontalBarChartRenderer.js +87 -66
- package/renderer/HorizontalBarChartRenderer.js.map +1 -1
- package/renderer/LegendRenderer.d.ts +32 -0
- package/renderer/LegendRenderer.js +98 -59
- package/renderer/LegendRenderer.js.map +1 -1
- package/renderer/LineChartRenderer.d.ts +38 -1
- package/renderer/LineChartRenderer.js +185 -110
- package/renderer/LineChartRenderer.js.map +1 -1
- package/renderer/LineRadarRenderer.d.ts +19 -0
- package/renderer/LineRadarRenderer.js +25 -1
- package/renderer/LineRadarRenderer.js.map +1 -1
- package/renderer/LineScatterCandleRadarRenderer.d.ts +11 -0
- package/renderer/LineScatterCandleRadarRenderer.js +26 -9
- package/renderer/LineScatterCandleRadarRenderer.js.map +1 -1
- package/renderer/PieChartRenderer.d.ts +45 -1
- package/renderer/PieChartRenderer.js +195 -122
- package/renderer/PieChartRenderer.js.map +1 -1
- package/renderer/RadarChartRenderer.d.ts +10 -0
- package/renderer/RadarChartRenderer.js +119 -77
- package/renderer/RadarChartRenderer.js.map +1 -1
- package/renderer/Renderer.d.ts +8 -0
- package/renderer/Renderer.js +5 -0
- package/renderer/Renderer.js.map +1 -1
- package/renderer/ScatterChartRenderer.d.ts +5 -5
- package/renderer/ScatterChartRenderer.js +51 -37
- package/renderer/ScatterChartRenderer.js.map +1 -1
- package/renderer/XAxisRenderer.d.ts +29 -4
- package/renderer/XAxisRenderer.js +128 -95
- package/renderer/XAxisRenderer.js.map +1 -1
- package/renderer/XAxisRendererHorizontalBarChart.d.ts +11 -0
- package/renderer/XAxisRendererHorizontalBarChart.js +75 -57
- package/renderer/XAxisRendererHorizontalBarChart.js.map +1 -1
- package/renderer/XAxisRendererRadarChart.d.ts +5 -0
- package/renderer/XAxisRendererRadarChart.js +26 -13
- package/renderer/XAxisRendererRadarChart.js.map +1 -1
- package/renderer/YAxisRenderer.d.ts +42 -5
- package/renderer/YAxisRenderer.js +126 -69
- package/renderer/YAxisRenderer.js.map +1 -1
- package/renderer/YAxisRendererHorizontalBarChart.d.ts +22 -1
- package/renderer/YAxisRendererHorizontalBarChart.js +80 -58
- package/renderer/YAxisRendererHorizontalBarChart.js.map +1 -1
- package/renderer/YAxisRendererRadarChart.js +62 -32
- package/renderer/YAxisRendererRadarChart.js.map +1 -1
- package/renderer/scatter/ChevronDownShapeRenderer.d.ts +4 -0
- package/renderer/scatter/ChevronDownShapeRenderer.js +5 -1
- package/renderer/scatter/ChevronDownShapeRenderer.js.map +1 -1
- package/renderer/scatter/ChevronUpShapeRenderer.d.ts +4 -0
- package/renderer/scatter/ChevronUpShapeRenderer.js +5 -1
- package/renderer/scatter/ChevronUpShapeRenderer.js.map +1 -1
- package/renderer/scatter/CircleShapeRenderer.d.ts +4 -0
- package/renderer/scatter/CircleShapeRenderer.js +8 -5
- package/renderer/scatter/CircleShapeRenderer.js.map +1 -1
- package/renderer/scatter/CrossShapeRenderer.d.ts +4 -0
- package/renderer/scatter/CrossShapeRenderer.js +5 -1
- package/renderer/scatter/CrossShapeRenderer.js.map +1 -1
- package/renderer/scatter/IShapeRenderer.d.ts +14 -0
- package/renderer/scatter/IShapeRenderer.js.map +1 -1
- package/renderer/scatter/SquareShapeRenderer.d.ts +4 -0
- package/renderer/scatter/SquareShapeRenderer.js +8 -5
- package/renderer/scatter/SquareShapeRenderer.js.map +1 -1
- package/renderer/scatter/TriangleShapeRenderer.d.ts +4 -0
- package/renderer/scatter/TriangleShapeRenderer.js +9 -5
- package/renderer/scatter/TriangleShapeRenderer.js.map +1 -1
- package/renderer/scatter/XShapeRenderer.d.ts +4 -0
- package/renderer/scatter/XShapeRenderer.js +5 -1
- package/renderer/scatter/XShapeRenderer.js.map +1 -1
- package/utils/ColorTemplate.d.ts +21 -1
- package/utils/ColorTemplate.js +21 -3
- package/utils/ColorTemplate.js.map +1 -1
- package/utils/HorizontalViewPortHandler.d.ts +3 -0
- package/utils/HorizontalViewPortHandler.js +3 -0
- package/utils/HorizontalViewPortHandler.js.map +1 -1
- package/utils/MPSize.d.ts +7 -0
- package/utils/ObjectPool.d.ts +56 -0
- package/utils/ObjectPool.js +66 -8
- package/utils/ObjectPool.js.map +1 -1
- package/utils/Transformer.d.ts +118 -0
- package/utils/Transformer.js +141 -7
- package/utils/Transformer.js.map +1 -1
- package/utils/TransformerHorizontalBarChart.d.ts +10 -0
- package/utils/TransformerHorizontalBarChart.js +18 -2
- package/utils/TransformerHorizontalBarChart.js.map +1 -1
- package/utils/Utils.d.ts +139 -17
- package/utils/Utils.js +185 -60
- package/utils/Utils.js.map +1 -1
- package/utils/ViewPortHandler.d.ts +234 -19
- package/utils/ViewPortHandler.js +306 -63
- package/utils/ViewPortHandler.js.map +1 -1
- package/utils/colors/colorful.js.map +1 -1
- package/utils/colors/joyful.js.map +1 -1
- package/utils/colors/liberty.js.map +1 -1
- package/utils/colors/material.js.map +1 -1
- package/utils/colors/pastel.js.map +1 -1
- package/utils/colors/vordiplom.js.map +1 -1
- package/animation/ChartAnimator2.d.ts +0 -18
- package/animation/ChartAnimator2.js +0 -69
- package/animation/ChartAnimator2.js.map +0 -1
- package/charts/index.d.ts +0 -11
- package/charts/index.js +0 -15
- package/charts/index.js.map +0 -1
- package/utils/Curve.d.ts +0 -12
- package/utils/Curve.js +0 -156
- package/utils/Curve.js.map +0 -1
- package/utils/MPPointD.js +0 -1
- package/utils/MPPointD.js.map +0 -1
- package/utils/MPPointF.js +0 -1
- package/utils/MPPointF.js.map +0 -1
|
@@ -5,10 +5,6 @@ import { ValuePosition } from '../data/PieDataSet';
|
|
|
5
5
|
import { ColorTemplate } from '../utils/ColorTemplate';
|
|
6
6
|
import { Utils } from '../utils/Utils';
|
|
7
7
|
export class PieChartRenderer extends DataRenderer {
|
|
8
|
-
constructor(chart, animator, viewPortHandler) {
|
|
9
|
-
super(animator, viewPortHandler);
|
|
10
|
-
this.mChart = chart;
|
|
11
|
-
}
|
|
12
8
|
get centerTextLastBounds() {
|
|
13
9
|
if (!this.mCenterTextLastBounds) {
|
|
14
10
|
this.mCenterTextLastBounds = new RectF(0, 0, 0, 0);
|
|
@@ -21,6 +17,10 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
21
17
|
}
|
|
22
18
|
return this.mRectBuffer;
|
|
23
19
|
}
|
|
20
|
+
constructor(chart, animator, viewPortHandler) {
|
|
21
|
+
super(animator, viewPortHandler);
|
|
22
|
+
this.mChart = chart;
|
|
23
|
+
}
|
|
24
24
|
get centerTextPaint() {
|
|
25
25
|
if (!this.mCenterTextPaint) {
|
|
26
26
|
this.mCenterTextPaint = Utils.getTemplatePaint('black-fill');
|
|
@@ -58,10 +58,10 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
58
58
|
return this.mValuePaint;
|
|
59
59
|
}
|
|
60
60
|
drawData(c) {
|
|
61
|
-
const width = this.mViewPortHandler.
|
|
62
|
-
const height = this.mViewPortHandler.
|
|
63
|
-
let drawBitmap = this.mDrawBitmap
|
|
64
|
-
if (drawBitmap
|
|
61
|
+
const width = this.mViewPortHandler.chartWidth;
|
|
62
|
+
const height = this.mViewPortHandler.chartHeight;
|
|
63
|
+
let drawBitmap = this.mDrawBitmap?.get();
|
|
64
|
+
if (!drawBitmap || drawBitmap.width !== width || drawBitmap.height !== height) {
|
|
65
65
|
if (width > 0 && height > 0) {
|
|
66
66
|
this.mBitmapCanvas = new Canvas(width, height);
|
|
67
67
|
drawBitmap = this.mBitmapCanvas.getImage();
|
|
@@ -75,8 +75,8 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
75
75
|
this.mBitmapCanvas.clear();
|
|
76
76
|
}
|
|
77
77
|
let needsBitmapDrawing = false;
|
|
78
|
-
const pieData = this.mChart.
|
|
79
|
-
for (const set of pieData.
|
|
78
|
+
const pieData = this.mChart.data;
|
|
79
|
+
for (const set of pieData.dataSets) {
|
|
80
80
|
needsBitmapDrawing = this.drawDataSet(c, set) || needsBitmapDrawing;
|
|
81
81
|
}
|
|
82
82
|
if (needsBitmapDrawing) {
|
|
@@ -86,54 +86,70 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
86
86
|
}
|
|
87
87
|
calculateMinimumRadiusForSpacedSlice(center, radius, angle, arcStartPointX, arcStartPointY, startAngle, sweepAngle) {
|
|
88
88
|
const angleMiddle = startAngle + sweepAngle / 2;
|
|
89
|
+
// Other polet of the arc
|
|
89
90
|
const arcEndPointX = center.x + radius * Math.cos((startAngle + sweepAngle) * Utils.DEG2RAD);
|
|
90
91
|
const arcEndPointY = center.y + radius * Math.sin((startAngle + sweepAngle) * Utils.DEG2RAD);
|
|
92
|
+
// Middle polet on the arc
|
|
91
93
|
const arcMidPointX = center.x + radius * Math.cos(angleMiddle * Utils.DEG2RAD);
|
|
92
94
|
const arcMidPointY = center.y + radius * Math.sin(angleMiddle * Utils.DEG2RAD);
|
|
95
|
+
// This is the base of the contained triangle
|
|
93
96
|
const basePointsDistance = Math.sqrt(Math.pow(arcEndPointX - arcStartPointX, 2) + Math.pow(arcEndPointY - arcStartPointY, 2));
|
|
97
|
+
// After reducing space from both sides of the "slice",
|
|
98
|
+
// the angle of the contained triangle should stay the same.
|
|
99
|
+
// So let's find out the height of that triangle.
|
|
94
100
|
const containedTriangleHeight = (basePointsDistance / 2.0) * Math.tan(((180.0 - angle) / 2.0) * Utils.DEG2RAD);
|
|
101
|
+
// Now we subtract that from the radius
|
|
95
102
|
let spacedRadius = radius - containedTriangleHeight;
|
|
103
|
+
// And now subtract the height of the arc that's between the triangle and the outer circle
|
|
96
104
|
spacedRadius -= Math.sqrt(Math.pow(arcMidPointX - (arcEndPointX + arcStartPointX) / 2, 2) + Math.pow(arcMidPointY - (arcEndPointY + arcStartPointY) / 2, 2));
|
|
97
105
|
return spacedRadius;
|
|
98
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Calculates the sliceSpace to use based on visible values and their size compared to the set sliceSpace.
|
|
109
|
+
*
|
|
110
|
+
* @param dataSet
|
|
111
|
+
* @return
|
|
112
|
+
*/
|
|
99
113
|
getSliceSpace(dataSet) {
|
|
100
|
-
if (!dataSet.
|
|
101
|
-
return dataSet.
|
|
114
|
+
if (!dataSet.automaticallyDisableSliceSpacing) {
|
|
115
|
+
return dataSet.sliceSpace;
|
|
102
116
|
}
|
|
103
|
-
const spaceSizeRatio = dataSet.
|
|
104
|
-
const minValueRatio = (dataSet.
|
|
105
|
-
const sliceSpace = spaceSizeRatio > minValueRatio ? 0 : dataSet.
|
|
117
|
+
const spaceSizeRatio = dataSet.sliceSpace / this.mViewPortHandler.smallestContentExtension;
|
|
118
|
+
const minValueRatio = (dataSet.yMin / this.mChart.data.getYValueSum()) * 2;
|
|
119
|
+
const sliceSpace = spaceSizeRatio > minValueRatio ? 0 : dataSet.sliceSpace;
|
|
106
120
|
return sliceSpace;
|
|
107
121
|
}
|
|
108
122
|
drawDataSet(c, dataSet) {
|
|
123
|
+
const chart = this.mChart;
|
|
109
124
|
const result = false;
|
|
110
125
|
let angle = 0;
|
|
111
126
|
const yKey = dataSet.yProperty;
|
|
112
|
-
const rotationAngle =
|
|
113
|
-
const phaseX = this.
|
|
114
|
-
const phaseY = this.
|
|
115
|
-
const circleBox =
|
|
116
|
-
const entryCount = dataSet.
|
|
117
|
-
const drawAngles =
|
|
118
|
-
const center =
|
|
119
|
-
const radius =
|
|
120
|
-
const drawInnerArc =
|
|
121
|
-
const userInnerRadius = drawInnerArc ? radius * (
|
|
122
|
-
const roundedRadius = (radius - (radius *
|
|
127
|
+
const rotationAngle = chart.rotationAngle;
|
|
128
|
+
const phaseX = this.animator.phaseX;
|
|
129
|
+
const phaseY = this.animator.phaseY;
|
|
130
|
+
const circleBox = chart.circleBox;
|
|
131
|
+
const entryCount = dataSet.entryCount;
|
|
132
|
+
const drawAngles = chart.drawAngles;
|
|
133
|
+
const center = chart.centerCircleBox;
|
|
134
|
+
const radius = chart.radius;
|
|
135
|
+
const drawInnerArc = chart.drawHoleEnabled && !chart.drawSlicesUnderHoleEnabled;
|
|
136
|
+
const userInnerRadius = drawInnerArc ? radius * (chart.holeRadius / 100) : 0;
|
|
137
|
+
const roundedRadius = (radius - (radius * chart.holeRadius) / 100) / 2;
|
|
123
138
|
const roundedCircleBox = new RectF(0, 0, 0, 0);
|
|
124
|
-
const drawRoundedSlices = drawInnerArc &&
|
|
139
|
+
const drawRoundedSlices = drawInnerArc && chart.drawRoundedSlices;
|
|
125
140
|
let visibleAngleCount = 0;
|
|
126
141
|
for (let j = 0; j < entryCount; j++) {
|
|
142
|
+
// draw only if the value is greater than zero
|
|
127
143
|
if (Math.abs(dataSet.getEntryForIndex(j)[yKey]) > Utils.NUMBER_EPSILON) {
|
|
128
144
|
visibleAngleCount++;
|
|
129
145
|
}
|
|
130
146
|
}
|
|
131
147
|
const sliceSpace = visibleAngleCount <= 1 ? 0 : this.getSliceSpace(dataSet);
|
|
132
|
-
const customRender =
|
|
148
|
+
const customRender = chart.customRenderer;
|
|
133
149
|
const renderPaint = this.renderPaint;
|
|
134
150
|
const pathBuffer = Utils.getTempPath();
|
|
135
151
|
const previousShader = renderPaint.getShader();
|
|
136
|
-
const shader = dataSet.
|
|
152
|
+
const shader = dataSet.fillShader;
|
|
137
153
|
if (shader) {
|
|
138
154
|
renderPaint.setShader(shader);
|
|
139
155
|
}
|
|
@@ -141,11 +157,13 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
141
157
|
const sliceAngle = drawAngles[j];
|
|
142
158
|
let innerRadius = userInnerRadius;
|
|
143
159
|
const e = dataSet.getEntryForIndex(j);
|
|
160
|
+
// draw only if the value is greater than zero
|
|
144
161
|
if (!(Math.abs(e[yKey]) > Utils.NUMBER_EPSILON)) {
|
|
145
162
|
angle += sliceAngle * phaseX;
|
|
146
163
|
continue;
|
|
147
164
|
}
|
|
148
|
-
if
|
|
165
|
+
// Don't draw if it's highlighted, unless the chart uses rounded slices
|
|
166
|
+
if (chart.needsHighlight(j) && !drawRoundedSlices) {
|
|
149
167
|
angle += sliceAngle * phaseX;
|
|
150
168
|
continue;
|
|
151
169
|
}
|
|
@@ -166,6 +184,7 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
166
184
|
const arcStartPointX = center.x + radius * Math.cos(startAngleOuter * Utils.DEG2RAD);
|
|
167
185
|
const arcStartPointY = center.y + radius * Math.sin(startAngleOuter * Utils.DEG2RAD);
|
|
168
186
|
if (sweepAngleOuter >= 360 && sweepAngleOuter % 360 <= Utils.NUMBER_EPSILON) {
|
|
187
|
+
// Android is doing "mod 360"
|
|
169
188
|
pathBuffer.addCircle(center.x, center.y, radius, Direction.CW);
|
|
170
189
|
}
|
|
171
190
|
else {
|
|
@@ -174,6 +193,7 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
174
193
|
}
|
|
175
194
|
pathBuffer.arcTo(circleBox, startAngleOuter, sweepAngleOuter);
|
|
176
195
|
}
|
|
196
|
+
// Android API < 21 does not receive floats in addArc, but a RectF
|
|
177
197
|
if (drawInnerArc && (innerRadius > 0 || accountForSliceSpacing)) {
|
|
178
198
|
const innerRectBuffer = Utils.getTempRectF();
|
|
179
199
|
innerRectBuffer.set(center.x - innerRadius, center.y - innerRadius, center.x + innerRadius, center.y + innerRadius);
|
|
@@ -192,6 +212,7 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
192
212
|
}
|
|
193
213
|
const endAngleInner = startAngleInner + sweepAngleInner;
|
|
194
214
|
if (sweepAngleOuter >= 360 && sweepAngleOuter % 360 <= Utils.NUMBER_EPSILON) {
|
|
215
|
+
// Android is doing "mod 360"
|
|
195
216
|
pathBuffer.addCircle(center.x, center.y, innerRadius, Direction.CCW);
|
|
196
217
|
}
|
|
197
218
|
else {
|
|
@@ -234,25 +255,28 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
234
255
|
return result;
|
|
235
256
|
}
|
|
236
257
|
drawValues(c) {
|
|
237
|
-
const
|
|
238
|
-
const
|
|
239
|
-
const
|
|
240
|
-
|
|
258
|
+
const chart = this.mChart;
|
|
259
|
+
const drawEntryLabels = chart.drawEntryLabels;
|
|
260
|
+
const data = chart.data;
|
|
261
|
+
const dataSets = data.dataSets;
|
|
262
|
+
if (!drawEntryLabels || dataSets.some((d) => d.drawValuesEnabled || d.drawIconsEnabled) === false) {
|
|
241
263
|
return;
|
|
242
264
|
}
|
|
243
|
-
const center =
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
const
|
|
249
|
-
const
|
|
250
|
-
const
|
|
251
|
-
const
|
|
265
|
+
const center = chart.centerCircleBox;
|
|
266
|
+
// Get whole the radius
|
|
267
|
+
const radius = chart.radius;
|
|
268
|
+
let rotationAngle = chart.rotationAngle;
|
|
269
|
+
const drawAngles = chart.drawAngles;
|
|
270
|
+
const absoluteAngles = chart.absoluteAngles;
|
|
271
|
+
const phaseX = this.animator.phaseX;
|
|
272
|
+
const phaseY = this.animator.phaseY;
|
|
273
|
+
const roundedRadius = (radius - (radius * chart.holeRadius) / 100) / 2;
|
|
274
|
+
const holeRadiusPercent = chart.holeRadius / 100;
|
|
252
275
|
let labelRadiusOffset = (radius / 10) * 3.6;
|
|
253
|
-
if (
|
|
276
|
+
if (chart.drawHoleEnabled) {
|
|
254
277
|
labelRadiusOffset = (radius - radius * holeRadiusPercent) / 2;
|
|
255
|
-
if (!
|
|
278
|
+
if (!chart.drawSlicesUnderHoleEnabled && chart.drawRoundedSlices) {
|
|
279
|
+
// Add curved circle slice and spacing to rotation angle, so that it sits nicely inside
|
|
256
280
|
rotationAngle += (roundedRadius * 360) / (Math.PI * 2 * radius);
|
|
257
281
|
}
|
|
258
282
|
}
|
|
@@ -264,28 +288,29 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
264
288
|
const offset = 5;
|
|
265
289
|
const paint = this.valuePaint;
|
|
266
290
|
const entryLabelsPaint = drawEntryLabels ? this.entryLabelsPaint : undefined;
|
|
267
|
-
const customRender =
|
|
291
|
+
const customRender = chart.customRenderer;
|
|
268
292
|
const valueLinePaint = Utils.getTempPaint();
|
|
269
293
|
valueLinePaint.setStyle(Style.STROKE);
|
|
270
294
|
for (let i = 0; i < dataSets.length; i++) {
|
|
271
295
|
const dataSet = dataSets[i];
|
|
272
|
-
const drawValues = dataSet.
|
|
296
|
+
const drawValues = dataSet.drawValuesEnabled;
|
|
273
297
|
if (!drawValues) {
|
|
274
298
|
continue;
|
|
275
299
|
}
|
|
276
300
|
const yKey = dataSet.yProperty;
|
|
277
|
-
const xValuePosition = dataSet.
|
|
278
|
-
const yValuePosition = dataSet.
|
|
301
|
+
const xValuePosition = dataSet.xValuePosition;
|
|
302
|
+
const yValuePosition = dataSet.yValuePosition;
|
|
303
|
+
// Apply the text-styling defined by the DataSet
|
|
279
304
|
this.applyValueTextStyle(dataSet);
|
|
280
305
|
const lineHeight = Utils.calcTextHeight(paint, 'Q') + 4;
|
|
281
|
-
const formatter = dataSet.
|
|
282
|
-
const entryCount = dataSet.
|
|
283
|
-
valueLinePaint.setColor(dataSet.
|
|
284
|
-
valueLinePaint.setStrokeWidth(dataSet.
|
|
306
|
+
const formatter = dataSet.valueFormatter;
|
|
307
|
+
const entryCount = dataSet.entryCount;
|
|
308
|
+
valueLinePaint.setColor(dataSet.valueLineColor);
|
|
309
|
+
valueLinePaint.setStrokeWidth(dataSet.valueLineWidth);
|
|
285
310
|
const sliceSpace = this.getSliceSpace(dataSet);
|
|
286
|
-
const iconsOffset = dataSet.
|
|
287
|
-
const valuesOffset = dataSet.
|
|
288
|
-
const isDrawIconsEnabled = dataSet.
|
|
311
|
+
const iconsOffset = dataSet.iconsOffset;
|
|
312
|
+
const valuesOffset = dataSet.valuesOffset;
|
|
313
|
+
const isDrawIconsEnabled = dataSet.drawIconsEnabled;
|
|
289
314
|
for (let j = 0; j < entryCount; j++) {
|
|
290
315
|
const entry = dataSet.getEntryForIndex(j);
|
|
291
316
|
if (xIndex === 0) {
|
|
@@ -296,11 +321,12 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
296
321
|
}
|
|
297
322
|
const sliceAngle = drawAngles[xIndex];
|
|
298
323
|
const sliceSpaceMiddleAngle = sliceSpace / (Utils.DEG2RAD * labelRadius);
|
|
324
|
+
// offset needed to center the drawn text in the slice
|
|
299
325
|
const angleOffset = (sliceAngle - sliceSpaceMiddleAngle / 2) / 2;
|
|
300
326
|
angle = angle + angleOffset;
|
|
301
327
|
const transformedAngle = rotationAngle + angle * phaseY;
|
|
302
|
-
const value =
|
|
303
|
-
const formattedValue = formatter.getPieLabel(value, entry);
|
|
328
|
+
const value = chart.usePercentValues ? (entry[yKey] / yValueSum) * 100 : entry[yKey];
|
|
329
|
+
const formattedValue = (formatter.getPieLabel || formatter.getFormattedValue)(value, entry);
|
|
304
330
|
const entryLabel = entry.label;
|
|
305
331
|
const sliceXBase = Math.cos(transformedAngle * Utils.DEG2RAD);
|
|
306
332
|
const sliceYBase = Math.sin(transformedAngle * Utils.DEG2RAD);
|
|
@@ -309,19 +335,19 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
309
335
|
const drawXInside = drawEntryLabels && xValuePosition === ValuePosition.INSIDE_SLICE;
|
|
310
336
|
const drawYInside = drawValues && yValuePosition === ValuePosition.INSIDE_SLICE;
|
|
311
337
|
if (drawXOutside || drawYOutside) {
|
|
312
|
-
const valueLineLength1 = dataSet.
|
|
313
|
-
const valueLineLength2 = dataSet.
|
|
314
|
-
const valueLinePart1OffsetPercentage = dataSet.
|
|
338
|
+
const valueLineLength1 = dataSet.valueLinePart1Length;
|
|
339
|
+
const valueLineLength2 = dataSet.valueLinePart2Length;
|
|
340
|
+
const valueLinePart1OffsetPercentage = dataSet.valueLinePart1OffsetPercentage / 100;
|
|
315
341
|
let pt2x, pt2y;
|
|
316
342
|
let labelPtx, labelPty;
|
|
317
343
|
let line1Radius;
|
|
318
|
-
if (
|
|
344
|
+
if (chart.drawHoleEnabled) {
|
|
319
345
|
line1Radius = (radius - radius * holeRadiusPercent) * valueLinePart1OffsetPercentage + radius * holeRadiusPercent;
|
|
320
346
|
}
|
|
321
347
|
else {
|
|
322
348
|
line1Radius = radius * valueLinePart1OffsetPercentage;
|
|
323
349
|
}
|
|
324
|
-
const polyline2Width = dataSet.
|
|
350
|
+
const polyline2Width = dataSet.valueLineVariableLength ? labelRadius * valueLineLength2 * Math.abs(Math.sin(transformedAngle * Utils.DEG2RAD)) : labelRadius * valueLineLength2;
|
|
325
351
|
const pt0x = line1Radius * sliceXBase + center.x;
|
|
326
352
|
const pt0y = line1Radius * sliceYBase + center.y;
|
|
327
353
|
const pt1x = labelRadius * (1 + valueLineLength1) * sliceXBase + center.x;
|
|
@@ -346,59 +372,69 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
346
372
|
labelPtx = pt2x + offset;
|
|
347
373
|
labelPty = pt2y;
|
|
348
374
|
}
|
|
349
|
-
if (dataSet.
|
|
350
|
-
if (dataSet.
|
|
375
|
+
if (dataSet.valueLineColor !== ColorTemplate.COLOR_NONE) {
|
|
376
|
+
if (dataSet.usingSliceColorAsValueLineColor) {
|
|
351
377
|
valueLinePaint.setColor(dataSet.getColor(j));
|
|
352
378
|
}
|
|
353
379
|
c.drawLine(pt0x, pt0y, pt1x, pt1y, valueLinePaint);
|
|
354
380
|
c.drawLine(pt1x, pt1y, pt2x, pt2y, valueLinePaint);
|
|
355
381
|
}
|
|
382
|
+
// draw everything, depending on settings
|
|
356
383
|
if (drawXOutside && drawYOutside) {
|
|
357
|
-
this.drawValue(c, formattedValue, labelPtx + valuesOffset.x, labelPty + valuesOffset.y, dataSet.getValueTextColor(j), paint, customRender);
|
|
358
|
-
if (j < data.
|
|
384
|
+
this.drawValue(c, chart, dataSet, i, entry, j, formattedValue, labelPtx + valuesOffset.x, labelPty + valuesOffset.y, dataSet.getValueTextColor(j), paint, customRender);
|
|
385
|
+
if (j < data.entryCount && entryLabel) {
|
|
359
386
|
this.drawEntryLabel(c, entryLabel, labelPtx, labelPty + lineHeight, entryLabelsPaint);
|
|
360
387
|
}
|
|
361
388
|
}
|
|
362
389
|
else if (drawXOutside) {
|
|
363
|
-
if (j < data.
|
|
390
|
+
if (j < data.entryCount && entryLabel) {
|
|
364
391
|
this.drawEntryLabel(c, entryLabel, labelPtx, labelPty + lineHeight / 2, entryLabelsPaint);
|
|
365
392
|
}
|
|
366
393
|
}
|
|
367
394
|
else if (drawYOutside) {
|
|
368
|
-
this.drawValue(c, formattedValue, labelPtx + valuesOffset.x, labelPty + valuesOffset.y + lineHeight / 2, dataSet.getValueTextColor(j), paint, customRender);
|
|
395
|
+
this.drawValue(c, chart, dataSet, i, entry, j, formattedValue, labelPtx + valuesOffset.x, labelPty + valuesOffset.y + lineHeight / 2, dataSet.getValueTextColor(j), paint, customRender);
|
|
369
396
|
}
|
|
370
397
|
}
|
|
371
398
|
if (drawXInside || drawYInside) {
|
|
399
|
+
// calculate the text position
|
|
372
400
|
const x = labelRadius * sliceXBase + center.x;
|
|
373
401
|
const y = labelRadius * sliceYBase + center.y;
|
|
374
402
|
paint.setTextAlign(Align.CENTER);
|
|
403
|
+
// draw everything, depending on settings
|
|
375
404
|
if (drawXInside && drawYInside) {
|
|
376
|
-
this.drawValue(c, formattedValue, x + valuesOffset.x, y + valuesOffset.y, dataSet.getValueTextColor(j), paint, customRender);
|
|
377
|
-
if (j < data.
|
|
405
|
+
this.drawValue(c, chart, dataSet, i, entry, j, formattedValue, x + valuesOffset.x, y + valuesOffset.y, dataSet.getValueTextColor(j), paint, customRender);
|
|
406
|
+
if (j < data.entryCount && entryLabel) {
|
|
378
407
|
this.drawEntryLabel(c, entryLabel, x, y + lineHeight, entryLabelsPaint);
|
|
379
408
|
}
|
|
380
409
|
}
|
|
381
410
|
else if (drawXInside) {
|
|
382
|
-
if (j < data.
|
|
411
|
+
if (j < data.entryCount && entryLabel) {
|
|
383
412
|
this.drawEntryLabel(c, entryLabel, x, y + lineHeight / 2, entryLabelsPaint);
|
|
384
413
|
}
|
|
385
414
|
}
|
|
386
415
|
else if (drawYInside) {
|
|
387
|
-
this.drawValue(c, formattedValue, x + valuesOffset.x, y + valuesOffset.y + lineHeight / 2, dataSet.getValueTextColor(j), paint, customRender);
|
|
416
|
+
this.drawValue(c, chart, dataSet, i, entry, j, formattedValue, x + valuesOffset.x, y + valuesOffset.y + lineHeight / 2, dataSet.getValueTextColor(j), paint, customRender);
|
|
388
417
|
}
|
|
389
418
|
}
|
|
390
|
-
if (isDrawIconsEnabled
|
|
391
|
-
const icon = entry.icon;
|
|
419
|
+
if (isDrawIconsEnabled) {
|
|
392
420
|
const x = (labelRadius + iconsOffset.y) * sliceXBase + center.x;
|
|
393
421
|
let y = (labelRadius + iconsOffset.y) * sliceYBase + center.y;
|
|
394
422
|
y += iconsOffset.x;
|
|
395
|
-
|
|
423
|
+
this.drawIcon(c, chart, dataSet, i, entry, j, dataSet.getEntryIcon(entry), x, y, customRender);
|
|
396
424
|
}
|
|
397
425
|
xIndex++;
|
|
398
426
|
}
|
|
399
427
|
}
|
|
400
428
|
c.restore();
|
|
401
429
|
}
|
|
430
|
+
/**
|
|
431
|
+
* Draws an entry label at the specified position.
|
|
432
|
+
*
|
|
433
|
+
* @param c
|
|
434
|
+
* @param label
|
|
435
|
+
* @param x
|
|
436
|
+
* @param y
|
|
437
|
+
*/
|
|
402
438
|
drawEntryLabel(c, label, x, y, paint) {
|
|
403
439
|
c.drawText(label.toString(), x, y, paint);
|
|
404
440
|
}
|
|
@@ -409,37 +445,51 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
409
445
|
}
|
|
410
446
|
this.drawCenterText(c);
|
|
411
447
|
}
|
|
448
|
+
/**
|
|
449
|
+
* Draws the hole in the center of the chart and the transparent circle /
|
|
450
|
+
* hole.
|
|
451
|
+
*/
|
|
412
452
|
drawHole(c) {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
const
|
|
416
|
-
const
|
|
453
|
+
const chart = this.mChart;
|
|
454
|
+
if (chart.drawHoleEnabled) {
|
|
455
|
+
const radius = chart.radius;
|
|
456
|
+
const holeRadius = radius * (chart.holeRadius / 100);
|
|
457
|
+
const center = chart.centerCircleBox;
|
|
417
458
|
const paint = this.holePaint;
|
|
418
459
|
if (ColorTemplate.getColorInstance(paint.getColor()).a > 0) {
|
|
460
|
+
// draw the hole-circle
|
|
419
461
|
c.drawCircle(center.x, center.y, holeRadius, paint);
|
|
420
462
|
}
|
|
421
463
|
const transparentCirclePaint = this.transparentCirclePaint;
|
|
422
|
-
if
|
|
464
|
+
// only draw the circle if it can be seen (not covered by the hole)
|
|
465
|
+
if (ColorTemplate.getColorInstance(transparentCirclePaint.getColor()).a > 0 && chart.transparentCircleRadiusPercent > chart.holeRadius) {
|
|
423
466
|
const alpha = transparentCirclePaint.getAlpha();
|
|
424
|
-
const secondHoleRadius = radius * (
|
|
425
|
-
transparentCirclePaint.setAlpha(alpha * this.
|
|
467
|
+
const secondHoleRadius = radius * (chart.transparentCircleRadiusPercent / 100);
|
|
468
|
+
transparentCirclePaint.setAlpha(alpha * this.animator.phaseX * this.animator.phaseY);
|
|
469
|
+
// draw the transparent-circle
|
|
426
470
|
const path = Utils.getTempPath();
|
|
427
471
|
path.reset();
|
|
428
472
|
path.addCircle(center.x, center.y, secondHoleRadius, Direction.CW);
|
|
429
473
|
path.addCircle(center.x, center.y, holeRadius, Direction.CCW);
|
|
430
474
|
c.drawPath(path, transparentCirclePaint);
|
|
475
|
+
// reset alpha
|
|
431
476
|
transparentCirclePaint.setAlpha(alpha);
|
|
432
477
|
}
|
|
433
478
|
}
|
|
434
479
|
}
|
|
480
|
+
/**
|
|
481
|
+
* Draws the description text in the center of the pie chart makes most
|
|
482
|
+
* sense when center-hole is enabled.
|
|
483
|
+
*/
|
|
435
484
|
drawCenterText(c) {
|
|
436
|
-
const
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
const
|
|
485
|
+
const chart = this.mChart;
|
|
486
|
+
const centerText = chart.centerText;
|
|
487
|
+
if (centerText && chart.drawCenterText) {
|
|
488
|
+
const center = chart.centerCircleBox;
|
|
489
|
+
const offset = chart.centerTextOffset;
|
|
440
490
|
const x = center.x + offset.x;
|
|
441
491
|
const y = center.y + offset.y;
|
|
442
|
-
const innerRadius =
|
|
492
|
+
const innerRadius = chart.drawHoleEnabled && !chart.drawSlicesUnderHoleEnabled ? chart.radius * (chart.holeRadius / 100) : chart.radius;
|
|
443
493
|
const rectBuffer = this.rectBuffer;
|
|
444
494
|
const holeRect = rectBuffer[0];
|
|
445
495
|
holeRect.left = x - innerRadius;
|
|
@@ -448,17 +498,20 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
448
498
|
holeRect.bottom = y + innerRadius;
|
|
449
499
|
const boundingRect = rectBuffer[1];
|
|
450
500
|
boundingRect.set(holeRect);
|
|
451
|
-
const radiusPercent =
|
|
501
|
+
const radiusPercent = chart.centerTextRadiusPercent / 100;
|
|
452
502
|
if (radiusPercent > 0.0) {
|
|
453
503
|
boundingRect.inset((boundingRect.width() - boundingRect.width() * radiusPercent) / 2, (boundingRect.height() - boundingRect.height() * radiusPercent) / 2);
|
|
454
504
|
}
|
|
455
505
|
const centerTextLastBounds = this.centerTextLastBounds;
|
|
456
|
-
if (centerText !== this.mCenterTextLastValue || boundingRect !== centerTextLastBounds) {
|
|
506
|
+
if (!this.mCenterTextLayout || centerText !== this.mCenterTextLastValue || boundingRect !== centerTextLastBounds) {
|
|
507
|
+
// Next time we won't recalculate StaticLayout...
|
|
457
508
|
centerTextLastBounds.set(boundingRect);
|
|
458
509
|
this.mCenterTextLastValue = centerText;
|
|
459
510
|
const width = centerTextLastBounds.width();
|
|
511
|
+
// If width is 0, it will crash. Always have a minimum of 1
|
|
460
512
|
this.mCenterTextLayout = new StaticLayout(centerText, this.centerTextPaint, Math.max(Math.ceil(width), 1), LayoutAlignment.ALIGN_CENTER, 1, 0, false);
|
|
461
513
|
}
|
|
514
|
+
//let layoutWidth = Utils.getStaticLayoutMaxWidth(mCenterTextLayout);
|
|
462
515
|
const layoutHeight = this.mCenterTextLayout.getHeight();
|
|
463
516
|
c.save();
|
|
464
517
|
if (__ANDROID__) {
|
|
@@ -475,37 +528,44 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
475
528
|
}
|
|
476
529
|
}
|
|
477
530
|
drawHighlighted(c, indices) {
|
|
478
|
-
|
|
479
|
-
|
|
531
|
+
/* Skip entirely if using rounded circle slices, because it doesn't make sense to highlight
|
|
532
|
+
* in this way.
|
|
533
|
+
* TODO: add support for changing slice color with highlighting rather than only shifting the slice
|
|
534
|
+
*/
|
|
535
|
+
const chart = this.mChart;
|
|
536
|
+
const drawInnerArc = chart.drawHoleEnabled && !chart.drawSlicesUnderHoleEnabled;
|
|
537
|
+
if (drawInnerArc && chart.drawRoundedSlices) {
|
|
480
538
|
return;
|
|
481
539
|
}
|
|
482
|
-
const phaseX = this.
|
|
483
|
-
const phaseY = this.
|
|
540
|
+
const phaseX = this.animator.phaseX;
|
|
541
|
+
const phaseY = this.animator.phaseY;
|
|
484
542
|
let angle;
|
|
485
|
-
const rotationAngle =
|
|
486
|
-
const drawAngles =
|
|
487
|
-
const absoluteAngles =
|
|
488
|
-
const center =
|
|
489
|
-
const radius =
|
|
490
|
-
const userInnerRadius = drawInnerArc ? radius * (
|
|
543
|
+
const rotationAngle = chart.rotationAngle;
|
|
544
|
+
const drawAngles = chart.drawAngles;
|
|
545
|
+
const absoluteAngles = chart.absoluteAngles;
|
|
546
|
+
const center = chart.centerCircleBox;
|
|
547
|
+
const radius = chart.radius;
|
|
548
|
+
const userInnerRadius = drawInnerArc ? radius * (chart.holeRadius / 100) : 0;
|
|
491
549
|
const highlightedCircleBox = Utils.getTempRectF();
|
|
492
|
-
const customRender =
|
|
550
|
+
const customRender = chart.customRenderer;
|
|
493
551
|
const renderPaint = this.renderPaint;
|
|
494
552
|
const pathBuffer = Utils.getTempPath();
|
|
495
553
|
for (let i = 0; i < indices.length; i++) {
|
|
554
|
+
// get the index to highlight
|
|
496
555
|
const high = indices[i];
|
|
497
556
|
const index = high.x;
|
|
498
557
|
if (index >= drawAngles.length) {
|
|
499
558
|
continue;
|
|
500
559
|
}
|
|
501
|
-
const set =
|
|
502
|
-
if (set
|
|
560
|
+
const set = chart.data.getDataSetByIndex(high.dataSetIndex);
|
|
561
|
+
if (!set || !set.highlightEnabled) {
|
|
503
562
|
continue;
|
|
504
563
|
}
|
|
505
564
|
const yKey = set.yProperty;
|
|
506
|
-
const entryCount = set.
|
|
565
|
+
const entryCount = set.entryCount;
|
|
507
566
|
let visibleAngleCount = 0;
|
|
508
567
|
for (let j = 0; j < entryCount; j++) {
|
|
568
|
+
// draw only if the value is greater than zero
|
|
509
569
|
if (Math.abs(set.getEntryForIndex(j)[yKey]) > Utils.NUMBER_EPSILON) {
|
|
510
570
|
visibleAngleCount++;
|
|
511
571
|
}
|
|
@@ -516,12 +576,12 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
516
576
|
else {
|
|
517
577
|
angle = absoluteAngles[index - 1] * phaseX;
|
|
518
578
|
}
|
|
519
|
-
const sliceSpace = visibleAngleCount <= 1 ? 0 : set.
|
|
579
|
+
const sliceSpace = visibleAngleCount <= 1 ? 0 : set.sliceSpace;
|
|
520
580
|
const sliceAngle = drawAngles[index];
|
|
521
581
|
let innerRadius = userInnerRadius;
|
|
522
|
-
const shift = set.
|
|
582
|
+
const shift = set.selectionShift;
|
|
523
583
|
const highlightedRadius = radius + shift;
|
|
524
|
-
highlightedCircleBox.set(
|
|
584
|
+
highlightedCircleBox.set(chart.circleBox);
|
|
525
585
|
highlightedCircleBox.inset(-shift, -shift);
|
|
526
586
|
const accountForSliceSpacing = sliceSpace > 0 && sliceAngle <= 180;
|
|
527
587
|
renderPaint.setColor(set.getColor(index));
|
|
@@ -539,6 +599,7 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
539
599
|
}
|
|
540
600
|
pathBuffer.reset();
|
|
541
601
|
if (sweepAngleOuter >= 360 && sweepAngleOuter % 360 <= Utils.NUMBER_EPSILON) {
|
|
602
|
+
// Android is doing "mod 360"
|
|
542
603
|
pathBuffer.addCircle(center.x, center.y, highlightedRadius, Direction.CW);
|
|
543
604
|
}
|
|
544
605
|
else {
|
|
@@ -550,6 +611,7 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
550
611
|
sliceSpaceRadius = this.calculateMinimumRadiusForSpacedSlice(center, radius, sliceAngle * phaseY, center.x + radius * Math.cos(startAngleOuter * Utils.DEG2RAD), center.y + radius * Math.sin(startAngleOuter * Utils.DEG2RAD), startAngleOuter, sweepAngleOuter);
|
|
551
612
|
}
|
|
552
613
|
if (drawInnerArc && (innerRadius > 0 || accountForSliceSpacing)) {
|
|
614
|
+
// Android API < 21 does not receive floats in addArc, but a RectF
|
|
553
615
|
const innerRectBuffer = Utils.getTempRectF();
|
|
554
616
|
innerRectBuffer.set(center.x - innerRadius, center.y - innerRadius, center.x + innerRadius, center.y + innerRadius);
|
|
555
617
|
if (accountForSliceSpacing) {
|
|
@@ -566,6 +628,7 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
566
628
|
}
|
|
567
629
|
const endAngleInner = startAngleInner + sweepAngleInner;
|
|
568
630
|
if (sweepAngleOuter >= 360 && sweepAngleOuter % 360 <= Utils.NUMBER_EPSILON) {
|
|
631
|
+
// Android is doing "mod 360"
|
|
569
632
|
pathBuffer.addCircle(center.x, center.y, innerRadius, Direction.CCW);
|
|
570
633
|
}
|
|
571
634
|
else {
|
|
@@ -595,26 +658,34 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
595
658
|
}
|
|
596
659
|
}
|
|
597
660
|
}
|
|
661
|
+
/**
|
|
662
|
+
* This gives all pie-slices a rounded edge.
|
|
663
|
+
*
|
|
664
|
+
* @param c
|
|
665
|
+
*/
|
|
598
666
|
drawRoundedSlices(c) {
|
|
599
|
-
|
|
667
|
+
const chart = this.mChart;
|
|
668
|
+
if (!chart.drawRoundedSlices) {
|
|
600
669
|
return;
|
|
601
670
|
}
|
|
602
|
-
const dataSet =
|
|
603
|
-
if (!dataSet.
|
|
671
|
+
const dataSet = chart.data.getDataSet();
|
|
672
|
+
if (!dataSet.visible) {
|
|
604
673
|
return;
|
|
605
674
|
}
|
|
606
675
|
const yKey = dataSet.yProperty;
|
|
607
|
-
const phaseX = this.
|
|
608
|
-
const phaseY = this.
|
|
609
|
-
const center =
|
|
610
|
-
const r =
|
|
611
|
-
|
|
612
|
-
const
|
|
613
|
-
|
|
676
|
+
const phaseX = this.animator.phaseX;
|
|
677
|
+
const phaseY = this.animator.phaseY;
|
|
678
|
+
const center = chart.centerCircleBox;
|
|
679
|
+
const r = chart.radius;
|
|
680
|
+
// calculate the radius of the "slice-circle"
|
|
681
|
+
const circleRadius = (r - (r * chart.holeRadius) / 100) / 2;
|
|
682
|
+
const drawAngles = chart.drawAngles;
|
|
683
|
+
let angle = chart.rotationAngle;
|
|
614
684
|
const renderPaint = this.renderPaint;
|
|
615
|
-
for (let j = 0; j < dataSet.
|
|
685
|
+
for (let j = 0; j < dataSet.entryCount; j++) {
|
|
616
686
|
const sliceAngle = drawAngles[j];
|
|
617
687
|
const e = dataSet.getEntryForIndex(j);
|
|
688
|
+
// draw only if the value is greater than zero
|
|
618
689
|
if (Math.abs(e[yKey]) > Utils.NUMBER_EPSILON) {
|
|
619
690
|
const x = (r - circleRadius) * Math.cos((angle + sliceAngle) * phaseY * Utils.DEG2RAD) + center.x;
|
|
620
691
|
const y = (r - circleRadius) * Math.sin((angle + sliceAngle) * phaseY * Utils.DEG2RAD) + center.y;
|
|
@@ -624,17 +695,19 @@ export class PieChartRenderer extends DataRenderer {
|
|
|
624
695
|
angle += sliceAngle * phaseX;
|
|
625
696
|
}
|
|
626
697
|
}
|
|
698
|
+
/**
|
|
699
|
+
* Releases the drawing bitmap.
|
|
700
|
+
*/
|
|
627
701
|
releaseBitmap() {
|
|
628
|
-
if (this.mBitmapCanvas
|
|
702
|
+
if (this.mBitmapCanvas) {
|
|
629
703
|
this.mBitmapCanvas.setBitmap(null);
|
|
630
704
|
this.mBitmapCanvas = null;
|
|
631
705
|
}
|
|
632
|
-
if (this.mDrawBitmap
|
|
706
|
+
if (this.mDrawBitmap) {
|
|
633
707
|
const drawBitmap = this.mDrawBitmap.get();
|
|
634
|
-
if (drawBitmap
|
|
708
|
+
if (drawBitmap) {
|
|
635
709
|
releaseImage(drawBitmap);
|
|
636
710
|
}
|
|
637
|
-
this.mDrawBitmap.clear();
|
|
638
711
|
this.mDrawBitmap = null;
|
|
639
712
|
}
|
|
640
713
|
}
|