@nativescript-community/ui-chart 1.2.36 → 2.0.1
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 +420 -91
- 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 +275 -20
- package/data/ChartData.js +400 -95
- 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 +84 -49
- package/data/LineDataSet.js +94 -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 +129 -25
- 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 +82 -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 +56 -1
- package/listener/PieRadarChartTouchListener.js +201 -17
- 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 +198 -113
- 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/charts/index.d.ts +0 -11
- package/charts/index.js +0 -15
- package/charts/index.js.map +0 -1
|
@@ -12,9 +12,13 @@ function almostEquals(x, y, epsilon) {
|
|
|
12
12
|
return Math.abs(x - y) < epsilon;
|
|
13
13
|
}
|
|
14
14
|
function _isPointInArea(point, area, margin = 0.5) {
|
|
15
|
+
// margin - default is to match rounded decimals
|
|
15
16
|
return point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;
|
|
16
17
|
}
|
|
17
18
|
export function splineCurve(firstPoint, middlePoint, afterPoint, tension) {
|
|
19
|
+
// Props to Rob Spencer at scaled innovation for his post on splining between points
|
|
20
|
+
// http://scaledinnovation.com/analytics/splines/aboutSplines.html
|
|
21
|
+
// This function must also respect "skipped" points
|
|
18
22
|
const previous = firstPoint;
|
|
19
23
|
const current = middlePoint;
|
|
20
24
|
const next = afterPoint;
|
|
@@ -22,9 +26,10 @@ export function splineCurve(firstPoint, middlePoint, afterPoint, tension) {
|
|
|
22
26
|
const d12 = distanceBetweenPoints(next, current);
|
|
23
27
|
let s01 = d01 / (d01 + d12);
|
|
24
28
|
let s12 = d12 / (d01 + d12);
|
|
29
|
+
// If all points are the same, s01 & s02 will be inf
|
|
25
30
|
s01 = isNaN(s01) ? 0 : s01;
|
|
26
31
|
s12 = isNaN(s12) ? 0 : s12;
|
|
27
|
-
const fa = tension * s01;
|
|
32
|
+
const fa = tension * s01; // scaling factor for triangle Ta
|
|
28
33
|
const fb = tension * s12;
|
|
29
34
|
return {
|
|
30
35
|
previous: {
|
|
@@ -40,16 +45,24 @@ export function splineCurve(firstPoint, middlePoint, afterPoint, tension) {
|
|
|
40
45
|
function getXYValue(dataSet, index) {
|
|
41
46
|
const yKey = dataSet.yProperty;
|
|
42
47
|
const entry = dataSet.getEntryForIndex(index);
|
|
43
|
-
|
|
48
|
+
const yVal = entry[yKey];
|
|
49
|
+
if (yVal === undefined || yVal === null) {
|
|
44
50
|
return null;
|
|
45
51
|
}
|
|
46
52
|
return { x: dataSet.getEntryXValue(entry, index), y: entry[yKey] };
|
|
47
53
|
}
|
|
54
|
+
// fix drawing "too" thin paths on iOS
|
|
48
55
|
export class DataSetImageCache {
|
|
56
|
+
/**
|
|
57
|
+
* Sets up the cache, returns true if a change of cache was required.
|
|
58
|
+
*
|
|
59
|
+
* @param set
|
|
60
|
+
* @return
|
|
61
|
+
*/
|
|
49
62
|
init(set) {
|
|
50
|
-
const size = set.
|
|
63
|
+
const size = set.circleColors.length || 1;
|
|
51
64
|
let changeRequired = false;
|
|
52
|
-
if (this.circleBitmaps
|
|
65
|
+
if (!this.circleBitmaps) {
|
|
53
66
|
this.circleBitmaps = [];
|
|
54
67
|
changeRequired = true;
|
|
55
68
|
}
|
|
@@ -59,22 +72,34 @@ export class DataSetImageCache {
|
|
|
59
72
|
}
|
|
60
73
|
return changeRequired;
|
|
61
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Fills the cache with bitmaps for the given dataset.
|
|
77
|
+
*
|
|
78
|
+
* @param set
|
|
79
|
+
* @param drawCircleHole
|
|
80
|
+
* @param drawTransparentCircleHole
|
|
81
|
+
*/
|
|
62
82
|
fill(set, renderPaint, circlePaintInner, drawCircleHole, drawTransparentCircleHole) {
|
|
63
|
-
const colorCount = set.
|
|
64
|
-
const circleRadius = set.
|
|
65
|
-
const circleHoleRadius = set.
|
|
83
|
+
const colorCount = set.circleColors.length || 1;
|
|
84
|
+
const circleRadius = set.circleRadius;
|
|
85
|
+
const circleHoleRadius = set.circleHoleRadius;
|
|
66
86
|
const scale = set.circleHighRes ? Screen.mainScreen.scale : 1;
|
|
67
87
|
for (let i = 0; i < colorCount; i++) {
|
|
68
88
|
const canvas = new Canvas(Math.round(circleRadius * 2 * scale), Math.round(circleRadius * 2 * scale));
|
|
69
89
|
canvas.scale(scale, scale);
|
|
70
|
-
renderPaint.setColor(set.
|
|
90
|
+
renderPaint.setColor(set.circleColors[i] || set.color);
|
|
71
91
|
if (drawTransparentCircleHole) {
|
|
72
92
|
const circlePathBuffer = Utils.getTempPath();
|
|
93
|
+
// Begin path for circle with hole
|
|
73
94
|
circlePathBuffer.reset();
|
|
95
|
+
// const oldType = circlePathBuffer.getFillType();
|
|
74
96
|
circlePathBuffer.setFillType(FillType.EVEN_ODD);
|
|
75
97
|
circlePathBuffer.addCircle(circleRadius, circleRadius, circleRadius, Direction.CW);
|
|
98
|
+
// Cut hole in path
|
|
76
99
|
circlePathBuffer.addCircle(circleRadius, circleRadius, circleHoleRadius, Direction.CCW);
|
|
100
|
+
// Fill in-between
|
|
77
101
|
canvas.drawPath(circlePathBuffer, renderPaint);
|
|
102
|
+
// circlePathBuffer.setFillType(oldType);
|
|
78
103
|
}
|
|
79
104
|
else {
|
|
80
105
|
canvas.drawCircle(circleRadius, circleRadius, circleRadius, renderPaint);
|
|
@@ -85,22 +110,34 @@ export class DataSetImageCache {
|
|
|
85
110
|
this.circleBitmaps[i] = canvas.getImage();
|
|
86
111
|
}
|
|
87
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Returns the cached Bitmap at the given index.
|
|
115
|
+
*
|
|
116
|
+
* @param index
|
|
117
|
+
* @return
|
|
118
|
+
*/
|
|
88
119
|
getBitmap(index) {
|
|
89
120
|
return this.circleBitmaps[index % this.circleBitmaps.length];
|
|
90
121
|
}
|
|
91
122
|
}
|
|
92
123
|
export class LineChartRenderer extends LineRadarRenderer {
|
|
93
|
-
constructor(chart, animator, viewPortHandler) {
|
|
94
|
-
super(animator, viewPortHandler);
|
|
95
|
-
this.mImageCaches = new Map();
|
|
96
|
-
this.mChart = chart;
|
|
97
|
-
}
|
|
98
124
|
get fillPath() {
|
|
99
125
|
if (!LineChartRenderer.mFillPath) {
|
|
100
126
|
LineChartRenderer.mFillPath = new Path();
|
|
101
127
|
}
|
|
102
128
|
return LineChartRenderer.mFillPath;
|
|
103
129
|
}
|
|
130
|
+
constructor(chart, animator, viewPortHandler) {
|
|
131
|
+
super(animator, viewPortHandler);
|
|
132
|
+
/**
|
|
133
|
+
* cache for the circle bitmaps of all datasets
|
|
134
|
+
*/
|
|
135
|
+
this.mImageCaches = new Map();
|
|
136
|
+
this.mChart = chart;
|
|
137
|
+
// if (__ANDROID__) {
|
|
138
|
+
// this.mBitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
|
|
139
|
+
// }
|
|
140
|
+
}
|
|
104
141
|
get circlePaintInner() {
|
|
105
142
|
if (!this.mCirclePaintInner) {
|
|
106
143
|
this.mCirclePaintInner = Utils.getTemplatePaint('white-fill');
|
|
@@ -108,10 +145,10 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
108
145
|
return this.mCirclePaintInner;
|
|
109
146
|
}
|
|
110
147
|
drawData(c) {
|
|
111
|
-
const width = this.mViewPortHandler.
|
|
112
|
-
const height = this.mViewPortHandler.
|
|
113
|
-
let drawBitmap = this.mDrawBitmap
|
|
114
|
-
if (drawBitmap
|
|
148
|
+
const width = this.mViewPortHandler.chartWidth;
|
|
149
|
+
const height = this.mViewPortHandler.chartHeight;
|
|
150
|
+
let drawBitmap = this.mDrawBitmap?.get();
|
|
151
|
+
if (!drawBitmap || drawBitmap.width !== width || drawBitmap.height !== height) {
|
|
115
152
|
if (width > 0 && height > 0) {
|
|
116
153
|
this.mBitmapCanvas = new Canvas(width, height);
|
|
117
154
|
drawBitmap = this.mBitmapCanvas.getImage();
|
|
@@ -123,9 +160,9 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
123
160
|
else {
|
|
124
161
|
this.mBitmapCanvas.clear();
|
|
125
162
|
}
|
|
126
|
-
const lineData = this.mChart.
|
|
163
|
+
const lineData = this.mChart.lineData;
|
|
127
164
|
let needsBitmapDrawing = false;
|
|
128
|
-
for (const set of lineData.
|
|
165
|
+
for (const set of lineData.visibleDataSets) {
|
|
129
166
|
needsBitmapDrawing = this.drawDataSet(c, set) || needsBitmapDrawing;
|
|
130
167
|
}
|
|
131
168
|
if (needsBitmapDrawing) {
|
|
@@ -134,31 +171,48 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
134
171
|
}
|
|
135
172
|
}
|
|
136
173
|
drawDataSet(c, dataSet) {
|
|
137
|
-
if (dataSet.
|
|
174
|
+
if (dataSet.entryCount < 1)
|
|
138
175
|
return false;
|
|
139
176
|
const renderPaint = this.renderPaint;
|
|
140
|
-
renderPaint.setStrokeWidth(dataSet.
|
|
141
|
-
|
|
177
|
+
renderPaint.setStrokeWidth(dataSet.lineWidth);
|
|
178
|
+
if (dataSet.dashPathEffect) {
|
|
179
|
+
renderPaint.setPathEffect(dataSet.dashPathEffect);
|
|
180
|
+
}
|
|
181
|
+
if (dataSet.shader) {
|
|
182
|
+
renderPaint.setShader(dataSet.shader);
|
|
183
|
+
}
|
|
142
184
|
renderPaint.setColor(dataSet.getColor());
|
|
143
185
|
renderPaint.setStyle(Style.STROKE);
|
|
144
186
|
const scaleX = this.mViewPortHandler.getScaleX();
|
|
145
187
|
dataSet.applyFiltering(scaleX);
|
|
146
188
|
const result = this.draw(c, dataSet);
|
|
147
|
-
|
|
189
|
+
if (dataSet.dashPathEffect) {
|
|
190
|
+
renderPaint.setPathEffect(null);
|
|
191
|
+
}
|
|
192
|
+
if (dataSet.shader) {
|
|
193
|
+
renderPaint.setShader(null);
|
|
194
|
+
}
|
|
148
195
|
return result;
|
|
149
196
|
}
|
|
150
197
|
generateHorizontalBezierPath(dataSet, outputPath) {
|
|
151
198
|
if (this.mXBounds.range >= 1) {
|
|
152
199
|
const pointsPerEntryPair = 6;
|
|
153
|
-
const entryCount = dataSet.
|
|
200
|
+
const entryCount = dataSet.entryCount;
|
|
154
201
|
if (!this.mLineBuffer || this.mLineBuffer.length < Math.max(entryCount * pointsPerEntryPair, pointsPerEntryPair) * 2) {
|
|
155
202
|
this.mLineBuffer = Utils.createArrayBuffer(Math.max(entryCount * pointsPerEntryPair, pointsPerEntryPair) * 2);
|
|
156
203
|
}
|
|
157
|
-
const phaseY = this.
|
|
204
|
+
const phaseY = this.animator.phaseY;
|
|
158
205
|
const yKey = dataSet.yProperty;
|
|
159
|
-
|
|
206
|
+
let firstIndex = Math.max(0, this.mXBounds.min);
|
|
207
|
+
// let firstIndex = this.mXBounds.min + 1;
|
|
160
208
|
const lastIndex = this.mXBounds.min + this.mXBounds.range;
|
|
161
209
|
let prev = dataSet.getEntryForIndex(firstIndex);
|
|
210
|
+
let yVal = prev[yKey];
|
|
211
|
+
while (firstIndex < lastIndex && (yVal === undefined || yVal === null)) {
|
|
212
|
+
firstIndex++;
|
|
213
|
+
prev = dataSet.getEntryForIndex(firstIndex);
|
|
214
|
+
yVal = prev[yKey];
|
|
215
|
+
}
|
|
162
216
|
let prevXVal = dataSet.getEntryXValue(prev, firstIndex);
|
|
163
217
|
let cur = prev;
|
|
164
218
|
let curXVal = prevXVal;
|
|
@@ -166,9 +220,11 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
166
220
|
let index = 0;
|
|
167
221
|
float32arr[index++] = prevXVal;
|
|
168
222
|
float32arr[index++] = cur[yKey] * phaseY;
|
|
223
|
+
// let the spline start
|
|
169
224
|
for (let j = firstIndex + 1; j <= lastIndex; j++) {
|
|
170
225
|
const newEntry = dataSet.getEntryForIndex(j);
|
|
171
|
-
|
|
226
|
+
const yVal = newEntry[yKey];
|
|
227
|
+
if (yVal === undefined || yVal === null) {
|
|
172
228
|
continue;
|
|
173
229
|
}
|
|
174
230
|
prev = cur;
|
|
@@ -200,15 +256,20 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
200
256
|
generateCubicPath(dataSet, outputPath) {
|
|
201
257
|
if (this.mXBounds.range >= 1) {
|
|
202
258
|
const pointsPerEntryPair = 6;
|
|
203
|
-
const entryCount = dataSet.
|
|
259
|
+
const entryCount = dataSet.entryCount;
|
|
204
260
|
if (!this.mLineBuffer || this.mLineBuffer.length < Math.max(entryCount * pointsPerEntryPair, pointsPerEntryPair) * 2) {
|
|
205
261
|
this.mLineBuffer = Utils.createArrayBuffer(Math.max(entryCount * pointsPerEntryPair, pointsPerEntryPair) * 2);
|
|
206
262
|
}
|
|
207
|
-
const phaseY = this.
|
|
263
|
+
const phaseY = this.animator.phaseY;
|
|
208
264
|
const xKey = dataSet.xProperty;
|
|
209
265
|
const yKey = dataSet.yProperty;
|
|
210
|
-
const intensity = dataSet.
|
|
266
|
+
const intensity = dataSet.cubicIntensity;
|
|
267
|
+
// Take an extra polet from the left, and an extra from the right.
|
|
268
|
+
// That's because we need 4 points for a cubic bezier (cubic=4), otherwise we get lines moving and doing weird stuff on the edges of the chart.
|
|
269
|
+
// So in the starting `prev` and `cur`, go -2, -1
|
|
270
|
+
// And in the `lastIndex`, add +1
|
|
211
271
|
const firstIndex = Math.max(0, this.mXBounds.min);
|
|
272
|
+
// let firstIndex = this.mXBounds.min + 1;
|
|
212
273
|
const lastIndex = this.mXBounds.min + this.mXBounds.range;
|
|
213
274
|
const float32arr = this.mLineBuffer;
|
|
214
275
|
let index = 0;
|
|
@@ -221,21 +282,21 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
221
282
|
for (let j = firstIndex; j <= lastIndex; j++) {
|
|
222
283
|
point = getXYValue(dataSet, j);
|
|
223
284
|
if (!point) {
|
|
224
|
-
if (j === 0) {
|
|
225
|
-
|
|
226
|
-
}
|
|
285
|
+
// if (j === 0) {
|
|
286
|
+
// return [];
|
|
287
|
+
// }
|
|
227
288
|
continue;
|
|
228
289
|
}
|
|
229
290
|
if (!prev) {
|
|
230
291
|
prev = point;
|
|
231
292
|
}
|
|
232
|
-
nextIndex = j + 1 < dataSet.
|
|
293
|
+
nextIndex = j + 1 < dataSet.entryCount ? j + 1 : j;
|
|
233
294
|
next = getXYValue(dataSet, nextIndex);
|
|
234
295
|
if (!next) {
|
|
235
296
|
continue;
|
|
236
297
|
}
|
|
237
298
|
controlPoints = splineCurve(prev, point, next, intensity);
|
|
238
|
-
if (j ===
|
|
299
|
+
if (j === firstIndex) {
|
|
239
300
|
float32arr[index++] = point.x;
|
|
240
301
|
float32arr[index++] = point.y * phaseY;
|
|
241
302
|
}
|
|
@@ -266,26 +327,38 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
266
327
|
}
|
|
267
328
|
generateLinearPath(dataSet, outputPath) {
|
|
268
329
|
if (this.mXBounds.range >= 1) {
|
|
269
|
-
const isDrawSteppedEnabled = dataSet.
|
|
270
|
-
const entryCount = dataSet.
|
|
330
|
+
const isDrawSteppedEnabled = dataSet.mode === Mode.STEPPED;
|
|
331
|
+
const entryCount = dataSet.entryCount;
|
|
271
332
|
const pointsPerEntryPair = isDrawSteppedEnabled ? 4 : 2;
|
|
272
333
|
if (!this.mLineBuffer || this.mLineBuffer.length < Math.max(entryCount * pointsPerEntryPair, pointsPerEntryPair) * 2) {
|
|
273
334
|
this.mLineBuffer = Utils.createArrayBuffer(Math.max(entryCount * pointsPerEntryPair, pointsPerEntryPair) * 2);
|
|
274
335
|
}
|
|
275
|
-
const
|
|
336
|
+
const phaseX = this.animator.phaseX;
|
|
337
|
+
const phaseY = this.animator.phaseY;
|
|
276
338
|
const yKey = dataSet.yProperty;
|
|
277
|
-
const
|
|
339
|
+
// const filled = outputPath;
|
|
340
|
+
// outputPath.reset();
|
|
341
|
+
let firstIndex = Math.max(0, this.mXBounds.min);
|
|
278
342
|
const lastIndex = this.mXBounds.min + this.mXBounds.range;
|
|
279
|
-
|
|
280
|
-
|
|
343
|
+
let firstEntry = dataSet.getEntryForIndex(firstIndex);
|
|
344
|
+
let entryXVal = dataSet.getEntryXValue(firstEntry, firstIndex);
|
|
345
|
+
let yVal = firstEntry[yKey];
|
|
346
|
+
while (firstIndex < lastIndex && (yVal === undefined || yVal === null)) {
|
|
347
|
+
firstIndex++;
|
|
348
|
+
firstEntry = dataSet.getEntryForIndex(firstIndex);
|
|
349
|
+
entryXVal = dataSet.getEntryXValue(firstEntry, firstIndex);
|
|
350
|
+
yVal = firstEntry[yKey];
|
|
351
|
+
}
|
|
281
352
|
const float32arr = this.mLineBuffer;
|
|
282
353
|
float32arr[0] = entryXVal;
|
|
283
|
-
float32arr[1] =
|
|
354
|
+
float32arr[1] = firstEntry[yKey] * phaseY;
|
|
284
355
|
let index = 2;
|
|
356
|
+
// create a new path
|
|
285
357
|
let currentEntry = null;
|
|
286
358
|
let currentEntryXVal;
|
|
287
359
|
let currentEntryYVal;
|
|
288
360
|
let previousEntryYVal;
|
|
361
|
+
// doing the if test outside is much much faster on big data
|
|
289
362
|
if (isDrawSteppedEnabled) {
|
|
290
363
|
for (let x = firstIndex + 1; x <= lastIndex; x++) {
|
|
291
364
|
currentEntry = dataSet.getEntryForIndex(x);
|
|
@@ -338,19 +411,20 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
338
411
|
const firstIndex = Math.max(0, this.mXBounds.min);
|
|
339
412
|
const range = this.mXBounds.range;
|
|
340
413
|
const lastIndex = firstIndex + range;
|
|
341
|
-
const width = this.mViewPortHandler.
|
|
342
|
-
const chartRect = this.mViewPortHandler.
|
|
414
|
+
const width = this.mViewPortHandler.chartWidth;
|
|
415
|
+
const chartRect = this.mViewPortHandler.chartRect;
|
|
343
416
|
let lastColor;
|
|
344
417
|
const gradientDelta = 0;
|
|
345
418
|
const posDelta = gradientDelta / width;
|
|
346
419
|
for (let index = 0; index < nbColors; index++) {
|
|
347
420
|
const color = colors[index];
|
|
348
421
|
let colorIndex = color[xKey || 'index'];
|
|
422
|
+
// if filtered we need to get the real index
|
|
349
423
|
if (dataSet.isFiltered()) {
|
|
350
|
-
dataSet.
|
|
424
|
+
dataSet.ignoreFiltered = true;
|
|
351
425
|
const entry = dataSet.getEntryForIndex(colorIndex);
|
|
352
|
-
dataSet.
|
|
353
|
-
if (entry
|
|
426
|
+
dataSet.ignoreFiltered = false;
|
|
427
|
+
if (entry) {
|
|
354
428
|
colorIndex = dataSet.getEntryIndexForXValue(dataSet.getEntryXValue(entry, colorIndex), NaN, Rounding.CLOSEST);
|
|
355
429
|
}
|
|
356
430
|
}
|
|
@@ -395,16 +469,16 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
395
469
|
}
|
|
396
470
|
draw(c, dataSet) {
|
|
397
471
|
const result = false;
|
|
398
|
-
const drawFilled = dataSet.
|
|
399
|
-
const drawLine = dataSet.
|
|
472
|
+
const drawFilled = dataSet.drawFilledEnabled;
|
|
473
|
+
const drawLine = dataSet.lineWidth > 0;
|
|
400
474
|
if (!drawFilled && !drawLine) {
|
|
401
475
|
return result;
|
|
402
476
|
}
|
|
403
|
-
const trans = this.mChart.getTransformer(dataSet.
|
|
477
|
+
const trans = this.mChart.getTransformer(dataSet.axisDependency);
|
|
404
478
|
const linePath = Utils.getTempPath();
|
|
405
|
-
this.mXBounds.set(this.mChart, dataSet, this.
|
|
479
|
+
this.mXBounds.set(this.mChart, dataSet, this.animator);
|
|
406
480
|
let points;
|
|
407
|
-
switch (dataSet.
|
|
481
|
+
switch (dataSet.mode) {
|
|
408
482
|
default:
|
|
409
483
|
case Mode.LINEAR:
|
|
410
484
|
case Mode.STEPPED:
|
|
@@ -420,16 +494,17 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
420
494
|
if (!points) {
|
|
421
495
|
return result;
|
|
422
496
|
}
|
|
423
|
-
const colors = dataSet.
|
|
497
|
+
const colors = dataSet.colors;
|
|
424
498
|
const nbColors = colors.length;
|
|
425
499
|
const renderPaint = this.renderPaint;
|
|
426
500
|
let paintColorsShader;
|
|
427
501
|
if (nbColors > 0) {
|
|
502
|
+
// TODO: we transforms points in there. Could be dangerous if used after
|
|
428
503
|
paintColorsShader = this.getMultiColorsShader(colors, points, trans, dataSet);
|
|
429
504
|
}
|
|
430
505
|
let oldShader;
|
|
431
506
|
if (drawFilled) {
|
|
432
|
-
const useColorsForFill = dataSet.
|
|
507
|
+
const useColorsForFill = dataSet.useColorsForFill;
|
|
433
508
|
if (paintColorsShader && useColorsForFill) {
|
|
434
509
|
oldShader = renderPaint.getShader();
|
|
435
510
|
renderPaint.setShader(paintColorsShader);
|
|
@@ -440,12 +515,13 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
440
515
|
const minEntryValue = dataSet.getEntryXValue(dataSet.getEntryForIndex(this.mXBounds.min), this.mXBounds.min);
|
|
441
516
|
const maxEntryValue = dataSet.getEntryXValue(dataSet.getEntryForIndex(this.mXBounds.min + this.mXBounds.range), this.mXBounds.min + this.mXBounds.range);
|
|
442
517
|
this.drawFill(c, dataSet, fillPath, trans, minEntryValue, maxEntryValue);
|
|
518
|
+
this.lastLinePath = linePath;
|
|
443
519
|
if (paintColorsShader && useColorsForFill) {
|
|
444
520
|
renderPaint.setShader(oldShader);
|
|
445
521
|
oldShader = null;
|
|
446
522
|
}
|
|
447
523
|
}
|
|
448
|
-
const customRender = this.mChart.
|
|
524
|
+
const customRender = this.mChart.customRenderer;
|
|
449
525
|
if (drawLine) {
|
|
450
526
|
const useColorsForLine = dataSet.useColorsForLine;
|
|
451
527
|
if (paintColorsShader && useColorsForLine) {
|
|
@@ -475,38 +551,45 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
475
551
|
}
|
|
476
552
|
}
|
|
477
553
|
drawFill(c, dataSet, spline, trans, min, max, color, fillMin) {
|
|
478
|
-
|
|
479
|
-
|
|
554
|
+
const fillFormatter = dataSet.fillFormatter;
|
|
555
|
+
if (fillFormatter.getFillLinePath) {
|
|
556
|
+
fillFormatter.getFillLinePath(dataSet, this.mChart, spline, this.lastLinePath);
|
|
557
|
+
}
|
|
558
|
+
else if (fillMin === undefined) {
|
|
559
|
+
fillMin = fillFormatter.getFillLinePosition(dataSet, this.mChart);
|
|
560
|
+
spline.lineTo(max, fillMin);
|
|
561
|
+
spline.lineTo(min, fillMin);
|
|
562
|
+
spline.close();
|
|
480
563
|
}
|
|
481
|
-
spline.lineTo(max, fillMin);
|
|
482
|
-
spline.lineTo(min, fillMin);
|
|
483
|
-
spline.close();
|
|
484
564
|
trans && trans.pathValueToPixel(spline);
|
|
485
|
-
const drawable = dataSet.
|
|
486
|
-
if (drawable
|
|
487
|
-
this.drawFilledPathBitmap(c, spline, drawable, dataSet.
|
|
565
|
+
const drawable = dataSet.fillDrawable;
|
|
566
|
+
if (drawable) {
|
|
567
|
+
this.drawFilledPathBitmap(c, spline, drawable, dataSet.fillShader);
|
|
488
568
|
}
|
|
489
569
|
else {
|
|
490
|
-
this.drawFilledPath(c, spline, color || dataSet.
|
|
570
|
+
this.drawFilledPath(c, spline, color || dataSet.fillColor, dataSet.fillAlpha, dataSet.fillShader);
|
|
491
571
|
}
|
|
492
572
|
}
|
|
493
573
|
drawValuesForDataset(c, dataSet, dataSetIndex) {
|
|
494
574
|
const yKey = dataSet.yProperty;
|
|
575
|
+
// apply the text-styling defined by the DataSet
|
|
495
576
|
this.applyValueTextStyle(dataSet);
|
|
496
|
-
const
|
|
497
|
-
|
|
498
|
-
|
|
577
|
+
const chart = this.mChart;
|
|
578
|
+
const trans = chart.getTransformer(dataSet.axisDependency);
|
|
579
|
+
// make sure the values do not interfear with the circles
|
|
580
|
+
let valOffset = dataSet.circleRadius * 1.75;
|
|
581
|
+
if (!dataSet.drawCirclesEnabled)
|
|
499
582
|
valOffset = valOffset / 2;
|
|
500
|
-
this.mXBounds.set(
|
|
501
|
-
const { points, count } = trans.generateTransformedValues(dataSet, this.
|
|
502
|
-
const formatter = dataSet.
|
|
503
|
-
const iconsOffset = dataSet.
|
|
504
|
-
const valuesOffset = dataSet.
|
|
505
|
-
const drawIcons = dataSet.
|
|
506
|
-
const drawValues = dataSet.
|
|
583
|
+
this.mXBounds.set(chart, dataSet, this.animator);
|
|
584
|
+
const { points, count } = trans.generateTransformedValues(dataSet, this.animator.phaseX, this.animator.phaseY, this.mXBounds.min, this.mXBounds.max);
|
|
585
|
+
const formatter = dataSet.valueFormatter;
|
|
586
|
+
const iconsOffset = dataSet.iconsOffset;
|
|
587
|
+
const valuesOffset = dataSet.valuesOffset;
|
|
588
|
+
const drawIcons = dataSet.drawIconsEnabled;
|
|
589
|
+
const drawValues = dataSet.drawValuesEnabled;
|
|
507
590
|
const length = count;
|
|
508
591
|
const paint = this.valuePaint;
|
|
509
|
-
const customRender =
|
|
592
|
+
const customRender = chart.customRenderer;
|
|
510
593
|
for (let j = 0; j < length; j += 2) {
|
|
511
594
|
const x = points[j];
|
|
512
595
|
const y = points[j + 1];
|
|
@@ -518,24 +601,27 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
518
601
|
const entry = dataSet.getEntryForIndex(index);
|
|
519
602
|
if (!entry)
|
|
520
603
|
continue;
|
|
604
|
+
const yVal = entry[yKey];
|
|
605
|
+
if (yVal === undefined || yVal === null) {
|
|
606
|
+
continue;
|
|
607
|
+
}
|
|
521
608
|
if (drawValues) {
|
|
522
|
-
this.drawValue(c, formatter.getFormattedValue(
|
|
609
|
+
this.drawValue(c, chart, dataSet, dataSetIndex, entry, index, formatter.getFormattedValue(yVal, entry), valuesOffset.x + x, valuesOffset.y + y - valOffset, dataSet.getValueTextColor(j / 2), paint, customRender);
|
|
523
610
|
}
|
|
524
|
-
if (drawIcons
|
|
525
|
-
|
|
526
|
-
Utils.drawIcon(c, this.mChart, icon, x + iconsOffset.x, y + iconsOffset.y);
|
|
611
|
+
if (drawIcons) {
|
|
612
|
+
this.drawIcon(c, chart, dataSet, dataSetIndex, entry, index, dataSet.getEntryIcon(entry), x + iconsOffset.x, y + iconsOffset.y, customRender);
|
|
527
613
|
}
|
|
528
614
|
}
|
|
529
615
|
}
|
|
530
616
|
drawValues(c) {
|
|
531
|
-
const data = this.mChart.
|
|
532
|
-
const dataSets = data.
|
|
533
|
-
if (!this.isDrawingValuesAllowed(this.mChart) || dataSets.some((d) => d.
|
|
617
|
+
const data = this.mChart.lineData;
|
|
618
|
+
const dataSets = data.dataSets;
|
|
619
|
+
if (!this.isDrawingValuesAllowed(this.mChart) || dataSets.some((d) => d.drawValuesEnabled || d.drawIconsEnabled) === false) {
|
|
534
620
|
return;
|
|
535
621
|
}
|
|
536
622
|
for (let i = 0; i < dataSets.length; i++) {
|
|
537
623
|
const dataSet = dataSets[i];
|
|
538
|
-
if (!this.shouldDrawValues(dataSet) || dataSet.
|
|
624
|
+
if (!this.shouldDrawValues(dataSet) || dataSet.entryCount < 1)
|
|
539
625
|
continue;
|
|
540
626
|
this.drawValuesForDataset(c, dataSet, i);
|
|
541
627
|
}
|
|
@@ -545,15 +631,15 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
545
631
|
}
|
|
546
632
|
drawCirclesForDataset(c, dataSet) {
|
|
547
633
|
const paint = this.circlePaintInner;
|
|
548
|
-
paint.setColor(dataSet.
|
|
549
|
-
const phaseY = this.
|
|
634
|
+
paint.setColor(dataSet.circleHoleColor);
|
|
635
|
+
const phaseY = this.animator.phaseY;
|
|
550
636
|
const yKey = dataSet.yProperty;
|
|
551
|
-
const trans = this.mChart.getTransformer(dataSet.
|
|
552
|
-
this.mXBounds.set(this.mChart, dataSet, this.
|
|
553
|
-
const circleRadius = dataSet.
|
|
554
|
-
const circleHoleRadius = dataSet.
|
|
555
|
-
const drawCircleHole = dataSet.
|
|
556
|
-
const drawTransparentCircleHole = drawCircleHole && dataSet.
|
|
637
|
+
const trans = this.mChart.getTransformer(dataSet.axisDependency);
|
|
638
|
+
this.mXBounds.set(this.mChart, dataSet, this.animator);
|
|
639
|
+
const circleRadius = dataSet.circleRadius;
|
|
640
|
+
const circleHoleRadius = dataSet.circleHoleRadius;
|
|
641
|
+
const drawCircleHole = dataSet.drawCircleHoleEnabled && circleHoleRadius < circleRadius && circleHoleRadius > 0;
|
|
642
|
+
const drawTransparentCircleHole = drawCircleHole && dataSet.circleHoleColor === ColorTemplate.COLOR_NONE;
|
|
557
643
|
let imageCache;
|
|
558
644
|
if (this.mImageCaches.get(dataSet)) {
|
|
559
645
|
imageCache = this.mImageCaches.get(dataSet);
|
|
@@ -563,6 +649,7 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
563
649
|
this.mImageCaches.set(dataSet, imageCache);
|
|
564
650
|
}
|
|
565
651
|
const changeRequired = imageCache.init(dataSet);
|
|
652
|
+
// only fill the cache with new bitmaps if a change is required
|
|
566
653
|
if (changeRequired) {
|
|
567
654
|
const renderPaint = this.renderPaint;
|
|
568
655
|
imageCache.fill(dataSet, renderPaint, paint, drawCircleHole, drawTransparentCircleHole);
|
|
@@ -572,14 +659,15 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
572
659
|
const destRect = Utils.getTempRectF();
|
|
573
660
|
for (let j = this.mXBounds.min; j <= boundsRangeCount; j++) {
|
|
574
661
|
const e = dataSet.getEntryForIndex(j);
|
|
575
|
-
if (e
|
|
662
|
+
if (!e)
|
|
576
663
|
continue;
|
|
577
664
|
const yVal = e[yKey];
|
|
578
|
-
if (yVal
|
|
665
|
+
if (yVal === null || yVal === undefined)
|
|
579
666
|
continue;
|
|
580
667
|
circleBuffer[0] = dataSet.getEntryXValue(e, j);
|
|
581
668
|
circleBuffer[1] = yVal * phaseY;
|
|
582
669
|
trans.pointValuesToPixel(circleBuffer);
|
|
670
|
+
// native buffer access is slow
|
|
583
671
|
const cx = circleBuffer[0];
|
|
584
672
|
const cy = circleBuffer[1];
|
|
585
673
|
if (!this.mViewPortHandler.isInBoundsRight(cx))
|
|
@@ -587,15 +675,15 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
587
675
|
if (!this.mViewPortHandler.isInBoundsLeft(cx) || !this.mViewPortHandler.isInBoundsY(cy))
|
|
588
676
|
continue;
|
|
589
677
|
const circleBitmap = imageCache.getBitmap(j);
|
|
590
|
-
if (circleBitmap
|
|
678
|
+
if (circleBitmap) {
|
|
591
679
|
destRect.set(cx - circleRadius, cy - circleRadius, cx - circleRadius + 2 * circleRadius, cy - circleRadius + 2 * circleRadius);
|
|
592
680
|
c.drawBitmap(circleBitmap, null, destRect, null);
|
|
593
681
|
}
|
|
594
682
|
}
|
|
595
683
|
}
|
|
596
684
|
drawCircles(c) {
|
|
597
|
-
const dataSets = this.mChart.
|
|
598
|
-
if (dataSets.some((d) => d.
|
|
685
|
+
const dataSets = this.mChart.lineData.visibleDataSets;
|
|
686
|
+
if (dataSets.some((d) => d.drawCirclesEnabled) === false) {
|
|
599
687
|
return;
|
|
600
688
|
}
|
|
601
689
|
const renderPaint = this.renderPaint;
|
|
@@ -605,24 +693,25 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
605
693
|
circleBuffer[1] = 0;
|
|
606
694
|
for (let i = 0; i < dataSets.length; i++) {
|
|
607
695
|
const dataSet = dataSets[i];
|
|
608
|
-
if (!dataSet.
|
|
696
|
+
if (!dataSet.drawCirclesEnabled || dataSet.entryCount === 0)
|
|
609
697
|
continue;
|
|
610
698
|
this.drawCirclesForDataset(c, dataSet);
|
|
611
699
|
}
|
|
612
700
|
}
|
|
613
|
-
drawHighlighted(c, indices, actualDraw) {
|
|
614
|
-
const lineData = this.mChart.
|
|
615
|
-
const customRender = this.mChart.
|
|
701
|
+
drawHighlighted(c, indices, actualDraw = true) {
|
|
702
|
+
const lineData = this.mChart.lineData;
|
|
703
|
+
const customRender = this.mChart.customRenderer;
|
|
616
704
|
const paint = this.highlightPaint;
|
|
617
705
|
for (const high of indices) {
|
|
618
706
|
const set = lineData.getDataSetByIndex(high.dataSetIndex);
|
|
619
|
-
if (set
|
|
707
|
+
if (!set || !set.highlightEnabled)
|
|
620
708
|
continue;
|
|
621
709
|
const { entry, index } = lineData.getEntryAndIndexForHighlight(high);
|
|
710
|
+
// let e = set.getEntryForXValue(high.x high.y);
|
|
622
711
|
if (!this.isInBoundsX(entry, set))
|
|
623
712
|
continue;
|
|
624
713
|
const yKey = set.yProperty;
|
|
625
|
-
const pix = this.mChart.getTransformer(set.
|
|
714
|
+
const pix = this.mChart.getTransformer(set.axisDependency).getPixelForValues(set.getEntryXValue(entry, index), entry[yKey] * this.animator.phaseY);
|
|
626
715
|
high.drawX = pix.x;
|
|
627
716
|
high.drawY = pix.y;
|
|
628
717
|
if (!actualDraw) {
|
|
@@ -632,21 +721,23 @@ export class LineChartRenderer extends LineRadarRenderer {
|
|
|
632
721
|
customRender.drawHighlight(c, high, set, paint);
|
|
633
722
|
}
|
|
634
723
|
else {
|
|
635
|
-
this.drawHighlightLines(c,
|
|
724
|
+
this.drawHighlightLines(c, high.xPx, high.yPx, set);
|
|
636
725
|
}
|
|
637
726
|
}
|
|
638
727
|
}
|
|
728
|
+
/**
|
|
729
|
+
* Releases the drawing bitmap. This should be called when {@link LineChart#onDetachedFromWindow()}.
|
|
730
|
+
*/
|
|
639
731
|
releaseBitmap() {
|
|
640
|
-
if (this.mBitmapCanvas
|
|
732
|
+
if (this.mBitmapCanvas) {
|
|
641
733
|
this.mBitmapCanvas.setBitmap(null);
|
|
642
734
|
this.mBitmapCanvas = null;
|
|
643
735
|
}
|
|
644
|
-
if (this.mDrawBitmap
|
|
736
|
+
if (this.mDrawBitmap) {
|
|
645
737
|
const drawBitmap = this.mDrawBitmap.get();
|
|
646
|
-
if (drawBitmap
|
|
738
|
+
if (drawBitmap) {
|
|
647
739
|
releaseImage(drawBitmap);
|
|
648
740
|
}
|
|
649
|
-
this.mDrawBitmap.clear();
|
|
650
741
|
this.mDrawBitmap = null;
|
|
651
742
|
}
|
|
652
743
|
}
|
|
@@ -663,12 +754,6 @@ __decorate([
|
|
|
663
754
|
__decorate([
|
|
664
755
|
profile
|
|
665
756
|
], LineChartRenderer.prototype, "generateCubicPath", null);
|
|
666
|
-
__decorate([
|
|
667
|
-
profile
|
|
668
|
-
], LineChartRenderer.prototype, "generateLinearPath", null);
|
|
669
|
-
__decorate([
|
|
670
|
-
profile
|
|
671
|
-
], LineChartRenderer.prototype, "draw", null);
|
|
672
757
|
__decorate([
|
|
673
758
|
profile
|
|
674
759
|
], LineChartRenderer.prototype, "drawLines", null);
|