@nstudio/ncharts 1.0.2 → 1.1.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/CHANGELOG.md +10 -0
- package/angular/fesm2022/nstudio-ncharts-angular.mjs +14 -280
- package/angular/fesm2022/nstudio-ncharts-angular.mjs.map +1 -1
- package/angular/package.json +1 -0
- package/angular/types/nstudio-ncharts-angular.d.ts +8 -36
- package/charts/bar-chart.android.d.ts +12 -1
- package/charts/bar-chart.android.js +123 -16
- package/charts/bar-chart.android.js.map +1 -1
- package/charts/bar-chart.ios.d.ts +12 -1
- package/charts/bar-chart.ios.js +122 -26
- package/charts/bar-chart.ios.js.map +1 -1
- package/charts/bubble-chart.android.d.ts +3 -1
- package/charts/bubble-chart.android.js +11 -3
- package/charts/bubble-chart.android.js.map +1 -1
- package/charts/bubble-chart.ios.d.ts +3 -1
- package/charts/bubble-chart.ios.js +21 -15
- package/charts/bubble-chart.ios.js.map +1 -1
- package/charts/candlestick-chart.android.d.ts +3 -1
- package/charts/candlestick-chart.android.js +11 -3
- package/charts/candlestick-chart.android.js.map +1 -1
- package/charts/candlestick-chart.ios.d.ts +3 -1
- package/charts/candlestick-chart.ios.js +21 -15
- package/charts/candlestick-chart.ios.js.map +1 -1
- package/charts/chart-paging-detector/chart-paging-detector-base.d.ts +30 -0
- package/charts/chart-paging-detector/chart-paging-detector-base.js +115 -0
- package/charts/chart-paging-detector/chart-paging-detector-base.js.map +1 -0
- package/charts/chart-paging-detector/chart-paging-detector.android.d.ts +28 -0
- package/charts/chart-paging-detector/chart-paging-detector.android.js +136 -0
- package/charts/chart-paging-detector/chart-paging-detector.android.js.map +1 -0
- package/charts/chart-paging-detector/chart-paging-detector.ios.d.ts +34 -0
- package/charts/chart-paging-detector/chart-paging-detector.ios.js +88 -0
- package/charts/chart-paging-detector/chart-paging-detector.ios.js.map +1 -0
- package/charts/combined-chart.android.d.ts +13 -1
- package/charts/combined-chart.android.js +163 -13
- package/charts/combined-chart.android.js.map +1 -1
- package/charts/combined-chart.ios.d.ts +13 -1
- package/charts/combined-chart.ios.js +222 -72
- package/charts/combined-chart.ios.js.map +1 -1
- package/charts/default-marker.android.d.ts +29 -0
- package/charts/default-marker.android.js +133 -0
- package/charts/default-marker.android.js.map +1 -0
- package/charts/default-marker.ios.d.ts +21 -0
- package/charts/default-marker.ios.js +119 -0
- package/charts/default-marker.ios.js.map +1 -0
- package/charts/formatters/custom-labels-array-formatter.android.d.ts +7 -0
- package/charts/formatters/custom-labels-array-formatter.android.js +26 -0
- package/charts/formatters/custom-labels-array-formatter.android.js.map +1 -0
- package/charts/formatters/custom-labels-array-formatter.ios.d.ts +16 -0
- package/charts/formatters/custom-labels-array-formatter.ios.js +53 -0
- package/charts/formatters/custom-labels-array-formatter.ios.js.map +1 -0
- package/charts/formatters/date-formatters.android.d.ts +34 -0
- package/charts/formatters/date-formatters.android.js +74 -0
- package/charts/formatters/date-formatters.android.js.map +1 -0
- package/charts/formatters/date-formatters.ios.d.ts +33 -0
- package/charts/formatters/date-formatters.ios.js +75 -0
- package/charts/formatters/date-formatters.ios.js.map +1 -0
- package/charts/formatters/decimal-value-formatter.android.d.ts +13 -0
- package/charts/formatters/decimal-value-formatter.android.js +64 -0
- package/charts/formatters/decimal-value-formatter.android.js.map +1 -0
- package/charts/formatters/suffix-value-formatter.android.d.ts +13 -0
- package/charts/formatters/suffix-value-formatter.android.js +78 -0
- package/charts/formatters/suffix-value-formatter.android.js.map +1 -0
- package/charts/formatters/suffix-value-formatter.ios.d.ts +15 -0
- package/charts/formatters/suffix-value-formatter.ios.js +76 -0
- package/charts/formatters/suffix-value-formatter.ios.js.map +1 -0
- package/charts/formatters/value-formatter-helpers.d.ts +1 -0
- package/charts/formatters/value-formatter-helpers.js +29 -0
- package/charts/formatters/value-formatter-helpers.js.map +1 -0
- package/charts/line-chart.android.d.ts +12 -1
- package/charts/line-chart.android.js +121 -11
- package/charts/line-chart.android.js.map +1 -1
- package/charts/line-chart.ios.d.ts +12 -1
- package/charts/line-chart.ios.js +120 -21
- package/charts/line-chart.ios.js.map +1 -1
- package/charts/pie-chart.android.d.ts +23 -4
- package/charts/pie-chart.android.js +166 -55
- package/charts/pie-chart.android.js.map +1 -1
- package/charts/pie-chart.ios.d.ts +23 -4
- package/charts/pie-chart.ios.js +182 -90
- package/charts/pie-chart.ios.js.map +1 -1
- package/charts/radar-chart.android.d.ts +4 -1
- package/charts/radar-chart.android.js +16 -3
- package/charts/radar-chart.android.js.map +1 -1
- package/charts/radar-chart.ios.d.ts +4 -1
- package/charts/radar-chart.ios.js +27 -15
- package/charts/radar-chart.ios.js.map +1 -1
- package/charts/renderers/bar-chart-renderer.android.d.ts +19 -0
- package/charts/renderers/bar-chart-renderer.android.js +118 -0
- package/charts/renderers/bar-chart-renderer.android.js.map +1 -0
- package/charts/renderers/bar-chart-renderer.ios.d.ts +48 -0
- package/charts/renderers/bar-chart-renderer.ios.js +152 -0
- package/charts/renderers/bar-chart-renderer.ios.js.map +1 -0
- package/charts/renderers/combined-chart-renderer.android.d.ts +13 -0
- package/charts/renderers/combined-chart-renderer.android.js +57 -0
- package/charts/renderers/combined-chart-renderer.android.js.map +1 -0
- package/charts/renderers/combined-chart-renderer.ios.d.ts +12 -0
- package/charts/renderers/combined-chart-renderer.ios.js +66 -0
- package/charts/renderers/combined-chart-renderer.ios.js.map +1 -0
- package/charts/renderers/line-chart-plotbands-renderer.android.d.ts +13 -0
- package/charts/renderers/line-chart-plotbands-renderer.android.js +37 -0
- package/charts/renderers/line-chart-plotbands-renderer.android.js.map +1 -0
- package/charts/renderers/line-chart-plotbands-renderer.ios.d.ts +10 -0
- package/charts/renderers/line-chart-plotbands-renderer.ios.js +34 -0
- package/charts/renderers/line-chart-plotbands-renderer.ios.js.map +1 -0
- package/charts/renderers/plotband-drawer.android.d.ts +33 -0
- package/charts/renderers/plotband-drawer.android.js +200 -0
- package/charts/renderers/plotband-drawer.android.js.map +1 -0
- package/charts/renderers/plotband-drawer.ios.d.ts +15 -0
- package/charts/renderers/plotband-drawer.ios.js +183 -0
- package/charts/renderers/plotband-drawer.ios.js.map +1 -0
- package/charts/scatter-chart.android.d.ts +3 -1
- package/charts/scatter-chart.android.js +11 -3
- package/charts/scatter-chart.android.js.map +1 -1
- package/charts/scatter-chart.ios.d.ts +3 -1
- package/charts/scatter-chart.ios.js +21 -15
- package/charts/scatter-chart.ios.js.map +1 -1
- package/charts/style-helpers.android.d.ts +28 -4
- package/charts/style-helpers.android.js +190 -5
- package/charts/style-helpers.android.js.map +1 -1
- package/charts/style-helpers.ios.d.ts +28 -4
- package/charts/style-helpers.ios.js +210 -5
- package/charts/style-helpers.ios.js.map +1 -1
- package/common.d.ts +56 -2
- package/common.js +181 -14
- package/common.js.map +1 -1
- package/package.json +2 -2
- package/types/android!MPAndroidChart.d.ts +7955 -0
- package/types/objc!DGCharts.d.ts +5265 -0
- package/types.d.ts +73 -4
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ChartPagingDetectorOptions, PageHandler } from './chart-paging-detector';
|
|
2
|
+
import { ChartPagingDetectorBase } from './chart-paging-detector-base';
|
|
3
|
+
export declare class ChartPagingDetector extends ChartPagingDetectorBase {
|
|
4
|
+
private readonly chartView;
|
|
5
|
+
private readonly nativeChart;
|
|
6
|
+
private lastX;
|
|
7
|
+
private lastY;
|
|
8
|
+
private startX;
|
|
9
|
+
private startY;
|
|
10
|
+
private horizontalPagingActive;
|
|
11
|
+
private gestureLocked;
|
|
12
|
+
private touchSlop;
|
|
13
|
+
private tracking;
|
|
14
|
+
private readonly touchHandler;
|
|
15
|
+
private readonly gestureListener;
|
|
16
|
+
constructor(chartView: any, onPage: PageHandler, opts?: ChartPagingDetectorOptions);
|
|
17
|
+
private _handleTouch;
|
|
18
|
+
handleScaled(): void;
|
|
19
|
+
detach(): void;
|
|
20
|
+
protected getLowestVisibleX(): number;
|
|
21
|
+
protected getHighestVisibleX(): number;
|
|
22
|
+
protected getScaleX(): number;
|
|
23
|
+
protected getScaleY(): number;
|
|
24
|
+
protected getDataXBounds(): {
|
|
25
|
+
dataMin: number;
|
|
26
|
+
dataMax: number;
|
|
27
|
+
} | null;
|
|
28
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { ChartPagingDetectorBase } from './chart-paging-detector-base';
|
|
2
|
+
export class ChartPagingDetector extends ChartPagingDetectorBase {
|
|
3
|
+
constructor(chartView, onPage, opts) {
|
|
4
|
+
super(onPage, opts);
|
|
5
|
+
this.lastX = 0;
|
|
6
|
+
this.lastY = 0;
|
|
7
|
+
this.startX = 0;
|
|
8
|
+
this.startY = 0;
|
|
9
|
+
this.horizontalPagingActive = false;
|
|
10
|
+
this.gestureLocked = false;
|
|
11
|
+
this.touchSlop = 8;
|
|
12
|
+
this.tracking = false;
|
|
13
|
+
this.chartView = chartView;
|
|
14
|
+
this.nativeChart = chartView.android;
|
|
15
|
+
this.touchHandler = (args) => {
|
|
16
|
+
this._handleTouch(args);
|
|
17
|
+
};
|
|
18
|
+
this.gestureListener = new com.github.mikephil.charting.listener.OnChartGestureListener({
|
|
19
|
+
onChartGestureStart: (me, lastPerformedGesture) => { },
|
|
20
|
+
onChartGestureEnd: (me, lastPerformedGesture) => { },
|
|
21
|
+
onChartLongPressed: (me) => { },
|
|
22
|
+
onChartDoubleTapped: (me) => { },
|
|
23
|
+
onChartSingleTapped: (me) => { },
|
|
24
|
+
onChartFling: (me1, me2, velocityX, velocityY) => { },
|
|
25
|
+
onChartScale: (me, scaleX, scaleY) => {
|
|
26
|
+
this.handleScaled();
|
|
27
|
+
},
|
|
28
|
+
onChartTranslate: (me, dX, dY) => { },
|
|
29
|
+
});
|
|
30
|
+
this.chartView.on('touch', this.touchHandler, this);
|
|
31
|
+
this.nativeChart.setOnChartGestureListener(this.gestureListener);
|
|
32
|
+
}
|
|
33
|
+
_handleTouch(args) {
|
|
34
|
+
const action = args.action;
|
|
35
|
+
const x = args.getX();
|
|
36
|
+
const y = args.getY();
|
|
37
|
+
switch (action) {
|
|
38
|
+
case 'down':
|
|
39
|
+
this.startX = x;
|
|
40
|
+
this.startY = y;
|
|
41
|
+
this.lastX = x;
|
|
42
|
+
this.lastY = y;
|
|
43
|
+
this.tracking = true;
|
|
44
|
+
this.horizontalPagingActive = false;
|
|
45
|
+
this.gestureLocked = false;
|
|
46
|
+
break;
|
|
47
|
+
case 'move':
|
|
48
|
+
// recovery path in case of missing down
|
|
49
|
+
if (!this.tracking) {
|
|
50
|
+
this.startX = x;
|
|
51
|
+
this.startY = y;
|
|
52
|
+
this.lastX = x;
|
|
53
|
+
this.lastY = y;
|
|
54
|
+
this.tracking = true;
|
|
55
|
+
this.horizontalPagingActive = false;
|
|
56
|
+
this.gestureLocked = false;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
const totalDx = x - this.startX;
|
|
60
|
+
const totalDy = y - this.startY;
|
|
61
|
+
const absTotalX = Math.abs(totalDx);
|
|
62
|
+
const absTotalY = Math.abs(totalDy);
|
|
63
|
+
// decision pending: Tap vs horizontal vs vertikal
|
|
64
|
+
if (!this.gestureLocked) {
|
|
65
|
+
// not enough displacement => Tap/Jitter
|
|
66
|
+
if (absTotalX < this.touchSlop && absTotalY < this.touchSlop) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Horizontal dominates => activate paging
|
|
70
|
+
if (absTotalX > absTotalY * 1.5) {
|
|
71
|
+
this.gestureLocked = true;
|
|
72
|
+
this.horizontalPagingActive = true;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// not enough horizontal => treat as non-paging
|
|
76
|
+
this.gestureLocked = true;
|
|
77
|
+
this.horizontalPagingActive = false;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (!this.horizontalPagingActive) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// use incremental deltas
|
|
85
|
+
const fingerDx = x - this.lastX;
|
|
86
|
+
this.lastX = x;
|
|
87
|
+
this.lastY = y;
|
|
88
|
+
// ignore jitter
|
|
89
|
+
if (Math.abs(fingerDx) < 1) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
super.handleTranslated(fingerDx);
|
|
93
|
+
break;
|
|
94
|
+
case 'up':
|
|
95
|
+
case 'cancel':
|
|
96
|
+
this.tracking = false;
|
|
97
|
+
// only emit end when horizontal paging gesture has finished
|
|
98
|
+
if (this.horizontalPagingActive) {
|
|
99
|
+
super.handleEnd();
|
|
100
|
+
}
|
|
101
|
+
this.horizontalPagingActive = false;
|
|
102
|
+
this.gestureLocked = false;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
handleScaled() {
|
|
107
|
+
super.handleScaled();
|
|
108
|
+
}
|
|
109
|
+
detach() {
|
|
110
|
+
super.detach();
|
|
111
|
+
this.chartView.off('touch', this.touchHandler, this);
|
|
112
|
+
this.nativeChart.setOnChartGestureListener(null);
|
|
113
|
+
}
|
|
114
|
+
getLowestVisibleX() {
|
|
115
|
+
return this.nativeChart.getLowestVisibleX();
|
|
116
|
+
}
|
|
117
|
+
getHighestVisibleX() {
|
|
118
|
+
return this.nativeChart.getHighestVisibleX();
|
|
119
|
+
}
|
|
120
|
+
getScaleX() {
|
|
121
|
+
return this.nativeChart.getViewPortHandler().getScaleX();
|
|
122
|
+
}
|
|
123
|
+
getScaleY() {
|
|
124
|
+
return this.nativeChart.getViewPortHandler().getScaleY();
|
|
125
|
+
}
|
|
126
|
+
getDataXBounds() {
|
|
127
|
+
const data = this.nativeChart.getData();
|
|
128
|
+
if (!data)
|
|
129
|
+
return null;
|
|
130
|
+
return {
|
|
131
|
+
dataMin: data.getXMin(),
|
|
132
|
+
dataMax: data.getXMax(),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=chart-paging-detector.android.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-paging-detector.android.js","sourceRoot":"","sources":["../../../../../packages/ncharts/charts/chart-paging-detector/chart-paging-detector.android.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ChartPagingDetectorBase } from './chart-paging-detector-base';
|
|
2
|
+
import { ChartPagingDetectorOptions, PageHandler } from './chart-paging-detector';
|
|
3
|
+
import { LineChartBase } from '../../common';
|
|
4
|
+
export declare class PanActionTarget extends NSObject implements UIGestureRecognizerDelegate {
|
|
5
|
+
static ObjCProtocols: {
|
|
6
|
+
prototype: UIGestureRecognizerDelegate;
|
|
7
|
+
}[];
|
|
8
|
+
static ObjCExposedMethods: {
|
|
9
|
+
'handlePan:': {
|
|
10
|
+
returns: interop.Type<void>;
|
|
11
|
+
params: interop.Type<any>[];
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
private owner;
|
|
15
|
+
static initWithOwner(owner: any): PanActionTarget;
|
|
16
|
+
'handlePan:'(recognizer: any): void;
|
|
17
|
+
gestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer?(gestureRecognizer: UIGestureRecognizer, otherGestureRecognizer: UIGestureRecognizer): boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class ChartPagingDetector extends ChartPagingDetectorBase {
|
|
20
|
+
private readonly nativeChart;
|
|
21
|
+
private readonly panTarget;
|
|
22
|
+
private readonly pan;
|
|
23
|
+
constructor(chartView: LineChartBase, onPage: PageHandler, opts?: ChartPagingDetectorOptions);
|
|
24
|
+
_handlePan(recognizer: UIPanGestureRecognizer): void;
|
|
25
|
+
handleScaled(): void;
|
|
26
|
+
protected getLowestVisibleX(): number;
|
|
27
|
+
protected getHighestVisibleX(): number;
|
|
28
|
+
protected getScaleX(): number;
|
|
29
|
+
protected getScaleY(): number;
|
|
30
|
+
protected getDataXBounds(): {
|
|
31
|
+
dataMin: number;
|
|
32
|
+
dataMax: number;
|
|
33
|
+
} | null;
|
|
34
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ChartPagingDetectorBase } from './chart-paging-detector-base';
|
|
2
|
+
var PanActionTarget = (function (_super) {
|
|
3
|
+
__extends(PanActionTarget, _super);
|
|
4
|
+
function PanActionTarget() {
|
|
5
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
6
|
+
}
|
|
7
|
+
PanActionTarget.initWithOwner = function (owner) {
|
|
8
|
+
var instance = PanActionTarget.alloc().init();
|
|
9
|
+
instance.owner = owner;
|
|
10
|
+
return instance;
|
|
11
|
+
};
|
|
12
|
+
PanActionTarget.prototype["handlePan:"] = function (recognizer) {
|
|
13
|
+
if (this.owner && this.owner._handlePan) {
|
|
14
|
+
this.owner._handlePan(recognizer);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
PanActionTarget.prototype.gestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer = function (gestureRecognizer, otherGestureRecognizer) {
|
|
18
|
+
return true;
|
|
19
|
+
};
|
|
20
|
+
PanActionTarget.ObjCProtocols = [UIGestureRecognizerDelegate];
|
|
21
|
+
PanActionTarget.ObjCExposedMethods = {
|
|
22
|
+
"handlePan:": {
|
|
23
|
+
returns: interop.types.void,
|
|
24
|
+
params: [interop.types.id],
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
return PanActionTarget;
|
|
28
|
+
}(NSObject));
|
|
29
|
+
export { PanActionTarget };
|
|
30
|
+
export class ChartPagingDetector extends ChartPagingDetectorBase {
|
|
31
|
+
constructor(chartView, onPage, opts) {
|
|
32
|
+
super(onPage, opts);
|
|
33
|
+
this.nativeChart = chartView.ios;
|
|
34
|
+
// pan via custom recognizer as it should also work in case we are zoomed out
|
|
35
|
+
this.panTarget = PanActionTarget.initWithOwner(this);
|
|
36
|
+
this.pan = UIPanGestureRecognizer.alloc().initWithTargetAction(this.panTarget, 'handlePan:');
|
|
37
|
+
this.pan.cancelsTouchesInView = false;
|
|
38
|
+
this.pan.delegate = this.panTarget;
|
|
39
|
+
// deactivate pinzoom for custom gesture recognizer
|
|
40
|
+
this.pan.minimumNumberOfTouches = 1;
|
|
41
|
+
this.pan.maximumNumberOfTouches = 1;
|
|
42
|
+
this.nativeChart.addGestureRecognizer(this.pan);
|
|
43
|
+
}
|
|
44
|
+
_handlePan(recognizer) {
|
|
45
|
+
const tr = recognizer.translationInView(this.nativeChart);
|
|
46
|
+
const dx = tr.x;
|
|
47
|
+
const dy = tr.y;
|
|
48
|
+
// Reset translation early so we always work with deltas
|
|
49
|
+
recognizer.setTranslationInView(CGPointZero, this.nativeChart);
|
|
50
|
+
// Gate: ignore if gesture is primarily vertical (or too small)
|
|
51
|
+
const absX = Math.abs(dx);
|
|
52
|
+
const absY = Math.abs(dy);
|
|
53
|
+
// 1) minimum horizontal movement (avoid jitter)
|
|
54
|
+
if (absX < 3)
|
|
55
|
+
return;
|
|
56
|
+
// 2) horizontal dominance (tune factor 1.2..2.0)
|
|
57
|
+
if (absX < absY * 1.5)
|
|
58
|
+
return;
|
|
59
|
+
// Only now treat as horizontal paging intent
|
|
60
|
+
this.handleTranslated(dx);
|
|
61
|
+
const s = recognizer.state;
|
|
62
|
+
if (s === 3 /* UIGestureRecognizerState.Ended */ || s === 4 /* UIGestureRecognizerState.Cancelled */) {
|
|
63
|
+
this.handleEnd();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
handleScaled() {
|
|
67
|
+
super.handleScaled();
|
|
68
|
+
}
|
|
69
|
+
getLowestVisibleX() {
|
|
70
|
+
return this.nativeChart.lowestVisibleX;
|
|
71
|
+
}
|
|
72
|
+
getHighestVisibleX() {
|
|
73
|
+
return this.nativeChart.highestVisibleX;
|
|
74
|
+
}
|
|
75
|
+
getScaleX() {
|
|
76
|
+
return this.nativeChart.scaleX;
|
|
77
|
+
}
|
|
78
|
+
getScaleY() {
|
|
79
|
+
return this.nativeChart.scaleY;
|
|
80
|
+
}
|
|
81
|
+
getDataXBounds() {
|
|
82
|
+
const data = this.nativeChart.data;
|
|
83
|
+
if (!data)
|
|
84
|
+
return null;
|
|
85
|
+
return { dataMin: this.nativeChart.chartXMin, dataMax: this.nativeChart.chartXMax };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=chart-paging-detector.ios.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-paging-detector.ios.js","sourceRoot":"","sources":["../../../../../packages/ncharts/charts/chart-paging-detector/chart-paging-detector.ios.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;;;;;IAIvE,CAAC;;;;;IAIa,CAAC;;;;QAQW,CAAC;IAAS,CAAC;;;IAKG,CAAC;;;;;;;;;AAMyH,CAAC;;AAKnK,MAAM,OAAO,mBAAoB,SAAQ,uBAAuB;IAK9D,YAAY,SAAwB,EAAE,MAAmB,EAAE,IAAiC;QAC1F,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEpB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,GAA2B,CAAC;QAEzD,6EAA6E;QAC7E,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG,GAAG,sBAAsB,CAAC,KAAK,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC7F,IAAI,CAAC,GAAG,CAAC,oBAAoB,GAAG,KAAK,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAEnC,mDAAmD;QACnD,IAAI,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,CAAC;QAEpC,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAEM,UAAU,CAAC,UAAkC;QAClD,MAAM,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEhB,wDAAwD;QACxD,UAAU,CAAC,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAE/D,+DAA+D;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1B,gDAAgD;QAChD,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO;QAErB,iDAAiD;QACjD,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG;YAAE,OAAO;QAE9B,6CAA6C;QAC7C,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAE1B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,2CAAmC,IAAI,CAAC,+CAAuC,EAAE,CAAC;YACrF,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IACM,YAAY;QACjB,KAAK,CAAC,YAAY,EAAE,CAAC;IACvB,CAAC;IAES,iBAAiB;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;IACzC,CAAC;IAES,kBAAkB;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;IAC1C,CAAC;IAES,SAAS;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IACjC,CAAC;IACS,SAAS;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IACjC,CAAC;IAES,cAAc;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;IACtF,CAAC;CACF"}
|
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CombinedChart - Android Implementation
|
|
3
3
|
*/
|
|
4
|
-
import { CombinedChartBase, ChartAnimation, LegendConfig, XAxisConfig, ChartDescription, MarkerConfig, Highlight } from '../common';
|
|
4
|
+
import { CombinedChartBase, ChartAnimation, LegendConfig, XAxisConfig, ChartDescription, MarkerConfig, Highlight, ViewPortOffset, extraOffsetsProperty, touchEnabledProperty, dragEnabledProperty, scaleEnabledProperty, pinchZoomProperty, highlightPerDragEnabledProperty, highlightPerTapEnabledProperty } from '../common';
|
|
5
5
|
export declare class CombinedChart extends CombinedChartBase {
|
|
6
|
+
[extraOffsetsProperty.setNative]: (value: ViewPortOffset) => void;
|
|
7
|
+
[touchEnabledProperty.setNative]: (value: boolean) => void;
|
|
8
|
+
[dragEnabledProperty.setNative]: (value: boolean) => void;
|
|
9
|
+
[scaleEnabledProperty.setNative]: (value: boolean) => void;
|
|
10
|
+
[pinchZoomProperty.setNative]: (value: boolean) => void;
|
|
11
|
+
[highlightPerDragEnabledProperty.setNative]: (value: boolean) => void;
|
|
12
|
+
[highlightPerTapEnabledProperty.setNative]: (value: boolean) => void;
|
|
6
13
|
private _native;
|
|
7
14
|
private _selectionListener;
|
|
15
|
+
private _combinedRenderer;
|
|
16
|
+
private _pageDetector;
|
|
17
|
+
private _retainedChartObjects;
|
|
18
|
+
private _retainedDataObjects;
|
|
8
19
|
createNativeView(): any;
|
|
9
20
|
initNativeView(): void;
|
|
10
21
|
disposeNativeView(): void;
|
|
11
22
|
get nativeChart(): any;
|
|
12
23
|
applyData(): void;
|
|
24
|
+
private _updateCustomRenderer;
|
|
13
25
|
protected _applyAnimation(animation: ChartAnimation): void;
|
|
14
26
|
protected _applyHighlights(highlights: Highlight[] | null): void;
|
|
15
27
|
protected _invalidateChart(): void;
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CombinedChart - Android Implementation
|
|
3
3
|
*/
|
|
4
|
-
import { CombinedChartBase, nchartsLog } from '../common';
|
|
4
|
+
import { CombinedChartBase, nchartsLog, extraOffsetsProperty, touchEnabledProperty, dragEnabledProperty, scaleEnabledProperty, pinchZoomProperty, highlightPerDragEnabledProperty, highlightPerTapEnabledProperty } from '../common';
|
|
5
5
|
import { toAndroidColor } from './utils';
|
|
6
|
-
import { applyNoDataTextColorAndroid, applyLegendAndroid, applyXAxisAndroid, applyYAxisDualAndroid, applyDescriptionAndroid } from './style-helpers.android';
|
|
7
|
-
|
|
6
|
+
import { applyNoDataTextColorAndroid, applyLegendAndroid, applyXAxisAndroid, applyYAxisDualAndroid, applyDescriptionAndroid, applyMarkerAndroid } from './style-helpers.android';
|
|
7
|
+
import { NSCustomLabelsArrayFormatter } from './formatters/custom-labels-array-formatter.android';
|
|
8
|
+
import { NSCombinedChartRenderer } from './renderers/combined-chart-renderer.android';
|
|
9
|
+
import { NSSuffixValueFormatter } from './formatters/suffix-value-formatter.android';
|
|
10
|
+
import { ChartPagingDetector } from './chart-paging-detector/chart-paging-detector';
|
|
11
|
+
function applyLineDataSetConfig(dataSet, config, retainedDataObjects) {
|
|
8
12
|
if (!dataSet || !config)
|
|
9
13
|
return;
|
|
10
14
|
if (config.color) {
|
|
@@ -90,8 +94,18 @@ function applyLineDataSetConfig(dataSet, config) {
|
|
|
90
94
|
}
|
|
91
95
|
if (config.drawCubicIntensity !== undefined)
|
|
92
96
|
dataSet.setCubicIntensity(config.drawCubicIntensity);
|
|
97
|
+
if (config.valueFormatter === 'number') {
|
|
98
|
+
const vf = NSSuffixValueFormatter.initWithPattern(config.valueFormatterPattern);
|
|
99
|
+
dataSet.setValueFormatter(vf);
|
|
100
|
+
retainedDataObjects.push(vf);
|
|
101
|
+
}
|
|
102
|
+
else if (Array.isArray(config.valueFormatter)) {
|
|
103
|
+
const vf = new NSCustomLabelsArrayFormatter(config.valueFormatter);
|
|
104
|
+
dataSet.setValueFormatter(vf);
|
|
105
|
+
retainedDataObjects.push(vf);
|
|
106
|
+
}
|
|
93
107
|
}
|
|
94
|
-
function applyBarDataSetConfig(dataSet, config) {
|
|
108
|
+
function applyBarDataSetConfig(dataSet, config, retainedDataObjects) {
|
|
95
109
|
if (!dataSet || !config)
|
|
96
110
|
return;
|
|
97
111
|
if (config.color) {
|
|
@@ -108,6 +122,9 @@ function applyBarDataSetConfig(dataSet, config) {
|
|
|
108
122
|
});
|
|
109
123
|
dataSet.setColors(colors);
|
|
110
124
|
}
|
|
125
|
+
if (config.axisDependency) {
|
|
126
|
+
dataSet.setAxisDependency(config.axisDependency === 'RIGHT' ? com.github.mikephil.charting.components.YAxis.AxisDependency.RIGHT : com.github.mikephil.charting.components.YAxis.AxisDependency.LEFT);
|
|
127
|
+
}
|
|
111
128
|
if (config.highlightEnabled !== undefined)
|
|
112
129
|
dataSet.setHighlightEnabled(config.highlightEnabled);
|
|
113
130
|
if (config.drawValues !== undefined)
|
|
@@ -128,6 +145,19 @@ function applyBarDataSetConfig(dataSet, config) {
|
|
|
128
145
|
}
|
|
129
146
|
if (config.highlightAlpha !== undefined)
|
|
130
147
|
dataSet.setHighLightAlpha(Math.round(config.highlightAlpha));
|
|
148
|
+
if (config.barBorderWidth !== undefined) {
|
|
149
|
+
dataSet.setBarBorderWidth(config.barBorderWidth);
|
|
150
|
+
}
|
|
151
|
+
if (config.barBorderColor) {
|
|
152
|
+
const color = toAndroidColor(config.barBorderColor);
|
|
153
|
+
if (color !== undefined)
|
|
154
|
+
dataSet.setBarBorderColor(color);
|
|
155
|
+
}
|
|
156
|
+
if (config.valueFormatter === 'percent' || config.valueFormatter === 'suffix') {
|
|
157
|
+
const vf = NSSuffixValueFormatter.initWithPattern(config.valueFormatterPattern);
|
|
158
|
+
dataSet.setValueFormatter(vf);
|
|
159
|
+
retainedDataObjects.push(vf);
|
|
160
|
+
}
|
|
131
161
|
}
|
|
132
162
|
function applyScatterDataSetConfig(dataSet, config) {
|
|
133
163
|
if (!dataSet || !config)
|
|
@@ -305,6 +335,10 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
305
335
|
super(...arguments);
|
|
306
336
|
this._native = null;
|
|
307
337
|
this._selectionListener = null;
|
|
338
|
+
this._combinedRenderer = null;
|
|
339
|
+
this._pageDetector = null;
|
|
340
|
+
this._retainedChartObjects = [];
|
|
341
|
+
this._retainedDataObjects = [];
|
|
308
342
|
}
|
|
309
343
|
createNativeView() {
|
|
310
344
|
nchartsLog('[ncharts] CombinedChart.createNativeView()');
|
|
@@ -316,7 +350,6 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
316
350
|
nchartsLog('[ncharts] CombinedChart.initNativeView()');
|
|
317
351
|
super.initNativeView();
|
|
318
352
|
const instance = this._native;
|
|
319
|
-
instance.setHighlightPerTapEnabled(this.highlightPerTapEnabled);
|
|
320
353
|
if (this.chartBackgroundColor) {
|
|
321
354
|
const color = toAndroidColor(this.chartBackgroundColor);
|
|
322
355
|
if (color !== undefined)
|
|
@@ -325,6 +358,17 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
325
358
|
if (this.noDataText)
|
|
326
359
|
instance.setNoDataText(this.noDataText);
|
|
327
360
|
applyNoDataTextColorAndroid(instance, this.noDataTextColor);
|
|
361
|
+
// angular directive does not await presence of native chart, hence setup needs to happen here
|
|
362
|
+
if (this.touchEnabled !== undefined)
|
|
363
|
+
instance.setTouchEnabled(this.touchEnabled);
|
|
364
|
+
if (this.dragEnabled !== undefined)
|
|
365
|
+
instance.setDragEnabled(this.dragEnabled);
|
|
366
|
+
if (this.scaleEnabled !== undefined)
|
|
367
|
+
instance.setScaleEnabled(this.scaleEnabled);
|
|
368
|
+
if (this.pinchZoom !== undefined)
|
|
369
|
+
instance.setPinchZoom(this.pinchZoom);
|
|
370
|
+
if (this.highlightPerDragEnabled !== undefined)
|
|
371
|
+
instance.setHighlightPerDragEnabled(this.highlightPerDragEnabled);
|
|
328
372
|
// Set up selection listener
|
|
329
373
|
const owner = new WeakRef(this);
|
|
330
374
|
this._selectionListener = new com.github.mikephil.charting.listener.OnChartValueSelectedListener({
|
|
@@ -349,6 +393,15 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
349
393
|
},
|
|
350
394
|
});
|
|
351
395
|
instance.setOnChartValueSelectedListener(this._selectionListener);
|
|
396
|
+
// Set up page change detector
|
|
397
|
+
this._pageDetector = new ChartPagingDetector(this, async (dir, info) => {
|
|
398
|
+
this.notify({
|
|
399
|
+
eventName: CombinedChart.pageEvent,
|
|
400
|
+
object: this,
|
|
401
|
+
dir,
|
|
402
|
+
info,
|
|
403
|
+
});
|
|
404
|
+
}, { idleMs: 160, edgeRatio: 0.08, cooldownMs: 500, pagingMaxScaleX: 1, pagingMaxScaleY: 1 });
|
|
352
405
|
if (this.legend)
|
|
353
406
|
this._applyLegend(this.legend);
|
|
354
407
|
if (this.xAxis)
|
|
@@ -361,6 +414,12 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
361
414
|
this.applyData();
|
|
362
415
|
}
|
|
363
416
|
disposeNativeView() {
|
|
417
|
+
this._pageDetector?.detach();
|
|
418
|
+
this._pageDetector = null;
|
|
419
|
+
this._combinedRenderer?.detach();
|
|
420
|
+
this._combinedRenderer = null;
|
|
421
|
+
this._retainedChartObjects.length = 0;
|
|
422
|
+
this._retainedDataObjects.length = 0;
|
|
364
423
|
this._selectionListener = null;
|
|
365
424
|
this._native = null;
|
|
366
425
|
this._nativeChart = null;
|
|
@@ -374,6 +433,18 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
374
433
|
return;
|
|
375
434
|
nchartsLog('[ncharts] CombinedChart._applyDataAndroid called');
|
|
376
435
|
const instance = this._native;
|
|
436
|
+
// remove retained data objects
|
|
437
|
+
this._retainedDataObjects.length = 0;
|
|
438
|
+
// Setup of non-default draw order, order matters (before setting data)
|
|
439
|
+
if (this.data?.drawOrder) {
|
|
440
|
+
const order = this.data.drawOrder;
|
|
441
|
+
const toAndroidDrawOrder = (value) => com.github.mikephil.charting.charts.CombinedChart.DrawOrder[value];
|
|
442
|
+
const orderArray = java.lang.reflect.Array.newInstance(com.github.mikephil.charting.charts.CombinedChart.DrawOrder.class, order.length);
|
|
443
|
+
for (let i = 0; i < order.length; i++) {
|
|
444
|
+
orderArray[i] = toAndroidDrawOrder(order[i]);
|
|
445
|
+
}
|
|
446
|
+
instance.setDrawOrder(orderArray);
|
|
447
|
+
}
|
|
377
448
|
const combinedData = new com.github.mikephil.charting.data.CombinedData();
|
|
378
449
|
// Line data
|
|
379
450
|
if (this.data.lineData) {
|
|
@@ -386,13 +457,19 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
386
457
|
entry = new com.github.mikephil.charting.data.Entry(index, value);
|
|
387
458
|
}
|
|
388
459
|
else {
|
|
389
|
-
|
|
460
|
+
const x = value.x ?? index;
|
|
461
|
+
if (!value.marker) {
|
|
462
|
+
entry = new com.github.mikephil.charting.data.Entry(x, value.y);
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
entry = new com.github.mikephil.charting.data.Entry(x, value.y, value.marker);
|
|
466
|
+
}
|
|
390
467
|
}
|
|
391
468
|
entries.add(entry);
|
|
392
469
|
});
|
|
393
470
|
const dataSet = new com.github.mikephil.charting.data.LineDataSet(entries, ds.label);
|
|
394
471
|
if (ds.config)
|
|
395
|
-
applyLineDataSetConfig(dataSet, ds.config);
|
|
472
|
+
applyLineDataSetConfig(dataSet, ds.config, this._retainedDataObjects);
|
|
396
473
|
lineDataSets.add(dataSet);
|
|
397
474
|
}
|
|
398
475
|
const lineData = new com.github.mikephil.charting.data.LineData(lineDataSets);
|
|
@@ -409,16 +486,31 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
409
486
|
entry = new com.github.mikephil.charting.data.BarEntry(index, value);
|
|
410
487
|
}
|
|
411
488
|
else if (Array.isArray(value.y)) {
|
|
412
|
-
|
|
489
|
+
const x = value.x ?? index;
|
|
490
|
+
const stack = Array.create('float', value.y.length);
|
|
491
|
+
for (let i = 0; i < value.y.length; i++) {
|
|
492
|
+
stack[i] = value.y[i];
|
|
493
|
+
}
|
|
494
|
+
if (!value.marker) {
|
|
495
|
+
entry = new com.github.mikephil.charting.data.BarEntry(x, stack);
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
entry = new com.github.mikephil.charting.data.BarEntry(x, stack, value.marker);
|
|
499
|
+
}
|
|
413
500
|
}
|
|
414
501
|
else {
|
|
415
|
-
|
|
502
|
+
if (!value.marker) {
|
|
503
|
+
entry = new com.github.mikephil.charting.data.BarEntry(value.x ?? index, value.y);
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
entry = new com.github.mikephil.charting.data.BarEntry(value.x ?? index, value.y, value.marker);
|
|
507
|
+
}
|
|
416
508
|
}
|
|
417
509
|
entries.add(entry);
|
|
418
510
|
});
|
|
419
511
|
const dataSet = new com.github.mikephil.charting.data.BarDataSet(entries, ds.label);
|
|
420
512
|
if (ds.config)
|
|
421
|
-
applyBarDataSetConfig(dataSet, ds.config);
|
|
513
|
+
applyBarDataSetConfig(dataSet, ds.config, this._retainedDataObjects);
|
|
422
514
|
barDataSets.add(dataSet);
|
|
423
515
|
}
|
|
424
516
|
const barData = new com.github.mikephil.charting.data.BarData(barDataSets);
|
|
@@ -484,8 +576,27 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
484
576
|
const candleData = new com.github.mikephil.charting.data.CandleData(candleDataSets);
|
|
485
577
|
combinedData.setData(candleData);
|
|
486
578
|
}
|
|
579
|
+
// install custom renderer if needed
|
|
580
|
+
this._updateCustomRenderer();
|
|
487
581
|
instance.setData(combinedData);
|
|
488
582
|
instance.invalidate();
|
|
583
|
+
// data and animation properties cannot be set in a guranteed order
|
|
584
|
+
// hence after each data update an animation needs to be executed
|
|
585
|
+
if (this.animation)
|
|
586
|
+
this._applyAnimation(this.animation);
|
|
587
|
+
}
|
|
588
|
+
_updateCustomRenderer() {
|
|
589
|
+
const barConfigs = this.data?.barData?.dataSets?.map((ds) => ds.config).filter(Boolean) ?? [];
|
|
590
|
+
const needsCustomRenderer = this.yAxis?.plotBands?.length || barConfigs.some((cfg) => cfg?.drawValuesInside);
|
|
591
|
+
if (!needsCustomRenderer) {
|
|
592
|
+
this._combinedRenderer?.detach();
|
|
593
|
+
this._combinedRenderer = null;
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
this._combinedRenderer?.detach();
|
|
597
|
+
this._combinedRenderer = NSCombinedChartRenderer.create(this._native, barConfigs, this.yAxis?.plotBands);
|
|
598
|
+
this._native.notifyDataSetChanged();
|
|
599
|
+
}
|
|
489
600
|
}
|
|
490
601
|
_applyAnimation(animation) {
|
|
491
602
|
if (!this._native)
|
|
@@ -524,19 +635,58 @@ export class CombinedChart extends CombinedChartBase {
|
|
|
524
635
|
applyLegendAndroid(this._native, legend);
|
|
525
636
|
}
|
|
526
637
|
_applyXAxis(xAxis) {
|
|
527
|
-
applyXAxisAndroid(this._native, xAxis);
|
|
638
|
+
applyXAxisAndroid(this._native, xAxis, this._retainedChartObjects);
|
|
528
639
|
}
|
|
529
640
|
_applyYAxis(yAxis) {
|
|
530
|
-
applyYAxisDualAndroid(this._native, yAxis);
|
|
641
|
+
applyYAxisDualAndroid(this._native, yAxis, this._retainedChartObjects);
|
|
642
|
+
this._updateCustomRenderer();
|
|
531
643
|
}
|
|
532
644
|
_applyDescription(description) {
|
|
533
645
|
applyDescriptionAndroid(this._native, description);
|
|
534
646
|
}
|
|
535
|
-
_applyMarker(marker) {
|
|
647
|
+
_applyMarker(marker) {
|
|
648
|
+
applyMarkerAndroid(this._native, marker, this._retainedChartObjects);
|
|
649
|
+
}
|
|
536
650
|
_moveViewToX(xValue) { }
|
|
537
651
|
_moveViewTo(xValue, yValue, axisDependency) { }
|
|
538
652
|
_centerViewTo(xValue, yValue, axisDependency) { }
|
|
539
653
|
_zoom(scaleX, scaleY, x, y) { }
|
|
540
654
|
_fitScreen() { }
|
|
655
|
+
[extraOffsetsProperty.setNative](value) {
|
|
656
|
+
if (this._native && value) {
|
|
657
|
+
this._native.setExtraOffsets(value.left, value.top, value.right, value.bottom);
|
|
658
|
+
this._native.invalidate();
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
[touchEnabledProperty.setNative](value) {
|
|
662
|
+
if (this._native) {
|
|
663
|
+
this._native.setTouchEnabled(value);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
[dragEnabledProperty.setNative](value) {
|
|
667
|
+
if (this._native) {
|
|
668
|
+
this._native.setDragEnabled(value);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
[scaleEnabledProperty.setNative](value) {
|
|
672
|
+
if (this._native) {
|
|
673
|
+
this._native.setScaleEnabled(value);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
[pinchZoomProperty.setNative](value) {
|
|
677
|
+
if (this._native) {
|
|
678
|
+
this._native.setPinchZoom(value);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
[highlightPerDragEnabledProperty.setNative](value) {
|
|
682
|
+
if (this._native) {
|
|
683
|
+
this._native.setHighlightPerDragEnabled(value);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
[highlightPerTapEnabledProperty.setNative](value) {
|
|
687
|
+
if (this._native) {
|
|
688
|
+
this._native.setHighlightPerTapEnabled(value);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
541
691
|
}
|
|
542
692
|
//# sourceMappingURL=combined-chart.android.js.map
|