@nativescript-community/ui-chart 1.2.36 → 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.
Files changed (365) hide show
  1. package/README.md +6 -0
  2. package/animation/ChartAnimator.d.ts +47 -4
  3. package/animation/ChartAnimator.js +49 -11
  4. package/animation/ChartAnimator.js.map +1 -1
  5. package/animation/Tween.d.ts +1 -1
  6. package/animation/Tween.js +4 -2
  7. package/animation/Tween.js.map +1 -1
  8. package/buffer/AbstractBuffer.d.ts +28 -3
  9. package/buffer/AbstractBuffer.js +22 -3
  10. package/buffer/AbstractBuffer.js.map +1 -1
  11. package/buffer/BarBuffer.d.ts +8 -12
  12. package/buffer/BarBuffer.js +33 -36
  13. package/buffer/BarBuffer.js.map +1 -1
  14. package/buffer/HorizontalBarBuffer.js +13 -10
  15. package/buffer/HorizontalBarBuffer.js.map +1 -1
  16. package/charts/BarChart.d.ts +70 -15
  17. package/charts/BarChart.js +92 -63
  18. package/charts/BarChart.js.map +1 -1
  19. package/charts/BarLineChartBase.d.ts +494 -73
  20. package/charts/BarLineChartBase.js +788 -407
  21. package/charts/BarLineChartBase.js.map +1 -1
  22. package/charts/BubbleChart.d.ts +11 -5
  23. package/charts/BubbleChart.js +10 -8
  24. package/charts/BubbleChart.js.map +1 -1
  25. package/charts/CandleStickChart.d.ts +8 -5
  26. package/charts/CandleStickChart.js +9 -10
  27. package/charts/CandleStickChart.js.map +1 -1
  28. package/charts/Chart.d.ts +420 -91
  29. package/charts/Chart.js +590 -290
  30. package/charts/Chart.js.map +1 -1
  31. package/charts/CombinedChart.d.ts +59 -29
  32. package/charts/CombinedChart.js +74 -67
  33. package/charts/CombinedChart.js.map +1 -1
  34. package/charts/HorizontalBarChart.d.ts +37 -7
  35. package/charts/HorizontalBarChart.js +97 -59
  36. package/charts/HorizontalBarChart.js.map +1 -1
  37. package/charts/LineChart.d.ts +3 -5
  38. package/charts/LineChart.js +6 -10
  39. package/charts/LineChart.js.map +1 -1
  40. package/charts/PieChart.d.ts +218 -64
  41. package/charts/PieChart.js +278 -168
  42. package/charts/PieChart.js.map +1 -1
  43. package/charts/PieRadarChartBase.d.ts +107 -18
  44. package/charts/PieRadarChartBase.js +156 -73
  45. package/charts/PieRadarChartBase.js.map +1 -1
  46. package/charts/RadarChart.d.ts +75 -35
  47. package/charts/RadarChart.js +114 -103
  48. package/charts/RadarChart.js.map +1 -1
  49. package/charts/ScatterChart.d.ts +10 -5
  50. package/charts/ScatterChart.js +11 -10
  51. package/charts/ScatterChart.js.map +1 -1
  52. package/components/AxisBase.d.ts +271 -101
  53. package/components/AxisBase.js +264 -254
  54. package/components/AxisBase.js.map +1 -1
  55. package/components/ComponentBase.d.ts +54 -19
  56. package/components/ComponentBase.js +60 -48
  57. package/components/ComponentBase.js.map +1 -1
  58. package/components/Description.d.ts +18 -9
  59. package/components/Description.js +12 -26
  60. package/components/Description.js.map +1 -1
  61. package/components/IMarker.d.ts +30 -1
  62. package/components/IMarker.js.map +1 -1
  63. package/components/Legend.d.ts +155 -58
  64. package/components/Legend.js +208 -172
  65. package/components/Legend.js.map +1 -1
  66. package/components/LegendEntry.d.ts +38 -0
  67. package/components/LegendEntry.js +34 -0
  68. package/components/LegendEntry.js.map +1 -1
  69. package/components/LimitLine.d.ts +40 -22
  70. package/components/LimitLine.js +44 -56
  71. package/components/LimitLine.js.map +1 -1
  72. package/components/MarkerImage.d.ts +1 -0
  73. package/components/MarkerImage.js +97 -0
  74. package/components/MarkerImage.js.map +1 -0
  75. package/components/XAxis.d.ts +41 -10
  76. package/components/XAxis.js +42 -24
  77. package/components/XAxis.js.map +1 -1
  78. package/components/YAxis.d.ts +114 -37
  79. package/components/YAxis.js +138 -106
  80. package/components/YAxis.js.map +1 -1
  81. package/data/BarData.d.ts +32 -4
  82. package/data/BarData.js +92 -24
  83. package/data/BarData.js.map +1 -1
  84. package/data/BarDataSet.d.ts +35 -18
  85. package/data/BarDataSet.js +42 -47
  86. package/data/BarDataSet.js.map +1 -1
  87. package/data/BarEntry.d.ts +3 -0
  88. package/data/BarEntry.js.map +1 -1
  89. package/data/BarLineScatterCandleBubbleData.d.ts +5 -0
  90. package/data/BarLineScatterCandleBubbleData.js +5 -0
  91. package/data/BarLineScatterCandleBubbleData.js.map +1 -1
  92. package/data/BarLineScatterCandleBubbleDataSet.d.ts +11 -3
  93. package/data/BarLineScatterCandleBubbleDataSet.js +11 -7
  94. package/data/BarLineScatterCandleBubbleDataSet.js.map +1 -1
  95. package/data/BaseDataSet.d.ts +129 -71
  96. package/data/BaseDataSet.js +146 -169
  97. package/data/BaseDataSet.js.map +1 -1
  98. package/data/BaseEntry.d.ts +3 -0
  99. package/data/BaseEntry.js.map +1 -1
  100. package/data/BubbleData.d.ts +7 -1
  101. package/data/BubbleData.js +8 -2
  102. package/data/BubbleData.js.map +1 -1
  103. package/data/BubbleDataSet.d.ts +7 -7
  104. package/data/BubbleDataSet.js +8 -15
  105. package/data/BubbleDataSet.js.map +1 -1
  106. package/data/BubbleEntry.d.ts +1 -0
  107. package/data/BubbleEntry.js.map +1 -1
  108. package/data/CandleData.js.map +1 -1
  109. package/data/CandleDataSet.d.ts +64 -30
  110. package/data/CandleDataSet.js +67 -74
  111. package/data/CandleDataSet.js.map +1 -1
  112. package/data/CandleEntry.d.ts +4 -0
  113. package/data/CandleEntry.js.map +1 -1
  114. package/data/ChartData.d.ts +273 -18
  115. package/data/ChartData.js +398 -93
  116. package/data/ChartData.js.map +1 -1
  117. package/data/CombinedData.d.ts +39 -12
  118. package/data/CombinedData.js +87 -71
  119. package/data/CombinedData.js.map +1 -1
  120. package/data/DataSet.d.ts +59 -8
  121. package/data/DataSet.js +114 -26
  122. package/data/DataSet.js.map +1 -1
  123. package/data/Entry.js.map +1 -1
  124. package/data/LineData.d.ts +5 -0
  125. package/data/LineData.js +5 -0
  126. package/data/LineData.js.map +1 -1
  127. package/data/LineDataSet.d.ts +80 -49
  128. package/data/LineDataSet.js +90 -135
  129. package/data/LineDataSet.js.map +1 -1
  130. package/data/LineRadarDataSet.d.ts +27 -17
  131. package/data/LineRadarDataSet.js +22 -35
  132. package/data/LineRadarDataSet.js.map +1 -1
  133. package/data/LineScatterCandleRadarDataSet.d.ts +30 -15
  134. package/data/LineScatterCandleRadarDataSet.js +36 -39
  135. package/data/LineScatterCandleRadarDataSet.js.map +1 -1
  136. package/data/PieData.d.ts +26 -0
  137. package/data/PieData.js +28 -2
  138. package/data/PieData.js.map +1 -1
  139. package/data/PieDataSet.d.ts +40 -36
  140. package/data/PieDataSet.js +36 -88
  141. package/data/PieDataSet.js.map +1 -1
  142. package/data/PieEntry.d.ts +3 -0
  143. package/data/PieEntry.js.map +1 -1
  144. package/data/RadarData.d.ts +10 -4
  145. package/data/RadarData.js +5 -6
  146. package/data/RadarData.js.map +1 -1
  147. package/data/RadarDataSet.d.ts +7 -21
  148. package/data/RadarDataSet.js +10 -49
  149. package/data/RadarDataSet.js.map +1 -1
  150. package/data/RadarEntry.js.map +1 -1
  151. package/data/ScatterData.d.ts +4 -1
  152. package/data/ScatterData.js +5 -2
  153. package/data/ScatterData.js.map +1 -1
  154. package/data/ScatterDataSet.d.ts +24 -14
  155. package/data/ScatterDataSet.js +26 -31
  156. package/data/ScatterDataSet.js.map +1 -1
  157. package/formatter/DefaultAxisValueFormatter.d.ts +17 -3
  158. package/formatter/DefaultAxisValueFormatter.js +12 -5
  159. package/formatter/DefaultAxisValueFormatter.js.map +1 -1
  160. package/formatter/DefaultFillFormatter.js +7 -7
  161. package/formatter/DefaultFillFormatter.js.map +1 -1
  162. package/formatter/DefaultValueFormatter.js.map +1 -1
  163. package/formatter/IAxisValueFormatter.d.ts +20 -2
  164. package/formatter/IAxisValueFormatter.js.map +1 -1
  165. package/formatter/IFillFormatter.d.ts +25 -0
  166. package/formatter/IFillFormatter.js.map +1 -1
  167. package/formatter/IValueFormatter.d.ts +21 -0
  168. package/formatter/IValueFormatter.js.map +1 -1
  169. package/formatter/ValueFormatter.d.ts +60 -0
  170. package/formatter/ValueFormatter.js +60 -0
  171. package/formatter/ValueFormatter.js.map +1 -1
  172. package/highlight/BarHighlighter.d.ts +22 -2
  173. package/highlight/BarHighlighter.js +43 -17
  174. package/highlight/BarHighlighter.js.map +1 -1
  175. package/highlight/ChartHighlighter.d.ts +87 -5
  176. package/highlight/ChartHighlighter.js +126 -23
  177. package/highlight/ChartHighlighter.js.map +1 -1
  178. package/highlight/CombinedHighlighter.d.ts +6 -0
  179. package/highlight/CombinedHighlighter.js +31 -16
  180. package/highlight/CombinedHighlighter.js.map +1 -1
  181. package/highlight/Highlight.d.ts +54 -1
  182. package/highlight/Highlight.js +5 -0
  183. package/highlight/Highlight.js.map +1 -1
  184. package/highlight/HorizontalBarHighlighter.d.ts +1 -1
  185. package/highlight/HorizontalBarHighlighter.js +14 -13
  186. package/highlight/HorizontalBarHighlighter.js.map +1 -1
  187. package/highlight/IHighlighter.d.ts +11 -1
  188. package/highlight/IHighlighter.js.map +1 -1
  189. package/highlight/PieHighlighter.js +2 -2
  190. package/highlight/PieHighlighter.js.map +1 -1
  191. package/highlight/PieRadarHighlighter.d.ts +12 -1
  192. package/highlight/PieRadarHighlighter.js +12 -4
  193. package/highlight/PieRadarHighlighter.js.map +1 -1
  194. package/highlight/RadarHighlighter.d.ts +12 -0
  195. package/highlight/RadarHighlighter.js +24 -10
  196. package/highlight/RadarHighlighter.js.map +1 -1
  197. package/index.d.ts +11 -0
  198. package/index.js +15 -0
  199. package/index.js.map +1 -0
  200. package/interfaces/dataprovider/BarDataProvider.d.ts +4 -4
  201. package/interfaces/dataprovider/BarLineScatterCandleBubbleDataProvider.d.ts +8 -3
  202. package/interfaces/dataprovider/BubbleDataProvider.d.ts +1 -1
  203. package/interfaces/dataprovider/CandleDataProvider.d.ts +1 -1
  204. package/interfaces/dataprovider/ChartInterface.d.ts +17 -22
  205. package/interfaces/dataprovider/CombinedDataProvider.d.ts +1 -1
  206. package/interfaces/dataprovider/LineDataProvider.d.ts +1 -1
  207. package/interfaces/dataprovider/ScatterDataProvider.d.ts +1 -1
  208. package/interfaces/datasets/IBarDataSet.d.ts +8 -22
  209. package/interfaces/datasets/IBarLineScatterCandleBubbleDataSet.d.ts +1 -3
  210. package/interfaces/datasets/IBubbleDataSet.d.ts +3 -9
  211. package/interfaces/datasets/ICandleDataSet.d.ts +44 -41
  212. package/interfaces/datasets/IDataSet.d.ts +35 -151
  213. package/interfaces/datasets/ILineDataSet.d.ts +15 -54
  214. package/interfaces/datasets/ILineRadarDataSet.d.ts +7 -28
  215. package/interfaces/datasets/ILineScatterCandleRadarDataSet.d.ts +5 -4
  216. package/interfaces/datasets/IPieDataSet.d.ts +22 -40
  217. package/interfaces/datasets/IRadarDataSet.d.ts +7 -13
  218. package/interfaces/datasets/IScatterDataSet.d.ts +17 -16
  219. package/jobs/AnimatedMoveViewJob.d.ts +3 -0
  220. package/jobs/AnimatedMoveViewJob.js +12 -8
  221. package/jobs/AnimatedMoveViewJob.js.map +1 -1
  222. package/jobs/AnimatedViewPortJob.d.ts +7 -8
  223. package/jobs/AnimatedViewPortJob.js +16 -23
  224. package/jobs/AnimatedViewPortJob.js.map +1 -1
  225. package/jobs/AnimatedZoomJob.d.ts +8 -5
  226. package/jobs/AnimatedZoomJob.js +30 -26
  227. package/jobs/AnimatedZoomJob.js.map +1 -1
  228. package/jobs/MoveViewJob.d.ts +3 -0
  229. package/jobs/MoveViewJob.js +10 -7
  230. package/jobs/MoveViewJob.js.map +1 -1
  231. package/jobs/ViewPortJob.d.ts +3 -5
  232. package/jobs/ViewPortJob.js +5 -11
  233. package/jobs/ViewPortJob.js.map +1 -1
  234. package/jobs/ZoomJob.js +14 -14
  235. package/jobs/ZoomJob.js.map +1 -1
  236. package/listener/BarLineChartTouchListener.d.ts +82 -1
  237. package/listener/BarLineChartTouchListener.js +169 -67
  238. package/listener/BarLineChartTouchListener.js.map +1 -1
  239. package/listener/ChartTouchListener.d.ts +39 -5
  240. package/listener/ChartTouchListener.js +38 -11
  241. package/listener/ChartTouchListener.js.map +1 -1
  242. package/listener/PieRadarChartTouchListener.d.ts +56 -1
  243. package/listener/PieRadarChartTouchListener.js +201 -17
  244. package/listener/PieRadarChartTouchListener.js.map +1 -1
  245. package/model/GradientColor.js.map +1 -1
  246. package/package.json +23 -15
  247. package/renderer/AxisRenderer.d.ts +66 -7
  248. package/renderer/AxisRenderer.js +69 -21
  249. package/renderer/AxisRenderer.js.map +1 -1
  250. package/renderer/BarChartRenderer.d.ts +11 -0
  251. package/renderer/BarChartRenderer.js +99 -71
  252. package/renderer/BarChartRenderer.js.map +1 -1
  253. package/renderer/BarLineScatterCandleBubbleRenderer.d.ts +37 -0
  254. package/renderer/BarLineScatterCandleBubbleRenderer.js +36 -8
  255. package/renderer/BarLineScatterCandleBubbleRenderer.js.map +1 -1
  256. package/renderer/BubbleChartRenderer.d.ts +6 -2
  257. package/renderer/BubbleChartRenderer.js +51 -40
  258. package/renderer/BubbleChartRenderer.js.map +1 -1
  259. package/renderer/CandleStickChartRenderer.d.ts +1 -1
  260. package/renderer/CandleStickChartRenderer.js +64 -50
  261. package/renderer/CandleStickChartRenderer.js.map +1 -1
  262. package/renderer/CombinedChartRenderer.d.ts +20 -1
  263. package/renderer/CombinedChartRenderer.js +72 -42
  264. package/renderer/CombinedChartRenderer.js.map +1 -1
  265. package/renderer/DataRenderer.d.ts +78 -4
  266. package/renderer/DataRenderer.js +65 -6
  267. package/renderer/DataRenderer.js.map +1 -1
  268. package/renderer/HorizontalBarChartRenderer.d.ts +5 -2
  269. package/renderer/HorizontalBarChartRenderer.js +87 -66
  270. package/renderer/HorizontalBarChartRenderer.js.map +1 -1
  271. package/renderer/LegendRenderer.d.ts +32 -0
  272. package/renderer/LegendRenderer.js +98 -59
  273. package/renderer/LegendRenderer.js.map +1 -1
  274. package/renderer/LineChartRenderer.d.ts +38 -1
  275. package/renderer/LineChartRenderer.js +185 -110
  276. package/renderer/LineChartRenderer.js.map +1 -1
  277. package/renderer/LineRadarRenderer.d.ts +19 -0
  278. package/renderer/LineRadarRenderer.js +25 -1
  279. package/renderer/LineRadarRenderer.js.map +1 -1
  280. package/renderer/LineScatterCandleRadarRenderer.d.ts +11 -0
  281. package/renderer/LineScatterCandleRadarRenderer.js +26 -9
  282. package/renderer/LineScatterCandleRadarRenderer.js.map +1 -1
  283. package/renderer/PieChartRenderer.d.ts +45 -1
  284. package/renderer/PieChartRenderer.js +195 -122
  285. package/renderer/PieChartRenderer.js.map +1 -1
  286. package/renderer/RadarChartRenderer.d.ts +10 -0
  287. package/renderer/RadarChartRenderer.js +119 -77
  288. package/renderer/RadarChartRenderer.js.map +1 -1
  289. package/renderer/Renderer.d.ts +8 -0
  290. package/renderer/Renderer.js +5 -0
  291. package/renderer/Renderer.js.map +1 -1
  292. package/renderer/ScatterChartRenderer.d.ts +5 -5
  293. package/renderer/ScatterChartRenderer.js +51 -37
  294. package/renderer/ScatterChartRenderer.js.map +1 -1
  295. package/renderer/XAxisRenderer.d.ts +29 -4
  296. package/renderer/XAxisRenderer.js +128 -95
  297. package/renderer/XAxisRenderer.js.map +1 -1
  298. package/renderer/XAxisRendererHorizontalBarChart.d.ts +11 -0
  299. package/renderer/XAxisRendererHorizontalBarChart.js +75 -57
  300. package/renderer/XAxisRendererHorizontalBarChart.js.map +1 -1
  301. package/renderer/XAxisRendererRadarChart.d.ts +5 -0
  302. package/renderer/XAxisRendererRadarChart.js +26 -13
  303. package/renderer/XAxisRendererRadarChart.js.map +1 -1
  304. package/renderer/YAxisRenderer.d.ts +42 -5
  305. package/renderer/YAxisRenderer.js +126 -69
  306. package/renderer/YAxisRenderer.js.map +1 -1
  307. package/renderer/YAxisRendererHorizontalBarChart.d.ts +22 -1
  308. package/renderer/YAxisRendererHorizontalBarChart.js +80 -58
  309. package/renderer/YAxisRendererHorizontalBarChart.js.map +1 -1
  310. package/renderer/YAxisRendererRadarChart.js +62 -32
  311. package/renderer/YAxisRendererRadarChart.js.map +1 -1
  312. package/renderer/scatter/ChevronDownShapeRenderer.d.ts +4 -0
  313. package/renderer/scatter/ChevronDownShapeRenderer.js +5 -1
  314. package/renderer/scatter/ChevronDownShapeRenderer.js.map +1 -1
  315. package/renderer/scatter/ChevronUpShapeRenderer.d.ts +4 -0
  316. package/renderer/scatter/ChevronUpShapeRenderer.js +5 -1
  317. package/renderer/scatter/ChevronUpShapeRenderer.js.map +1 -1
  318. package/renderer/scatter/CircleShapeRenderer.d.ts +4 -0
  319. package/renderer/scatter/CircleShapeRenderer.js +8 -5
  320. package/renderer/scatter/CircleShapeRenderer.js.map +1 -1
  321. package/renderer/scatter/CrossShapeRenderer.d.ts +4 -0
  322. package/renderer/scatter/CrossShapeRenderer.js +5 -1
  323. package/renderer/scatter/CrossShapeRenderer.js.map +1 -1
  324. package/renderer/scatter/IShapeRenderer.d.ts +14 -0
  325. package/renderer/scatter/IShapeRenderer.js.map +1 -1
  326. package/renderer/scatter/SquareShapeRenderer.d.ts +4 -0
  327. package/renderer/scatter/SquareShapeRenderer.js +8 -5
  328. package/renderer/scatter/SquareShapeRenderer.js.map +1 -1
  329. package/renderer/scatter/TriangleShapeRenderer.d.ts +4 -0
  330. package/renderer/scatter/TriangleShapeRenderer.js +9 -5
  331. package/renderer/scatter/TriangleShapeRenderer.js.map +1 -1
  332. package/renderer/scatter/XShapeRenderer.d.ts +4 -0
  333. package/renderer/scatter/XShapeRenderer.js +5 -1
  334. package/renderer/scatter/XShapeRenderer.js.map +1 -1
  335. package/utils/ColorTemplate.d.ts +21 -1
  336. package/utils/ColorTemplate.js +21 -3
  337. package/utils/ColorTemplate.js.map +1 -1
  338. package/utils/HorizontalViewPortHandler.d.ts +3 -0
  339. package/utils/HorizontalViewPortHandler.js +3 -0
  340. package/utils/HorizontalViewPortHandler.js.map +1 -1
  341. package/utils/MPSize.d.ts +7 -0
  342. package/utils/ObjectPool.d.ts +56 -0
  343. package/utils/ObjectPool.js +66 -8
  344. package/utils/ObjectPool.js.map +1 -1
  345. package/utils/Transformer.d.ts +118 -0
  346. package/utils/Transformer.js +141 -7
  347. package/utils/Transformer.js.map +1 -1
  348. package/utils/TransformerHorizontalBarChart.d.ts +10 -0
  349. package/utils/TransformerHorizontalBarChart.js +18 -2
  350. package/utils/TransformerHorizontalBarChart.js.map +1 -1
  351. package/utils/Utils.d.ts +139 -17
  352. package/utils/Utils.js +185 -60
  353. package/utils/Utils.js.map +1 -1
  354. package/utils/ViewPortHandler.d.ts +234 -19
  355. package/utils/ViewPortHandler.js +306 -63
  356. package/utils/ViewPortHandler.js.map +1 -1
  357. package/utils/colors/colorful.js.map +1 -1
  358. package/utils/colors/joyful.js.map +1 -1
  359. package/utils/colors/liberty.js.map +1 -1
  360. package/utils/colors/material.js.map +1 -1
  361. package/utils/colors/pastel.js.map +1 -1
  362. package/utils/colors/vordiplom.js.map +1 -1
  363. package/charts/index.d.ts +0 -11
  364. package/charts/index.js +0 -15
  365. package/charts/index.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.getChartWidth();
62
- const height = this.mViewPortHandler.getChartHeight();
63
- let drawBitmap = this.mDrawBitmap == null ? null : this.mDrawBitmap.get();
64
- if (drawBitmap == null || drawBitmap.width !== width || drawBitmap.height !== height) {
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.getData();
79
- for (const set of pieData.getDataSets()) {
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.isAutomaticallyDisableSliceSpacingEnabled()) {
101
- return dataSet.getSliceSpace();
114
+ if (!dataSet.automaticallyDisableSliceSpacing) {
115
+ return dataSet.sliceSpace;
102
116
  }
103
- const spaceSizeRatio = dataSet.getSliceSpace() / this.mViewPortHandler.getSmallestContentExtension();
104
- const minValueRatio = (dataSet.getYMin() / this.mChart.getData().getYValueSum()) * 2;
105
- const sliceSpace = spaceSizeRatio > minValueRatio ? 0 : dataSet.getSliceSpace();
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 = this.mChart.getRotationAngle();
113
- const phaseX = this.mAnimator.getPhaseX();
114
- const phaseY = this.mAnimator.getPhaseY();
115
- const circleBox = this.mChart.getCircleBox();
116
- const entryCount = dataSet.getEntryCount();
117
- const drawAngles = this.mChart.getDrawAngles();
118
- const center = this.mChart.getCenterCircleBox();
119
- const radius = this.mChart.getRadius();
120
- const drawInnerArc = this.mChart.isDrawHoleEnabled() && !this.mChart.isDrawSlicesUnderHoleEnabled();
121
- const userInnerRadius = drawInnerArc ? radius * (this.mChart.getHoleRadius() / 100) : 0;
122
- const roundedRadius = (radius - (radius * this.mChart.getHoleRadius()) / 100) / 2;
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 && this.mChart.isDrawRoundedSlicesEnabled();
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 = this.mChart.getCustomRenderer();
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.getFillShader();
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 (this.mChart.needsHighlight(j) && !drawRoundedSlices) {
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 drawEntryLabels = this.mChart.isDrawEntryLabelsEnabled();
238
- const data = this.mChart.getData();
239
- const dataSets = data.getDataSets();
240
- if (!drawEntryLabels || dataSets.some((d) => d.isDrawValuesEnabled() || d.isDrawIconsEnabled()) === false) {
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 = this.mChart.getCenterCircleBox();
244
- const radius = this.mChart.getRadius();
245
- let rotationAngle = this.mChart.getRotationAngle();
246
- const drawAngles = this.mChart.getDrawAngles();
247
- const absoluteAngles = this.mChart.getAbsoluteAngles();
248
- const phaseX = this.mAnimator.getPhaseX();
249
- const phaseY = this.mAnimator.getPhaseY();
250
- const roundedRadius = (radius - (radius * this.mChart.getHoleRadius()) / 100) / 2;
251
- const holeRadiusPercent = this.mChart.getHoleRadius() / 100;
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 (this.mChart.isDrawHoleEnabled()) {
276
+ if (chart.drawHoleEnabled) {
254
277
  labelRadiusOffset = (radius - radius * holeRadiusPercent) / 2;
255
- if (!this.mChart.isDrawSlicesUnderHoleEnabled() && this.mChart.isDrawRoundedSlicesEnabled()) {
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 = this.mChart.getCustomRenderer();
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.isDrawValuesEnabled();
296
+ const drawValues = dataSet.drawValuesEnabled;
273
297
  if (!drawValues) {
274
298
  continue;
275
299
  }
276
300
  const yKey = dataSet.yProperty;
277
- const xValuePosition = dataSet.getXValuePosition();
278
- const yValuePosition = dataSet.getYValuePosition();
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.getValueFormatter();
282
- const entryCount = dataSet.getEntryCount();
283
- valueLinePaint.setColor(dataSet.getValueLineColor());
284
- valueLinePaint.setStrokeWidth(dataSet.getValueLineWidth());
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.getIconsOffset();
287
- const valuesOffset = dataSet.getValuesOffset();
288
- const isDrawIconsEnabled = dataSet.isDrawIconsEnabled();
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 = this.mChart.isUsePercentValuesEnabled() ? (entry[yKey] / yValueSum) * 100 : entry[yKey];
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.getValueLinePart1Length();
313
- const valueLineLength2 = dataSet.getValueLinePart2Length();
314
- const valueLinePart1OffsetPercentage = dataSet.getValueLinePart1OffsetPercentage() / 100;
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 (this.mChart.isDrawHoleEnabled()) {
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.isValueLineVariableLength() ? labelRadius * valueLineLength2 * Math.abs(Math.sin(transformedAngle * Utils.DEG2RAD)) : labelRadius * valueLineLength2;
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.getValueLineColor() !== ColorTemplate.COLOR_NONE) {
350
- if (dataSet.isUsingSliceColorAsValueLineColor()) {
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.getEntryCount() && entryLabel != null) {
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.getEntryCount() && entryLabel != null) {
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.getEntryCount() && entryLabel != null) {
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.getEntryCount() && entryLabel != null) {
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 && entry.icon != null) {
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
- Utils.drawIcon(c, this.mChart, icon, x, y);
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
- if (this.mChart.isDrawHoleEnabled()) {
414
- const radius = this.mChart.getRadius();
415
- const holeRadius = radius * (this.mChart.getHoleRadius() / 100);
416
- const center = this.mChart.getCenterCircleBox();
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 (ColorTemplate.getColorInstance(transparentCirclePaint.getColor()).a > 0 && this.mChart.getTransparentCircleRadius() > this.mChart.getHoleRadius()) {
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 * (this.mChart.getTransparentCircleRadius() / 100);
425
- transparentCirclePaint.setAlpha(alpha * this.mAnimator.getPhaseX() * this.mAnimator.getPhaseY());
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 centerText = this.mChart.getCenterText();
437
- if (this.mChart.isDrawCenterTextEnabled() && centerText != null) {
438
- const center = this.mChart.getCenterCircleBox();
439
- const offset = this.mChart.getCenterTextOffset();
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 = this.mChart.isDrawHoleEnabled() && !this.mChart.isDrawSlicesUnderHoleEnabled() ? this.mChart.getRadius() * (this.mChart.getHoleRadius() / 100) : this.mChart.getRadius();
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 = this.mChart.getCenterTextRadiusPercent() / 100;
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
- const drawInnerArc = this.mChart.isDrawHoleEnabled() && !this.mChart.isDrawSlicesUnderHoleEnabled();
479
- if (drawInnerArc && this.mChart.isDrawRoundedSlicesEnabled()) {
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.mAnimator.getPhaseX();
483
- const phaseY = this.mAnimator.getPhaseY();
540
+ const phaseX = this.animator.phaseX;
541
+ const phaseY = this.animator.phaseY;
484
542
  let angle;
485
- const rotationAngle = this.mChart.getRotationAngle();
486
- const drawAngles = this.mChart.getDrawAngles();
487
- const absoluteAngles = this.mChart.getAbsoluteAngles();
488
- const center = this.mChart.getCenterCircleBox();
489
- const radius = this.mChart.getRadius();
490
- const userInnerRadius = drawInnerArc ? radius * (this.mChart.getHoleRadius() / 100) : 0;
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 = this.mChart.getCustomRenderer();
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 = this.mChart.getData().getDataSetByIndex(high.dataSetIndex);
502
- if (set == null || !set.isHighlightEnabled()) {
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.getEntryCount();
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.getSliceSpace();
579
+ const sliceSpace = visibleAngleCount <= 1 ? 0 : set.sliceSpace;
520
580
  const sliceAngle = drawAngles[index];
521
581
  let innerRadius = userInnerRadius;
522
- const shift = set.getSelectionShift();
582
+ const shift = set.selectionShift;
523
583
  const highlightedRadius = radius + shift;
524
- highlightedCircleBox.set(this.mChart.getCircleBox());
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
- if (!this.mChart.isDrawRoundedSlicesEnabled()) {
667
+ const chart = this.mChart;
668
+ if (!chart.drawRoundedSlices) {
600
669
  return;
601
670
  }
602
- const dataSet = this.mChart.getData().getDataSet();
603
- if (!dataSet.isVisible()) {
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.mAnimator.getPhaseX();
608
- const phaseY = this.mAnimator.getPhaseY();
609
- const center = this.mChart.getCenterCircleBox();
610
- const r = this.mChart.getRadius();
611
- const circleRadius = (r - (r * this.mChart.getHoleRadius()) / 100) / 2;
612
- const drawAngles = this.mChart.getDrawAngles();
613
- let angle = this.mChart.getRotationAngle();
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.getEntryCount(); j++) {
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 != null) {
702
+ if (this.mBitmapCanvas) {
629
703
  this.mBitmapCanvas.setBitmap(null);
630
704
  this.mBitmapCanvas = null;
631
705
  }
632
- if (this.mDrawBitmap != null) {
706
+ if (this.mDrawBitmap) {
633
707
  const drawBitmap = this.mDrawBitmap.get();
634
- if (drawBitmap != null) {
708
+ if (drawBitmap) {
635
709
  releaseImage(drawBitmap);
636
710
  }
637
- this.mDrawBitmap.clear();
638
711
  this.mDrawBitmap = null;
639
712
  }
640
713
  }