Compare commits
205 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3deda8d9cc | ||
|
|
7d4ba652ec | ||
|
|
619246bee2 | ||
|
|
52b9b0a03a | ||
|
|
3301d5fd36 | ||
|
|
92abee1a6c | ||
|
|
90e9187808 | ||
|
|
b311d17d94 | ||
|
|
880a6b1885 | ||
|
|
fb841a3498 | ||
|
|
ac41dd1d07 | ||
|
|
39cee1bd52 | ||
|
|
f1c9a3ac4b | ||
|
|
2cb82526bc | ||
|
|
0499126e55 | ||
|
|
c2bafb8aa8 | ||
|
|
c83fe89a31 | ||
|
|
dd473b7d29 | ||
|
|
d1f424f3a1 | ||
|
|
efbe16b804 | ||
|
|
2d2e45da80 | ||
|
|
06bd26dc5f | ||
|
|
a0dba26318 | ||
|
|
e124d38d3e | ||
|
|
21ffcba0c0 | ||
|
|
ccf815c853 | ||
|
|
fc0451e535 | ||
|
|
b23c581b63 | ||
|
|
eafd7276c0 | ||
|
|
3818d1213e | ||
|
|
85b92ca2cc | ||
|
|
546ff1f61a | ||
|
|
da360693e6 | ||
|
|
ad3bc75d7c | ||
|
|
0b218f6dfe | ||
|
|
9e07617cc4 | ||
|
|
8bc66ca30a | ||
|
|
20da9dbe94 | ||
|
|
62f071e5a9 | ||
|
|
4c001c8130 | ||
|
|
4ad4505720 | ||
|
|
47caaa2113 | ||
|
|
2f8a1300d3 | ||
|
|
e4e1a69e76 | ||
|
|
a1c7e1a64b | ||
|
|
1c3afc0255 | ||
|
|
42059d9ab9 | ||
|
|
24d13a36d3 | ||
|
|
247abb2e3f | ||
|
|
e8ea30a9fb | ||
|
|
a1ba6b095d | ||
|
|
e4923ea598 | ||
|
|
ffd2521360 | ||
|
|
e7aae593bf | ||
|
|
aea4aa7c8d | ||
|
|
f9f2428142 | ||
|
|
ffed67d8ee | ||
|
|
063b5529d7 | ||
|
|
a54c50d947 | ||
|
|
9ddc543ed7 | ||
|
|
214b84c71d | ||
|
|
9fc75c78d7 | ||
|
|
ec3d012f08 | ||
|
|
c6896677b8 | ||
|
|
29b1f8a8c2 | ||
|
|
ddbfd9b7ef | ||
|
|
b9c72c8cb9 | ||
|
|
3db02b86b4 | ||
|
|
151ed168b5 | ||
|
|
be6a91b4c2 | ||
|
|
43de03951c | ||
|
|
21cd72b995 | ||
|
|
d466ac2bc1 | ||
|
|
6e9d9bfd3d | ||
|
|
d1438dd76f | ||
|
|
074c1a3992 | ||
|
|
5d24580725 | ||
|
|
301c66eccf | ||
|
|
2fc87d03cd | ||
|
|
33b71dc711 | ||
|
|
f5ec47c105 | ||
|
|
2e604529ee | ||
|
|
333dfb8e37 | ||
|
|
7eddebd660 | ||
|
|
d76b474a61 | ||
|
|
19744ec124 | ||
|
|
1bdb756ad1 | ||
|
|
bc1a11c4e3 | ||
|
|
6c42fe6399 | ||
|
|
ad77a79308 | ||
|
|
d5647a448d | ||
|
|
756df47fe3 | ||
|
|
1dd31f747e | ||
|
|
6568595abb | ||
|
|
61fb717d20 | ||
|
|
0a923400b2 | ||
|
|
7fb0765c6c | ||
|
|
e6c68be728 | ||
|
|
fdc7b41e8e | ||
|
|
45972a4cd9 | ||
|
|
d0d25b0221 | ||
|
|
143a037761 | ||
|
|
dc254fb722 | ||
|
|
b0d6bea256 | ||
|
|
4f38b59288 | ||
|
|
2acb841d2e | ||
|
|
ad3a8f9ad8 | ||
|
|
8c1dc44e1e | ||
|
|
25a06afb50 | ||
|
|
df4223421f | ||
|
|
f9b1eadd40 | ||
|
|
c61ad794a7 | ||
|
|
3b6ce91c65 | ||
|
|
c2a19ee47b | ||
|
|
768cf8d404 | ||
|
|
9a98d6a5df | ||
|
|
e40e19c197 | ||
|
|
59cd12d0eb | ||
|
|
e7978cbc30 | ||
|
|
10a36e0295 | ||
|
|
5853376a44 | ||
|
|
1bb9b455b4 | ||
|
|
de4f650e4f | ||
|
|
feb5e7fc32 | ||
|
|
378fccf8b4 | ||
|
|
9e1dd027e9 | ||
|
|
71ecebb466 | ||
|
|
4903ac53f0 | ||
|
|
35e8f3e902 | ||
|
|
d5fbd33534 | ||
|
|
c458846990 | ||
|
|
e3098e6e16 | ||
|
|
b22288eac4 | ||
|
|
99d824e3a0 | ||
|
|
6d41daa678 | ||
|
|
cdac6acd8c | ||
|
|
94d1398bd3 | ||
|
|
e2c7779493 | ||
|
|
9e95b8daa7 | ||
|
|
6d16a9c16a | ||
|
|
8af1796ff8 | ||
|
|
3b7e8184b0 | ||
|
|
33b7e5c1a4 | ||
|
|
24270e5c69 | ||
|
|
e3fb5685bf | ||
|
|
89e7a09e64 | ||
|
|
ee5efa9f8d | ||
|
|
2fe9a40f42 | ||
|
|
ddbd82bebf | ||
|
|
549ee43a37 | ||
|
|
3b9af0f8ec | ||
|
|
caee79630b | ||
|
|
a12c98b1a5 | ||
|
|
8617475808 | ||
|
|
922901380e | ||
|
|
96cb7ffc74 | ||
|
|
74cf4fe4ce | ||
|
|
eb948f03d5 | ||
|
|
6a6ab72ed8 | ||
|
|
df66f5c7ee | ||
|
|
042f9d3c01 | ||
|
|
1e6140a138 | ||
|
|
86125c597e | ||
|
|
fc346d30fb | ||
|
|
3e8bf7caee | ||
|
|
4e3182edfc | ||
|
|
b86cae6717 | ||
|
|
0c92d08f0d | ||
|
|
b1522a27d4 | ||
|
|
120c6d5408 | ||
|
|
e2120b3da6 | ||
|
|
58e6108bb2 | ||
|
|
3ef2e7c23c | ||
|
|
a361e191da | ||
|
|
f5a41b5119 | ||
|
|
42079848dc | ||
|
|
4b8374b1ae | ||
|
|
0990b11c1c | ||
|
|
99b1624b54 | ||
|
|
78a07aa2ae | ||
|
|
fe867d18e6 | ||
|
|
113c3887ae | ||
|
|
9f5040435f | ||
|
|
f21e9c6a32 | ||
|
|
a071956675 | ||
|
|
eab4f9530b | ||
|
|
757ccb04fb | ||
|
|
b4cb62241f | ||
|
|
0fb1cab302 | ||
|
|
ead9034870 | ||
|
|
20c87265a5 | ||
|
|
ce8b03b692 | ||
|
|
2505a48ac2 | ||
|
|
74e75e93af | ||
|
|
1e31cf3010 | ||
|
|
d33e2f66ef | ||
|
|
ff4fbb2176 | ||
|
|
9fc3ff862f | ||
|
|
bc31f86fcf | ||
|
|
c6412f5d78 | ||
|
|
0e60a26333 | ||
|
|
59bb60950b | ||
|
|
b3320bd2cd | ||
|
|
71cfbc15f3 | ||
|
|
8fbda1fa73 |
10399
Documentation~/en/api.md
@@ -1,7 +1,21 @@
|
||||
---
|
||||
sidebar_position: 61
|
||||
slug: /changelog
|
||||
---
|
||||
|
||||
# 更新日志
|
||||
# Changelog
|
||||
|
||||
[master](#master)
|
||||
[v3.15.0](#v3150)
|
||||
[v3.14.0](#v3140)
|
||||
[v3.13.0](#v3130)
|
||||
[v3.12.1](#v3121)
|
||||
[v3.12.0](#v3120)
|
||||
[v3.11.2](#v3112)
|
||||
[v3.11.1](#v3111)
|
||||
[v3.11.0](#v3110)
|
||||
[v3.10.2](#v3102)
|
||||
[v3.10.1](#v3101)
|
||||
[v3.10.0](#v3100)
|
||||
[v3.9.0](#v390)
|
||||
[v3.8.1](#v381)
|
||||
@@ -66,6 +80,227 @@
|
||||
|
||||
## master
|
||||
|
||||
## v3.15.0
|
||||
|
||||
Version Highlights:
|
||||
|
||||
* __Enhanced Timeline & Zoom Capabilities__: Added `DataZoom.minZoomRatio` (replacing `minShowNum`), `Chart.useUtc`, and continuous optimization of `Axis Time` performance during zooming and handling of large year ranges.
|
||||
* __More Flexible Bar Charts & Axis Configuration__: Added `Axis.mainAxis` to control bar chart orientation, `Serie.ignoreZeroOccupy` to control whether zero-value bars occupy space, and `AxisLine` extension line configurations.
|
||||
* __Improved Chart Styling & Interactivity__: Added `Pie.pieType`, `Legend.itemInactiveOpacity`, `Axis.onLabelClick`, `Animation.Exchange`, `LabelStyle.fixedX/fixedY`, and more.
|
||||
* __Ongoing Enhancement of Extended UI Components__: Added `Title` and `Viewport` configurations for `UITable`, enhanced `UIStatistic.desc`, and optimized `Comment.layer` and coordinate refresh experience.
|
||||
* __Focused Stability & Compatibility Fixes__: Resolved critical issues including `SaveAsImage` being blocked by other components, `Pie` click failures, `TMP` compatibility, `Gantt` time range and year 2038 problem, `MarkArea/GridCoord/Axis` and more.
|
||||
|
||||
Changelog Details:
|
||||
|
||||
* (2026.03.01) Released version `v3.15.0`
|
||||
* (2026.02.26) Added `ignoreZeroOccupy` to `Serie` to set whether zero-value Bars occupy space (#286)
|
||||
* (2026.02.26) Fixed `SaveAsImage` not saving correctly when blocked by other components (#337)
|
||||
* (2026.02.26) Added `mainAxis` parameter to `Axis` to set the main axis for controlling bar chart orientation (#331)
|
||||
* (2026.02.03) Fixed `UITable` `viewport` potentially drawing incorrectly under different anchor points
|
||||
* (2026.01.15) Fixed `Pie` click sometimes not responding (#357)
|
||||
* (2026.01.08) Added `minZoomRatio` to `DataZoom` to replace the old `minShowNum` (#350)
|
||||
* (2025.11.05) Fixed `Axis` `indicatorLabel` not being hideable
|
||||
* (2025.11.03) Added `Tooltip` `Title` time formatting via `TitleLabelStyle` `numericFormatter` (#353)
|
||||
* (2025.10.30) Added `useUtc` parameter to `Chart` to set whether displayed time uses UTC
|
||||
* (2025.10.30) Optimized `Candlestick` support for time axis
|
||||
* (2025.10.30) Added support for `ignore` in `Scatter` to skip data points
|
||||
* (2025.10.24) Optimized line drawing order for `Sankey`
|
||||
* (2025.10.22) Added `pieType` to `Pie` supporting solid pie charts and wireframe handle charts (#349)
|
||||
* (2025.09.05) Optimized `MarkLine` performance
|
||||
* (2025.09.01) Added `startExtendLength` and `endExtendLength` to `AxisLine` for setting axis line extensions
|
||||
* (2025.08.27) Fixed `Serie` `TitleStyle` not refreshing promptly when data changed
|
||||
* (2025.05.19) Fixed `Axis` runtime error when `TMP` is enabled
|
||||
* (2025.04.25) Fixed `MarkArea` drawing inaccurately when specifying `yValue` or `xValue`
|
||||
* (2025.04.17) Added `Title` support for `UITable` to set headers
|
||||
* (2025.04.17) Added `Viewport` support for `UITable` to set table viewport margins and borders
|
||||
* (2025.04.15) Added `Bar` support for color settings via `VisualMap`
|
||||
* (2025.04.14) Added `showZeroLabel` to `AxisLabel` to set whether to display zero tick
|
||||
* (2025.04.08) Added `desc` description text setting support for `UIStatistic`
|
||||
* (2025.04.07) Fixed `Gantt` chart calculating inaccurate time ranges with multi-dimensional data
|
||||
* (2025.04.07) Optimized `Axis` `Time` axis support for Custom and ceilRate settings
|
||||
* (2025.04.07) Fixed `GridCoord` covering charts when background color set and Serie Clip enabled
|
||||
* (2025.04.07) Fixed `Gantt` chart display errors when year exceeds 2038
|
||||
* (2025.04.07) Fixed `Axis` `Time` axis not displaying years beyond 2038
|
||||
* (2025.04.06) Fixed `Axis` `Time` axis text display errors when zoomed with `DataZoom`
|
||||
* (2025.03.28) Fixed `Pie3D` `avoidLabelOverlap` not working
|
||||
* (2025.03.27) Added `itemInactiveOpacity` to `Legend` to set color transparency for inactive states (#343)
|
||||
* (2025.03.27) Added `onLabelClick` callback event to `Axis`
|
||||
* (2025.03.26) Added `Exchange` sort swap animation to `Animation`
|
||||
* (2025.03.22) Added `layer` setting to `Comment`
|
||||
* (2025.03.21) Optimized coordinate refresh for `Comment`
|
||||
* (2025.03.19) Added `{index}` wildcard support for `Serie` `Label` `formatter`
|
||||
* (2025.03.18) Added `TitleStyle` component support for `Bar`
|
||||
* (2025.03.18) Added `fixedX` and `fixedY` to `LabelStyle` to fix label coordinates
|
||||
* (2025.03.17) Added `backgroundGap` to `ItemStyle` to set data item background gap
|
||||
|
||||
## v3.14.0
|
||||
|
||||
Version Highlights:
|
||||
|
||||
* Added real-time sorting functionality for `Bar`
|
||||
* Added support for `\n` line breaks in `itemFormatter` for `Tooltip`
|
||||
* Added support for `{index}` formatting in `AxisLabel`
|
||||
* Added `speed` to `Animation` to specify animation speed
|
||||
* Optimized column alignment in `Tooltip`
|
||||
|
||||
Changelog Details:
|
||||
|
||||
* (2025.03.15) Released version `v3.14.0`
|
||||
* (2025.03.09) Fixed an issue where `Bar` displayed abnormally when placed in different `Grids` within the same `Chart`
|
||||
* (2025.03.07) Added `speed` to `Animation` to specify animation speed
|
||||
* (2025.03.06) Optimized the performance of newly added animations in `Animation`
|
||||
* (2025.03.04) Fixed an issue where `label` in `Treemap` displayed abnormally
|
||||
* (2025.03.02) Added `columnGapWidths` parameter to `Tooltip` to set the gap distance between column texts
|
||||
* (2025.03.01) Optimized the refresh of `Comment` component
|
||||
* (2025.02.23) Added support for `{index}`, `{index-1}`, `{-index}`, and `{-index-1}` wildcards in `formatter` for `Label` in `Axis`
|
||||
* (2025.02.23) Added `realtimeSort` to `Bar` to support real-time sorting
|
||||
* (2025.02.19) Added support for `\n` line breaks in `itemFormatter` for `Tooltip`
|
||||
* (2025.02.18) Optimized the alignment of `Tooltip`
|
||||
* (2025.02.09) Fixed an issue where `SaveAsImage` did not support transparency when saving images (#337)
|
||||
* (2025.02.05) Added support for setting `data` styles separately in `GraphChart`
|
||||
* (2025.02.05) Refactored the `sizeFunction` parameter in `SerieSymbol`
|
||||
* (2025.01.23) Fixed an issue where `Label` in `Treemap` was not displayed
|
||||
* (2025.01.15) Fixed an issue where dynamically adding `Component` to `Chart` at runtime caused exceptions (#339)
|
||||
* (2025.01.08) Fixed an issue where residual components affected `Text` initialization when `TextMeshPro` was turned off
|
||||
|
||||
## v3.13.0
|
||||
|
||||
Version Highlights:
|
||||
|
||||
* Added the `UIText` extension component
|
||||
* Added the `UIToggle` extension component
|
||||
* Added the `UISlider` extension component
|
||||
* Refactored the `UIProgress` extension component
|
||||
* Added `borderWidth` and `emptyColor` configurations to `SymbolStyle`
|
||||
* Added the `size2` parameter to `SymbolStyle` to support rectangular markers
|
||||
* Other optimizations and bug fixes
|
||||
|
||||
Changelog Details:
|
||||
|
||||
* (2025.01.01) Released `v3.13.0`
|
||||
* (2024.12.27) Added the `size2` parameter to `SymbolStyle` to support rectangular markers
|
||||
* (2024.12.26) Optimized `Text` alignment in `TextMeshPro` for proper centering
|
||||
* (2024.12.25) Added support for `{f0}` in the `Tooltip`'s `itemFormatter` setting
|
||||
* (2024.12.25) Fixed an issue where some labels on the `YAxis` might not display during range refresh
|
||||
* (2024.12.23) Added `borderWidth` and `emptyColor` configurations to `SymbolStyle`
|
||||
* (2024.12.17) Added the `UISlider` extension component
|
||||
* (2024.12.10) Added the `UIToggle` extension component
|
||||
* (2024.12.09) Fixed an issue where the `UITable`'s `scrollbar` could not be dragged
|
||||
* (2024.12.07) Fixed an issue where custom nodes could not be placed under the `Chart` node
|
||||
* (2024.12.05) Added the `UIText` extension component
|
||||
* (2024.12.04) Removed the unused `tmpAlignment` option from `TextStyle`
|
||||
|
||||
## v3.12.1
|
||||
|
||||
Version Highlights:
|
||||
|
||||
* Enhanced Chinese and English support for the official website documentation.
|
||||
* Optimized the rendering performance of line charts when data points are densely packed.
|
||||
* Other issue fixes.
|
||||
|
||||
Log Details:
|
||||
|
||||
* (2024.12.01) Released `v3.12.1` version.
|
||||
* (2024.11.30) Fixed an issue where the `Tooltip` displayed incorrectly on mobile devices when setting other anchors in charts.
|
||||
* (2024.11.27) Resolved some code warning issues in `Unity6`.
|
||||
* (2024.11.26) Fixed a problem where the `Tooltip` might exceed the screen and appear incomplete under specific circumstances.
|
||||
* (2024.11.24) Fixed an issue where `UITable` would also select items during dragging.
|
||||
* (2024.11.22) Fixed an abnormal effect issue when dynamically changing the `Time` timeline with `Animation` enabled.
|
||||
* (2024.11.18) Optimized `Line` rendering for better performance when data points are densely packed.
|
||||
* (2024.11.16) Fixed an issue where `Animation` could not be enabled through code (#334).
|
||||
* (2024.11.13) Fixed a problem where dynamically modifying the `start` and `end` of `DataZoom` through code did not refresh the chart.
|
||||
* (2024.11.05) Fixed an issue where the `Title` remained visible after being set to hidden.
|
||||
* (2024.11.01) Improved `website` documentation in both English and Chinese.
|
||||
|
||||
## v3.12.0
|
||||
|
||||
Version Highlights:
|
||||
|
||||
* Added `radiusGradient` parameter for `Ring` to set the gradient direction
|
||||
* Added support for `date` and `time` in `numericFormatter`
|
||||
* Improved `origin` parameter setting for `AreaStyle` to define the starting position of area filling
|
||||
* Adjusted and perfected the documentation
|
||||
* Other optimizations and fixes
|
||||
|
||||
Changelog Details:
|
||||
|
||||
* (2024.09.30) Released version `v3.12.0`
|
||||
* (2024.09.27) Improved the `5-minute tutorial`
|
||||
* (2024.09.24) Improved support for multiple Series in `Legend`'s `formatter` (#332)
|
||||
* (2024.09.22) Adjusted the display style of the `Documentation`
|
||||
* (2024.09.09) Added support for `date` and `time` in `numericFormatter`
|
||||
* (2024.09.03) Improved the setting of the `origin` parameter for `AreaStyle` to define the starting position of area filling
|
||||
* (2024.09.01) Added `radiusGradient` parameter for `Ring` to set the gradient direction
|
||||
* (2024.09.01) Optimized the position of the first Label when `Axis` is used as a time axis
|
||||
|
||||
## v3.11.2
|
||||
|
||||
* (2024.08.01) Release `v3.11.2`
|
||||
* (2024.07.29) Fixed compatibility issue with `Tooltip` reporting error on wechat mini game platform (#326)
|
||||
* (2024.07.27) Adjust the default position of `AxisName` for `Axis`
|
||||
* (2024.07.22) Improved the behavior of `Pie`'s `Label` when `Tooltip` is triggered
|
||||
* (2024.07.21) Fix to `Tooltip` indicating inaccurate content when opening `DataZoom`
|
||||
* (2024.07.17) Fixed an issue where `Label` of `MarkLine` could flash during initialization
|
||||
* (2024.07.16) Optimized the default effect of `Tooltip` when `Axis` is `Time` timeline
|
||||
* (2024.07.15) Optimized segmentation when Axis is Time
|
||||
* (2024.07.14) Improved movement performance when `Axis` is `Time`
|
||||
* (2024.07.12) Optimized the initial display effect of `Label`
|
||||
* (2024.07.06) Fix to `Chart` background not adaptive when dynamically created (#323)
|
||||
|
||||
## v3.11.1
|
||||
|
||||
* (2024.07.01) Release `v3.11.1`
|
||||
* (2024.07.01) Fixed an issue where `Serie` has multiple abnormal colors
|
||||
* (2024.06.23) Fixed an issue where `labels` would pile up during initialization
|
||||
|
||||
## v3.11.0
|
||||
|
||||
Version Highlights:
|
||||
|
||||
* Added `Line3DChart` for 3D line charts
|
||||
* Added `GraphChart` for relationship graphs
|
||||
* Added support for 3D coordinate systems
|
||||
* Added `triggerOn` setting for `Tooltip` to define trigger conditions
|
||||
* Various bug fixes and optimizations
|
||||
|
||||
Changelog Details:
|
||||
|
||||
* (2024.06.16) Released version `v3.11.0`
|
||||
* (2024.06.15) Added buttons for adding, deleting, and moving data up and down under `Editor`
|
||||
* (2024.06.11) Fixed issue where `Axis`'s `IndicatorLabel` might overlap with `Tooltip`
|
||||
* (2024.06.11) Fixed issue where `Tooltip`'s `Axis` `IndicatorLabel` might not display when in `Cross` mode (#315)
|
||||
* (2024.06.10) Renamed `Tooltip`'s `Corss` to `Cross`
|
||||
* (2024.06.09) Added `minCategorySpacing` setting for `Axis` to define the default minimum category spacing
|
||||
* (2024.06.09) Fixed inaccurate indicator position of `Tooltip`'s `Cross` when `Axis` is a category axis and `DataZoom` is enabled
|
||||
* (2024.06.06) Fixed animation issue when `Serie` is cloned (#320)
|
||||
* (2024.06.04) Fixed issue where `Serie`'s `state` does not refresh when set dynamically via code
|
||||
* (2024.05.29) Adjusted the right-click menu of `XCharts` in the `Hierarchy` view to `UI/XCharts`
|
||||
* (2024.05.29) Added support for 3D coordinate systems to category axes
|
||||
* (2024.05.19) Optimized editing performance in `Editor`
|
||||
* (2024.05.09) Added utility class `JsonUtil`
|
||||
* (2024.05.01) Fixed the issue where `Tooltip` caused garbage collection (GC) on every frame (#311) (by @stefanbursuc)
|
||||
* (2024.04.23) Fixed chart exception issue after multiple calls to `ConvertXYAxis()`
|
||||
* (2024.04.22) Fixed potential incorrect retrieval of `GridCoord` when `DataZoom` controls multiple axes (#317)
|
||||
* (2024.04.22) Added 3D coordinate system
|
||||
* (2024.04.15) Optimized `DateTimeUtil` for timezone issues when converting timestamps to `DateTime`
|
||||
* (2024.04.15) Optimized `GridCoord` to display `Left` `Right` `Top` `Bottom` parameters even when `GridLayout` is enabled (#316)
|
||||
* (2024.04.14) Fixed incorrect label position of `Tooltip`'s `Cross` when `DataZoom` is enabled (#315)
|
||||
* (2024.04.12) Fixed incorrect effect of `Candlesticks` (#313)
|
||||
* (2024.03.20) Added `triggerOn` setting for `Tooltip` to define trigger conditions
|
||||
* (2024.03.19) Fixed color issue when setting `opacity` in `Pie`'s `ItemStyle` (#309)
|
||||
|
||||
## v3.10.2
|
||||
|
||||
* (2024.03.11) Release `v3.10.2`
|
||||
* (2024.03.11) Fix to `Legend`'s `formatter` showing possible mismatches when setting `{d}` (#304)
|
||||
* (2024.03.11) Fix to `Tooltip` still showing after moving out of coordinate system
|
||||
* (2024.03.08) Fixed an issue where `Tooltip`'s title might not appear after upgrading from an older version
|
||||
|
||||
## v3.10.1
|
||||
|
||||
* (2024.02.21) Release `v3.10.1`
|
||||
* (2024.02.19) Fix to `Tooltip` dot markers not adapting to color
|
||||
|
||||
## v3.10.0
|
||||
|
||||
Highlights:
|
||||
@@ -75,7 +310,7 @@ Highlights:
|
||||
* Added chart border Settings to support rounded corner charts
|
||||
* Fixed several issues
|
||||
|
||||
Extended features:
|
||||
Extension features:
|
||||
|
||||
* Added `SankeyChart` Sankey chart
|
||||
* Added `border` Settings for `UITable`
|
||||
@@ -116,7 +351,7 @@ Highlights:
|
||||
* Perfect code comments and documentation
|
||||
* Fixed several issues
|
||||
|
||||
Extended features:
|
||||
Extension features:
|
||||
|
||||
* `UITable` adds the carousel function
|
||||
* `UITable` adds data api and callback functions
|
||||
@@ -186,7 +421,7 @@ Log details:
|
||||
* (2023.08.22) Fixed `Bar` display hidden drawing performance exception
|
||||
* (2023.08.22) Improved Zebra histogram rendering performance (#276)
|
||||
* (2023.08.16) Added Daemon daemon to resolve an error after TMP is enabled locally
|
||||
* (2023.08.15) Fixed `Data` displaying axes incorrectly when data is between -1 and 1 (#273) (by **Ambitroc**)
|
||||
* (2023.08.15) Fixed `Data` displaying axes incorrectly when data is between -1 and 1 (#273) (b y@Ambitroc)
|
||||
* (2023.08.14) Fixed `XCharts` updating error after` TextMeshPro `and` NewInputSystem `are enabled locally (#272)
|
||||
* (2023.08.12) Fixed `Chart` error when deleted at runtime (#269)
|
||||
* (2023.08.11) Fixed an issue where data could not be added when DataZoom was enabled
|
||||
@@ -227,7 +462,7 @@ Log details:
|
||||
|
||||
* (2022.06.08) Release v3.7.0
|
||||
* (2023.06.04) Added `HelpDoc` help document skip
|
||||
* (2023.05.30) Fixed Serie name with `_` line causing `Legend` to not fire (#252) (by **svr2kos2**)
|
||||
* (2023.05.30) Fixed Serie name with `_` line causing `Legend` to not fire (#252) (by @svr2kos2)
|
||||
* (2023.05.10) Added `MinMaxAuto` range type for `Axis`
|
||||
* (2023.05.10) Added support for `Clip` for `Line`
|
||||
* (2023.05.04) Fixed `Axis` setting` CeilRate `not taking effect in range -1 to 1
|
||||
@@ -246,9 +481,9 @@ Log details:
|
||||
|
||||
* (2023.04.01) Release `v3.6.0` version
|
||||
* (2023.03.14) Fix for Tooltip's `titleFormater` setting `{b}` may not take effect
|
||||
* (2023.03.14) Fix for `BarChart` not drawing bar background when data is 0 (#250) (by **Ambitroc**)
|
||||
* (2023.03.14) Fix for `BarChart` not drawing bar background when data is 0 (#250) (by @Ambitroc)
|
||||
* (2023.03.12) Added `LabelStyle` `autoRotate` to set automatic rotation of angled vertical text
|
||||
* (2023.03.10) Added `VR` and other non-mouse input for Point location acquisition (#248) (by **Ambitroc**)
|
||||
* (2023.03.10) Added `VR` and other non-mouse input for Point location acquisition (#248) (by @Ambitroc)
|
||||
* (2023.03.09) Adds callbacks to Chart's `onSerieClick`, `onSerieDown`, `onSerieEnter` and `onSerieExit`
|
||||
* (2023.03.09) Fixed click-check offset for `Pie` not taking effect
|
||||
* (2023.03.04) Added Positions for Legend to customize legend positions
|
||||
@@ -262,7 +497,7 @@ Log details:
|
||||
* (2023.02.02) Fixed bug where datazoom xaxis label could be displayed off-chart when datazoom is turned on
|
||||
* (2023.02.02) Optimizes the `ignore` setting of `SerieData` to ignore data
|
||||
* (2023.02.01) Fix `XChartsMgr.ContainsChart()` interface exception
|
||||
* (2023.01.31) Added support for `InputSystem` (#242) (by **Bian-Sh**)
|
||||
* (2023.01.31) Added support for `InputSystem` (#242) (by @Bian-Sh)
|
||||
* (2023.01.11) Fixed chart not refreshing after removing Component from Inspector (#241)
|
||||
* (2023.01.06) Fixed bug with `Pie` displaying abnormal Label when the last few values are 0 (#240)
|
||||
* (2023.01.03) deletes serie `MarkColor` and adds ItemStyle `MarkColor`
|
||||
@@ -281,7 +516,7 @@ Log details:
|
||||
|
||||
Highlights:
|
||||
|
||||
* Updated documentation structure, added [Official XCharts Homepage](https://xcharts-team.github.io)
|
||||
* Updated documentation structure, added [Official XCharts Homepage](https://xcharts-team.github.io/en)
|
||||
* Added support for the DataZoom box selected.
|
||||
* Added support for maximum width Settings for bars.
|
||||
* Other optimizations.
|
||||
@@ -533,7 +768,7 @@ Details:
|
||||
* (2022.03.20) Release `v2.7.0` version
|
||||
* (2022.02.21) Fixed chart name repeat check error #183
|
||||
* (2022.02.17) Fixed bug where axis split line might be displayed outside the coordinate system #181
|
||||
* (2022.02.08) Fixed {d} formatter error when value is 0
|
||||
* (2022.02.08) Fixed `{d}` formatter error when value is 0
|
||||
* (2022.02.08) Fixed `YAxis` `AxisLabel`'s `onZero` does not work
|
||||
* (2022.01.06) Improved `Zebra` bar chart
|
||||
|
||||
|
||||
@@ -1,155 +1,127 @@
|
||||
# XCharts FAQ
|
||||
---
|
||||
sidebar_position: 41
|
||||
slug: /faq
|
||||
---
|
||||
|
||||
[FAQ 1: How to adjust the margin between the axis and the background?](#how-to-adjust-the-margin-between-the-axis-and-the-background)
|
||||
[FAQ 2: How to play agian the fadeIn animation?](#how-to-play-agian-the-fadein-animation)
|
||||
[FAQ 3: How to customize the color of data item in line chart and pie chart?](#how-to-customize-the-color-of-data-item-in-line-chart-and-pie-chart)
|
||||
[FAQ 4: How to formatter the text of axis label, such as add a units text?](#how-to-formatter-the-text-of-axis-label-such-as-add-a-units-text)
|
||||
[FAQ 5: How to stack the bar of bar chart](#how-to-stack-the-bar-of-bar-chart)
|
||||
[FAQ 6: How to make the bar serie in the same bar but not stack?](#how-to-make-the-bar-serie-in-the-same-bar-but-not-stack)
|
||||
[FAQ 7: How to adjust the bar width and gap of barchart?](#how-to-adjust-the-bar-width-and-gap-of-barchart)
|
||||
[FAQ 8: How to adjust the color of bar?](#how-to-adjust-the-color-of-bar)
|
||||
[FAQ 9: Can I adjust the anchor of chart?](#can-i-adjust-the-anchor-of-chart)
|
||||
[FAQ 10: Can display more than 1000 data?](#can-display-more-than-1000-data)
|
||||
[FAQ 11: Can line chart drawing be dash, dot and dash-dot?](#can-line-chart-drawing-be-dash-dot-and-dash-dot)
|
||||
[FAQ 12: How to limit the value range of the Y-axis?](#how-to-limit-the-value-range-of-the-y-axis)
|
||||
[FAQ 13: How to customize the tick value range of value axis?](#how-to-customize-the-tick-value-range-of-value-axis)
|
||||
[FAQ 14: How to display text at the top of data items?](#how-to-display-text-at-the-top-of-data-items)
|
||||
[FAQ 15: How do I customize icons for data items?](#how-do-i-customize-icons-for-data-items)
|
||||
[FAQ 16: How to anti-aliasing and make the chart smoother?](#how-to-anti-aliasing-and-make-the-chart-smoother)
|
||||
[FAQ 17: Why does mouse over chart Tooltip not show?](#why-does-mouse-over-chart-tooltip-not-show)
|
||||
[FAQ 18: How not to display the bar line of Tooltip?](#how-not-to-display-the-bar-line-of-tooltip)
|
||||
[FAQ 19: How do I customize the display of Tooltip?](#how-do-i-customize-the-display-of-tooltip)
|
||||
[FAQ 20: How do I get the Y-axis to display multiple decimal places?](#how-do-i-get-the-y-axis-to-display-multiple-decimal-places)
|
||||
[FAQ 21: How do I dynamically update data with code?](#how-do-i-dynamically-update-data-with-code)
|
||||
[FAQ 22: How to display legend? Why are legends sometimes not displayed?](#how-to-display-legend-why-are-legends-sometimes-not-displayed)
|
||||
[FAQ 23: How to make chart as prefab?](#how-to-make-chart-as-prefab)
|
||||
[FAQ 24: How do I draw custom graphic in chart,such as line or dot?](#how-do-i-draw-custom-content-in-chart-such-as-line-or-dot)
|
||||
[FAQ 25: How to achieve similar data movement effect of ELECTRO cardiogram?](#how-to-achieve-similar-data-movement-effect-of-electro-cardiogram)
|
||||
[FAQ 26: How do I use the background component? What are the conditions?](#how-do-i-use-the-background-component-what-are-the-conditions)
|
||||
[FAQ 27: Mesh can not have more than 65000 vertices?](#mesh-cannot-have-more-than-65000-vertices)
|
||||
[FAQ 28: Why are the parameters set in Serie reset after they run?](#why-are-the-parameters-set-in-serie-reset-after-they-run)
|
||||
[FAQ 29: How to change the color of serie symbol?](#how-to-change-the-color-of-serie-symbol)
|
||||
[FAQ 30: How to deal with TMP errors when importing or updating XCharts?](#what-if-tmp-errors-occur-when-importing-or-updating-xcharts)
|
||||
[FAQ 31: Support empty data? How to achieve the effect of line chart disconnection?](#support-empty-data-how-to-achieve-the-effect-of-line-chart-disconnection)
|
||||
[FAQ 32: 2.x What are the common problems when upgrading version 3.x?](#what-are-the-common-problems-when-upgrading-xcharts2-to-xcharts3)
|
||||
# FAQ
|
||||
|
||||
## how-to-adjust-the-margin-between-the-axis-and-the-background
|
||||
## FAQ 1: How to adjust the margin between the axis and the background?
|
||||
|
||||
`Grid` conponent,which can adjust the left, right, up, down margins of chart.
|
||||
|
||||
## how-to-play-agian-the-fadein-animation
|
||||
## FAQ 2: How to play agian the fadeIn animation?
|
||||
|
||||
call the `chart.AnimationReset()` API.
|
||||
|
||||
## how-to-customize-the-color-of-data-item-in-line chart-and-pie-chart
|
||||
## FAQ 3: How to customize the color of data item in line chart and pie chart?
|
||||
|
||||
`Theme`->`colorPalette`, or the sub component `LineStyle` and `ItemStyle` of `Serie`.
|
||||
|
||||
## how-to-formatter-the-text-of-axis-label-such-as-add-a-units-text
|
||||
## FAQ 4: How to formatter the text of axis label, such as add a units text?
|
||||
|
||||
Adjust `formatter` and `numericFormatter` parameter of `Legend`, `AxisLabel`, `Tooltop`, `SerieLabel`.
|
||||
|
||||
## how-to-stack-the-bar-of-bar-chart
|
||||
## FAQ 5: How to stack the bar of bar chart?
|
||||
|
||||
Set the `stack` parameter of `Serie`, the series will stack in a bar with the same `stack`.
|
||||
|
||||
## how-to-make-the-bar-serie-in-the-same-bar-but-not-stack
|
||||
## FAQ 6: How to make the bar serie in the same bar but not stack?
|
||||
|
||||
Set the `barGap` of `Serie` to `-1`,`stack` to null.
|
||||
|
||||
## how-to-adjust-the-bar-width-and-gap-of-barchart
|
||||
## FAQ 7: How to adjust the bar width and gap of barchart?
|
||||
|
||||
Adjust the `barWidth` and `barGap` parameter of `Serie`, the last `serie`'s `barWidth` and `barGap` are valid when multiple `serie`.
|
||||
|
||||
## how-to-adjust-the-color-of-bar
|
||||
## FAQ 8: How to adjust the color of bar?
|
||||
|
||||
Adjust the `ItemStyle` of `Data` in `inspector`.
|
||||
|
||||
## can-i-adjust-the-anchor-of-chart
|
||||
## FAQ 9: Can I adjust the anchor of chart?
|
||||
|
||||
Yes, you can set any one of 16 anchors but the value use default.
|
||||
|
||||
## can-display-more-than-1000-data
|
||||
## FAQ 10: Can display more than 1000 data?
|
||||
|
||||
Yes. But `UGUI` limits `65000` vertices to a single `Graphic`, so too much data may not be displayed completely. The sampling simplification curve can be turned on by setting the sampling distance `sampleDist`. You can also set some parameters to reduce the number of vertices in the chart to help show more data. Such as reducing the size of the chart, close or reduce the axis of the client drawing, close `Symbol` and `Label` display. A `Normal` line chart occupies fewer vertices than a `Smooth` line chart. The `1.5.0` and above versions can set `large` and `largeThreshold` parameters to enable performance mode.
|
||||
|
||||
## can-line-chart-drawing-be-dash-dot-and-dash-dot
|
||||
## FAQ 11: Can line chart drawing be dash, dot and dash-dot?
|
||||
|
||||
Yes. Adjust the `lineType` of `Serie`.
|
||||
|
||||
## how-to-limit-the-value-range-of-the-y-axis
|
||||
## FAQ 12: How to limit the value range of the Y-axis?
|
||||
|
||||
Select the `minMaxType` of `Axis` as `Custom`, then set `min` and `max` to the values you want.
|
||||
|
||||
## how-to-customize-the-tick-value-range-of-value-axis
|
||||
## FAQ 13: How to customize the tick value range of value axis?
|
||||
|
||||
By default, it is automatically split by the `splitNumber` of `Axis`. Also, you can customize the `interval` to the range you want.
|
||||
|
||||
## how-to-display-text-at-the-top-of-data-items
|
||||
## FAQ 14: How to display text at the top of data items?
|
||||
|
||||
Adjust the `Label` of `Serie`.
|
||||
|
||||
## how-do-i-customize-icons-for-data-items
|
||||
## FAQ 15: How do I customize icons for data items?
|
||||
|
||||
Set the `Icon` of `Data` in `Serie`.
|
||||
|
||||
## how-to-anti-aliasing-and-make-the-chart-smoother
|
||||
## FAQ 16: How to anti-aliasing and make the chart smoother?
|
||||
|
||||
Open the `Anti-Aliasing` setting in `Unity`. Selected the UI Canvas `Render Mode` as `Screen Space-Camera`, selected `MSAA`, set `4` times or higher anti-aliasing. The sawtooth can only be reduced and unavoidable. The higher the pixel, the less obvious the sawtooth is.
|
||||
|
||||
## why-does-mouse-over-chart-tooltip-not-show
|
||||
## FAQ 17: Why does mouse over chart Tooltip not show?
|
||||
|
||||
Verify `Toolip` is opened. Verify that the parent node of chart has turned off mouse events.
|
||||
|
||||
## how-not-to-display-the-bar-line-of-tooltip
|
||||
## FAQ 18: How not to display the bar line of Tooltip?
|
||||
|
||||
Set the `type` of `Tooltup` as `None`. Or adjust the parameters of `lineStyle`.
|
||||
|
||||
## how-do-i-customize-the-display-of-tooltip
|
||||
## FAQ 19: How do I customize the display of Tooltip?
|
||||
|
||||
See the `formatter`, `itemFormatter`, `titleFormatter` parameters of `Tooltip`.
|
||||
|
||||
## how-do-i-get-the-y-axis-to-display-multiple-decimal-places
|
||||
## FAQ 20: How do I get the Y-axis to display multiple decimal places?
|
||||
|
||||
Set the `numericFormatter` parameter of `AxisLabel`.
|
||||
|
||||
## how-do-i-dynamically-update-data-with-code
|
||||
## FAQ 21: How do I dynamically update data with code?
|
||||
|
||||
See example: `Example01_UpdateData.cs`
|
||||
|
||||
## how-to-display-legend-why-are-legends-sometimes-not-displayed
|
||||
## FAQ 22: How to display legend? Why are legends sometimes not displayed?
|
||||
|
||||
First, the `name` in `Serie` must have a value that is not null. Then set `Legend` is `show`, where `data` can be empty by default, indicating that all legends are displayed. If you only want to display part of the `Serie` legend, fill in `data` with the `name` of the legend you want to display. If none of the values in `data` are `name` of the series, the legend will not be displayed.
|
||||
|
||||
## how-to-make-chart-as-prefab
|
||||
## FAQ 23: How to make chart as prefab?
|
||||
|
||||
Before make prefab, please delete all sub gameObject under chart which auto-created by `XCharts`.
|
||||
|
||||
## how-do-i-draw-custom-content-in-chart-such-as-line-or-dot
|
||||
## FAQ 24: How do I draw custom graphic in chart,such as line or dot?
|
||||
|
||||
Implement `onCustomDraw` of chart, see `Example12_CustomDrawing.cs`.
|
||||
|
||||
## how-to-achieve-similar-data-movement-effect-of-electro-cardiogram
|
||||
## FAQ 25: How to achieve similar data movement effect of ELECTRO cardiogram?
|
||||
|
||||
See `Example_Dynamic.cs`.
|
||||
|
||||
## how-do-i-use-the-background-component-what-are-the-conditions
|
||||
## FAQ 26: How do I use the background component? What are the conditions?
|
||||
|
||||
Setting `show` to `true` for the `background` component.
|
||||
|
||||
## mesh-cannot-have-more-than-65000-vertices
|
||||
## FAQ 27: Mesh can not have more than 65000 vertices?
|
||||
|
||||
This is the limit of `UGUI` on the number of vertices for a single `Graphic`. `XCharts` is draw chart on a single `Graphic`, so there is also this limitation. The solution can be referred to: [FAQ 10: Can display more than 1000 data](#can-display-more-than-1000-data)
|
||||
This is the limit of `UGUI` on the number of vertices for a single `Graphic`. `XCharts` is draw chart on a single `Graphic`, so there is also this limitation. The solution can be referred to: [FAQ 10: Can display more than 1000 data?](#FAQ-10-can-display-more-than-1000-data)
|
||||
|
||||
## why-are-the-parameters-set-in-serie-reset-after-they-run
|
||||
## FAQ 28: Why are the parameters set in Serie reset after they run?
|
||||
|
||||
Check whether `RemoveData()` and add new `Serie` in the code. If you want to keep the configuration of `Serie`, you can only `ClearData()` which just clear data and then readd the data to the old serie.
|
||||
|
||||
## how-to-change-the-color-of-serie-symbol
|
||||
## FAQ 29: How to change the color of serie symbol?
|
||||
|
||||
The color of 'Symbol' is the color of 'ItemStyle' used.
|
||||
|
||||
## what-if-tmp-errors-occur-when-importing-or-updating-xcharts
|
||||
## FAQ 30: How to deal with TMP errors when importing or updating XCharts?
|
||||
|
||||
XCharts does not enable TMP by default, so there are no references to TMP on asmdef. This issue may occur when updating XCharts after TMP is enabled locally. It can be solved in the following two ways:
|
||||
|
||||
@@ -158,11 +130,23 @@ XCharts does not enable TMP by default, so there are no references to TMP on asm
|
||||
|
||||
Version ` 3.8.0 ` after adding Daemon [XCharts - Daemon](https://github.com/XCharts-Team/XCharts-Daemon), will be XCharts - Daemon import project, When updating XCharts, the daemon automatically refreshes the asmdef based on the locally enabled TMP to ensure proper compilation.
|
||||
|
||||
## support-empty-data-how-to-achieve-the-effect-of-line-chart-disconnection
|
||||
## FAQ 31: Support empty data? How to achieve the effect of line chart disconnection?
|
||||
|
||||
`data` of `Serie` is of type `double`, so it cannot represent empty data. Empty data can be achieved by turning on Serie's ignore and specifying ignoreValue. You can also set the ignore parameter for each SerieData. The ignoreLineBreak parameter can be set to disconnect or connect after ignoring data.
|
||||
|
||||
## what-are-the-common-problems-when-upgrading-xcharts2-to-xcharts3
|
||||
## FAQ 32: 2.x What are the common problems when upgrading version 3.x?
|
||||
|
||||
1. `XCharts.Runtime.XChartsMgr` is missing the class attribute `ExtensionOfNativeClass`!
|
||||
3.x version does not need to mount XChartsMgr, directly delete the `_xcharts_` node on the scene.
|
||||
|
||||
## FAQ 33: How to display a line chart without white space on both sides and start from the 0 coordinate?
|
||||
|
||||
Set the `boundaryGap` parameter of the X-axis.
|
||||
|
||||
## FAQ 34: How to set some Series not to display Tooltips?
|
||||
|
||||
Setting the `itemFormatter` of `itemStyle` in `serie` to `'-'` can ignore `tooltip`.
|
||||
|
||||
## FAQ 35: Sometimes an overlapping line appears in the area line chart when using semi-transparent colors
|
||||
|
||||
This is a bug in the drawing of the area line chart. You can use light opaque colors instead of semi-transparent colors.
|
||||
|
||||
|
Before Width: | Height: | Size: 293 KiB After Width: | Height: | Size: 704 KiB |
|
Before Width: | Height: | Size: 225 KiB After Width: | Height: | Size: 660 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 86 KiB |
BIN
Documentation~/en/img/tutorial01_axisdata.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
Documentation~/en/img/tutorial01_seriedata.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
9
Documentation~/en/support.md
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title: Support
|
||||
sidebar_position: 51
|
||||
slug: /support
|
||||
---
|
||||
|
||||
# Support
|
||||
|
||||
For technical support and to purchase additional charts, you can subscribe to the `VIP` service. For details, please send an email to `monitor1394@gmail.com` for consultation.
|
||||
@@ -1,103 +1,170 @@
|
||||
---
|
||||
title: Introductory tutorial: Get started with XCharts 3.0 in 5 minutes
|
||||
title: Getting Started
|
||||
sidebar_position: 11
|
||||
slug: /tutorial01
|
||||
---
|
||||
|
||||
# Tutorial: Get started with XCharts 3.0 in 5 minutes
|
||||
# Getting Started with XCharts in 5 Minutes
|
||||
|
||||
> Note: This tutorial is for XCharts 3.x version only
|
||||
:::warning
|
||||
|
||||
## What do I need to know before using XCharts
|
||||
Note: This tutorial is only applicable to the XCharts 3.x version. For the 2.x version, please refer to [Tutorial: Mastering XCharts 2.0](https://github.com/XCharts-Team/XCharts/blob/2.0/Doc/tutorial--get-start-with-xcharts-in-5-minute-EN.md)
|
||||
|
||||
- Have used Unity, know the basic operation of Unity.
|
||||
- Understand UGUI and can use UGUI.
|
||||
- Understand MonoBehavior script usage in Unity, know how to hang scripts, manipulate scripts with code.
|
||||
:::
|
||||
|
||||
## Get and import XCharts
|
||||
## Prerequisites for XCharts
|
||||
|
||||
XCharts can be imported into a project in any of the following ways:
|
||||
XCharts is a Unity chart plugin, currently only available for use on the Unity platform.
|
||||
|
||||
- Source XCharts directly into the project
|
||||
Before using XCharts, you need to:
|
||||
|
||||
After downloading the XCharts source code, copy the XCharts directory directly to the Assets directory of the Unity project.
|
||||
- Have a basic understanding of how to use Unity.
|
||||
- Understand the basic usage of UGUI for making UI.
|
||||
- Know how to use Unity's MonoBehavior scripts, how to attach scripts, and how to manipulate scripts with code.
|
||||
|
||||
- Import XCharts through `Assets/Import Package`
|
||||
If you are new to Unity, it is recommended to learn some basic Unity tutorials before using XCharts.
|
||||
|
||||
After downloading the.unitypackage file for XCharts, open Unity and go to the menu bar Assets--> Import Package--> Select.unitypackage import to start using XCharts.
|
||||
## Obtaining and Importing XCharts
|
||||
|
||||
- Import XCharts through the Package Manager
|
||||
XCharts is primarily maintained and released through Github. You can download the source code and Package from the [Github Homepage](https://github.com/XCharts-Team).
|
||||
|
||||
For Unity 2018.3 and later, XCharts can be imported through the Package Manager. After opening the Package Manager, run the `Add package form git URL...`, input XCharts dead simple URL: ` https://github.com/XCharts-Team/XCharts.git use XCharts after ` wait a moment.
|
||||
XCharts can be imported into your project in any of the following ways:
|
||||
|
||||
You can also add the package directly to the manifest.json file: Open the manifest.json file in the Packages directory and add it under dependencies:
|
||||
### Copying the XCharts Source Code Directly into the Project
|
||||
|
||||
``` json
|
||||
"com.monitor1394.xcharts" : "https://github.com/XCharts-Team/XCharts.git",
|
||||
```
|
||||
After downloading the XCharts source code, simply copy the XCharts directory into the Assets directory of your Unity project. Once compiled, it is ready to use.
|
||||
|
||||
To update XCharts, remove com.monitor1394.xcharts from the manifest.json file under lock (some versions of Unity may be packages-lock.json) and re-download and compile.
|
||||
### Importing XCharts through Import Package
|
||||
|
||||
- Recommended daemon into XCharts (not required)
|
||||
After downloading the .unitypackage file of XCharts, open Unity, go to the menu bar Assets-->Import Package-->select the downloaded .unitypackage to import. After the import is complete and compiled, you can start using XCharts.
|
||||
|
||||
[XCharts Daemon](https://github.com/XCharts-Team/XCharts-Daemon) can ensure update compilation is normal, when the local open TextMeshPro or NewInputSystem would be very useful. After importing Xchart-daemon into a project, when updating XCharts, the Daemon will automatically refresh asmdef according to the status of local TMP, etc., to ensure normal compilation and facilitate the execution of automated processes such as CI-CD.
|
||||
### Importing XCharts through Package Manager
|
||||
|
||||
## Add a simple chart
|
||||
For Unity versions above 2018.3, you can import XCharts through the Package Manager. Open the Package Manager, then use `Add package from git URL...`, enter the GitHub URL of XCharts: `https://github.com/XCharts-Team/XCharts.git`. After compiling, you can use XCharts.
|
||||
|
||||
Right-click in `Hierarchy` view or menu bar `GameObject` drop down and select `XCharts->LineChart`, can quickly create a default line chart out:
|
||||
For some Unity versions, you can also directly add the package to the `manifest.json` file: Open the `manifest.json` file under the `Packages` directory, and add the following under `dependencies`:
|
||||
|
||||
>"com.monitor1394.xcharts": "https://github.com/XCharts-Team/XCharts.git",
|
||||
|
||||
If you need to update `XCharts`, delete the relevant content of `com.monitor1394.xcharts` under the `lock` of the `manifest.json` file (some Unity versions may be the packages-lock.json file), and it will re-download and compile.
|
||||
|
||||
### Recommended Import of XCharts Daemon
|
||||
|
||||
The daemon [XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon) ensures that the compilation is normal when updating. It is very useful when TextMeshPro or NewInputSystem is turned on locally. After importing XCharts-Daemon into the project, the daemon will automatically refresh XCharts' asmdef according to the local situation of TMP when updating XCharts, ensuring that the compilation is normal without manual intervention, which is convenient for automated processes such as CI/CD.
|
||||
|
||||
The import method of XCharts-Daemon can refer to the previous import method of XCharts. It can be imported into the project through source code or Package. The GitHub URL of XCharts-Daemon: https://github.com/XCharts-Team/XCharts-Daemon.git
|
||||
|
||||
## Basic Usage of XCharts
|
||||
|
||||
After importing XCharts and compiling, the XCharts menu will appear in the Unity editor's menu bar, and you can start using XCharts.
|
||||
|
||||
:::tip
|
||||
|
||||
Note: The XCharts menu in the Unity menu bar indicates that XCharts is available.
|
||||
|
||||
:::
|
||||
|
||||
### Adding a Simple Chart
|
||||
|
||||
In the `Hierarchy` view, right-click `UI->XCharts->LineChart` or select `LineChart` from the menu bar `XCharts` to quickly create a default line chart:
|
||||
|
||||

|
||||
|
||||
## Add multiple Seire
|
||||
If you need to create a chart under a certain node, you can select the node and right-click `UI->XCharts->LineChart` to create a chart under the node.
|
||||
|
||||
In the Inspector view, locate LineChart's panel, and with the `Add Serie` button, you can add a second Line line:
|
||||
### Modifying Chart Data
|
||||
|
||||
For the newly created chart, its data can be modified on the Inspector panel.
|
||||
|
||||
For X-axis data, you can add, delete, and modify by expanding: `XAxis->Data`:
|
||||
|
||||

|
||||
|
||||
For Serie data, you can add, delete, and modify by expanding: `Serie->Data`:
|
||||
|
||||

|
||||
|
||||
Serie supports multi-dimensional data, and generally, a line chart only uses two-dimensional data: the first dimension represents the ID of the X-axis category data, and the second dimension represents the corresponding value.
|
||||
|
||||
### Adding Multiple Series
|
||||
|
||||
In the `Inspector` view, find the `LineChart` panel, and click the `Add Serie` button to add a second `Line` line:
|
||||
|
||||

|
||||

|
||||
|
||||
## Add other components
|
||||
:::tip
|
||||
|
||||
The default chart does not have a `Legend`, and a `Legend` Component can be added via the `Add Component` button:
|
||||
Series are added through the `Add Serie` button. Different types of Series can be added. [What kinds of Series does XCharts have?](https://xcharts-team.github.io/en/docs/configuration#serie-系列)
|
||||
|
||||
:::
|
||||
|
||||
### Adding Other Main Components
|
||||
|
||||
By default, the chart does not have a `Legend`. If you need a `Legend` component, you can add it through the `Add Component` button:
|
||||
|
||||

|
||||
|
||||
## Add Serie components
|
||||
:::tip
|
||||
|
||||
Serie comes with only a few common components, and others are added as needed. For example, if you need to fill a line chart area with color, you can add a separate `AreaStyle` component to Serie:
|
||||
Main components are added through the `Add Component` button. [What main components does XCharts have?](https://xcharts-team.github.io/en/docs/configuration/#maincomponent-主组件)
|
||||
|
||||
:::
|
||||
|
||||
### Adding Serie Components
|
||||
|
||||
Serie only comes with a few common components, and other components need to be added when used. For example, if you need to fill the area color for the line chart, you can add an `AreaStyle` component to `Serie` separately:
|
||||
|
||||

|
||||

|
||||
|
||||
## Add the SerieData component
|
||||
:::tip
|
||||
|
||||
If you need to personalize the configuration of each data item, you can add a Component to each SerieData separately. For example, we give the second data of the line chart a separate display `Label`:
|
||||
Serie components are added through the button on the right side of Serie. [What components can be added to Serie in XCharts?](https://xcharts-team.github.io/en/docs/configuration/#iseriecomponent-可添加到serie的组件)
|
||||
|
||||
:::
|
||||
|
||||
### Adding SerieData Components
|
||||
|
||||
If you need to customize the configuration of each data item individually, you can add components to each `SerieData` separately. For example, we can display `Label` for the second data of the line chart individually:
|
||||
|
||||

|
||||

|
||||
|
||||
## More components and configuration parameters
|
||||
:::tip
|
||||
|
||||
XCharts has been iteratively optimized and now has dozens of main and sub-components, each with a few to dozens of configurable parameters to support a variety of flexible and complex functions.
|
||||
SerieData components are added through the button on the right side of SerieData after expanding. [What components can be added to SerieData in XCharts?](https://xcharts-team.github.io/en/docs/configuration/#iseriedatacomponent-可添加到seriedata的组件)
|
||||
|
||||
Using XCharts for the first time, you can add various charts in the `Inspector` view, add or adjust the components in the chart, and the `Game` view gives real-time feedback on the effects of adjustments to familiarize yourself with the use of various components. Detailed parameter descriptions of each component can be found in the [XCharts Configuration](Configuration.md).
|
||||
:::
|
||||
|
||||
## How to adjust parameters quickly
|
||||
### More Components and Configuration Parameters
|
||||
|
||||
XCharts is configuration and data driven. Want what effect, only need to adjust the configuration parameters under the corresponding component can be, do not need to change the nodes under the `Hierarchy` view, because those nodes are generated by the `XCharts` internal according to the configuration and data, even if changed will be restored in the refresh.
|
||||
XCharts has been continuously iterated and optimized, and now has dozens of main components and sub-components, each with several to dozens of configurable parameters to support a variety of functions.
|
||||
|
||||
How to quickly locate the component corresponding to the effect you want to change requires a certain understanding of the component. For example, if we want to show an arrow at the end of the X-axis, how do we position it? First, position the X-axis to `XAxis0`; Second, locate the axis to `AxisLine`; Finally, check to see if there are any parameters in the AxisLine component that can achieve this effect, and check [XCharts configuration](Configuration.md) for uncertain parameters.
|
||||
When using XCharts for the first time, it is recommended to personally test the actual effects of each chart, each component. The `Inspector` view can directly add various charts, components, and adjust various configuration parameters, and the `Game` view will provide real-time feedback on the adjustments. A detailed description of each component's parameters can be found in the [XCharts Configuration Manual](configuration.md).
|
||||
|
||||
`XCharts` provides a full range of parameter configuration from the global` Theme `, series` Serie `, and single data item `SerieData`. The priority in descending order is: `SerieData` -> `Serie` -> `Theme`. Take the color of `ItemStyle` for example:
|
||||
### How to Quickly Adjust Parameters
|
||||
|
||||
1. If the `ItemStyle` of `SerieData` has a color value other than `0000`, this color value is preferred.
|
||||
2. If the ItemStyle of `Serie` is configured with a color value other than `0000`, this color value takes precedence.
|
||||
3. Otherwise, the Color value is taken from the Color Palette of the Theme.
|
||||
XCharts is driven by data and parameters. To achieve the desired effect, simply adjust the configuration parameters under the corresponding component. Do not modify the nodes under the `Hierarchy` view, as those nodes are generated by XCharts internally based on configuration and data, and will be restored upon refresh.
|
||||
|
||||
Usually, `0000` indicates the theme default color, and 0 or null indicates the theme default.
|
||||
To quickly locate the component corresponding to the effect you want to change, you need to have a certain understanding of the components. For example, we want to display an arrow at the end of the X-axis line. How to locate it? The first step, the X-axis is located at `XAxis0`; the second step, the axis line is located at `AxisLine`; finally, check if there is such a parameter under the `AxisLine` component to achieve this effect. If you are not sure about the parameters, you can refer to the [XCharts Configuration Manual](configuration.md).
|
||||
|
||||
## Add line charts with code
|
||||
`XCharts` provides comprehensive parameter configuration from the global `Theme`, series `Serie`, and individual data items `SerieData`. The priority order from high to low is: `SerieData`->`Serie`->`Theme`. Take the color of `ItemStyle` as
|
||||
an example:
|
||||
|
||||
Attach the `LineChart` script to the gameObject:
|
||||
1. If the `ItemStyle` of `SerieData` has a color value other than `0000`, this color value is used first.
|
||||
2. If the `ItemStyle` of `Serie` has a color value other than `0000`, this color value is used.
|
||||
3. Otherwise, the color value is taken from the `Color Palette` of the theme `Theme`.
|
||||
|
||||
:::tip
|
||||
|
||||
The color value is usually `0000` when using the default color of the theme; other parameters are `0` or null when using the default configuration of the theme; pay attention to transparency when setting colors.
|
||||
|
||||
:::
|
||||
|
||||
### Adding a Line Chart with Code
|
||||
|
||||
Attach the `LineChart` script to `gameObject`:
|
||||
|
||||
```csharp
|
||||
var chart = gameObject.GetComponent<LineChart>();
|
||||
@@ -108,10 +175,10 @@ if (chart == null)
|
||||
}
|
||||
```
|
||||
|
||||
Resize:
|
||||
Adjust the size:
|
||||
|
||||
```csharp
|
||||
chart.SetSize(580, 300);//代码动态设置尺寸,或直接操作chart.rectTransform,或直接在Inspector上改
|
||||
chart.SetSize(580, 300);//Dynamically set the size with code, or directly operate chart.rectTransform, or directly change it in the Inspector
|
||||
```
|
||||
|
||||
Set the title:
|
||||
@@ -121,7 +188,7 @@ var title = chart.EnsureChartComponent<Title>();
|
||||
title.text = "Simple Line";
|
||||
```
|
||||
|
||||
Set whether prompt boxes and legends are displayed:
|
||||
Set whether to display the tooltip and legend:
|
||||
|
||||
```csharp
|
||||
var tooltip = chart.EnsureChartComponent<Tooltip>();
|
||||
@@ -131,7 +198,7 @@ var legend = chart.EnsureChartComponent<Legend>();
|
||||
legend.show = false;
|
||||
```
|
||||
|
||||
Set axes:
|
||||
Set the coordinate axis:
|
||||
|
||||
```csharp
|
||||
var xAxis = chart.EnsureChartComponent<XAxis>();
|
||||
@@ -143,14 +210,22 @@ var yAxis = chart.EnsureChartComponent<YAxis>();
|
||||
yAxis.type = Axis.AxisType.Value;
|
||||
```
|
||||
|
||||
Clear default data and add `Line` type `Serie` for receiving data:
|
||||
Clear all default data (including Series), add a `Line` type `Serie` to receive data:
|
||||
|
||||
```csharp
|
||||
chart.RemoveData();
|
||||
chart.AddSerie<Line>("line");
|
||||
```
|
||||
|
||||
Add 10 data:
|
||||
If the Serie is fixed, it is recommended to only clear the data, not to remove the Serie:
|
||||
|
||||
```csharp
|
||||
chart.ClearData();
|
||||
```
|
||||
|
||||
This way, you can set the configuration parameters of Serie in the UI in advance.
|
||||
|
||||
Add 10 data points:
|
||||
|
||||
```csharp
|
||||
for (int i = 0; i < 10; i++)
|
||||
@@ -160,59 +235,86 @@ for (int i = 0; i < 10; i++)
|
||||
}
|
||||
```
|
||||
|
||||
So a simple line chart comes out:
|
||||
Now, a simple line chart is ready:
|
||||
|
||||

|
||||
|
||||
If there are multiple series in a Chart, the data of Axis only needs to be added once, rather than repeated in multiple cycles. Remember: the number of data in Axis should be the same as the number in Serie.
|
||||
If there are multiple series in a Chart, the data of Axis only needs to be added once, and should not be repeated in multiple loops.
|
||||
|
||||
See `Examples`: `Example13_LineSimple.cs` for the complete code
|
||||
:::tip
|
||||
|
||||
You can also use code to control more parameters, there are more Examples under `Examples`, all the configurable parameters seen in the `Inspector` can be set by code. All parameters in [XCharts configuration](Configuration.md) can be controlled by code.
|
||||
Remember: The number of Axis data should be consistent with the number of Serie data.
|
||||
|
||||
In addition, unless customized, it is recommended to call the `public` interface provided under `Chart`, especially in the data-related operations section. These interfaces do some associated processing inside, such as refreshing charts. Common interfaces are:
|
||||
:::
|
||||
|
||||
1. `Chart.ClearData()` : Clear chart data (without removing Series)
|
||||
2. `Chart.RemoveData()` : Clear chart data (will remove all Serie)
|
||||
3. `chart.AddSerie()` : AddSerie
|
||||
4. `chart.AddXAxisData()` : Add X-axis data
|
||||
5. `chart.AddData()` : Adds Serie data
|
||||
6. `chart.UpdateData()` : Updates Serie data
|
||||
7. `chart.UpdateXAxisData()` : Updates the X-axis data
|
||||
8. `chart.UpdateDataName()` : Updates the Serie data name
|
||||
For the complete code, please refer to `Examples`: `Example13_LineSimple.cs`
|
||||
|
||||
XCharts has an automatic refresh mechanism inside, but it only triggers under certain conditions. If you call the interface of the internal component, encounter the component did not refresh, and indeed can not find the reason, you can use the following two interfaces to force refresh:
|
||||
You can also control more parameters with code. There are more examples in `Examples`. All parameters that can be configured in the `Inspector` can be set with code. All parameters in the [XCharts Configuration Manual](configuration.md) can be controlled by code.
|
||||
|
||||
1. `chart.RefreshAllComponent()` : refresh chart component, to initialize all of the components, often is not recommended.
|
||||
2. `chart.RefreshChart()` : refreshes the chart drawing, only the drawing part is refreshed, and the component text, position, etc., is not refreshed.
|
||||
3. Individual components can also refresh only themselves by `SetAllDirty()`.
|
||||
### Setting the Default Font
|
||||
|
||||
## Use TextMeshPro
|
||||
The default font used by XCharts is Unity's default font `Arial`, which may not display Chinese characters on the WebGL platform. When using XCharts in your project, it is recommended to set the font first:
|
||||
|
||||
XCharts supports TextMeshPro, but it is disabled by default and needs to be switched manually. It can be turned on and off in the following ways:
|
||||
- Find the `XCharts/Resources/XCSetting.asset` resource and modify the `Font` inside and save.
|
||||
- Find the `XCharts/Resources/XCTheme-Default.asset` and `XCharts/Resources/XCTheme-Dark.asset` font configurations, and click the `Sync Font from Setting` and `Sync Font to Sub Theme` buttons to synchronize the font to the theme configuration files.
|
||||
|
||||
After the font is set, newly created charts will use the newly set font. For old charts, you can click the `Rebuild Chart Object` button to refresh.
|
||||
|
||||
:::tip
|
||||
|
||||
It is recommended to set the font before using XCharts; when updating XCharts, pay attention to the potential restoration of the set font.
|
||||
|
||||
:::
|
||||
|
||||
### Using TextMeshPro
|
||||
|
||||
XCharts supports TextMeshPro, but it is not enabled by default and needs to be switched on manually. It can be turned on and off in the following ways:
|
||||
|
||||

|
||||
|
||||
After opening, you need to set the global font used by TextMeshPro, or you can set it separately in the Theme:
|
||||
After turning it on, you need to set the global font to be used by TextMeshPro, and it can also be set individually in the Theme:
|
||||
|
||||

|
||||
|
||||
It is recommended to plan whether to use TextMeshPro at the beginning of the project and set the font. When switching TMP with many existing charts, some charts may not refresh automatically. You can manually click the `Rebuild Chart Object` button to rebuild the chart, which can be initialized normally.
|
||||
It is recommended to plan whether to use TextMeshPro at the beginning of the project and set the font accordingly. When switching to TMP in a project with many charts, some charts may not refresh automatically, and you can manually click the `Rebuild Chart Object` button to rebuild the chart, which will initialize normally.
|
||||
|
||||
When updating XCharts for TMP projects, you may encounter problems with missing TMP references and failing to compile. These problems can be solved in one of two ways:
|
||||
If you have enabled TMP in your project, you may encounter compilation failures due to lost TMP references when updating XCharts. This can be solved in the following two ways:
|
||||
|
||||
1. Find `XCharts.Runtime.asmdef` and `XCharts.Editor.asmdef` and manually add references to `TextMeshPro`
|
||||
2. Remove the `dUI_TextMeshPro` macro for Scripting Define Symbols in PlayerSetting
|
||||
1. Find `XCharts.Runtime.asmdef` and `XCharts.Editor.asmdef`, and manually add references to `TextMeshPro`.
|
||||
2. Remove the `dUI_TextMeshPro` macro from the `Scripting Define Symbols` in `PlayerSetting`.
|
||||
|
||||
Version `3.8.0` after adding daemon[XCharts - Daemon](https://github.com/XCharts-Team/XCharts-Daemon), will be XCharts-Daemon import project, When updating XCharts, the daemon automatically refreshes the asmdef based on the locally enabled TMP to ensure proper compilation.
|
||||
After the `3.8.0` version, the [XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon) daemon was added. After importing XCharts-Daemon into the project, the daemon will automatically refresh the asmdef based on the local situation of the enabled TMP when updating XCharts, ensuring normal compilation.
|
||||
|
||||
## Change chart parameters with code
|
||||
## XCharts Code Control
|
||||
|
||||
All parameters seen on Inspector can be modified with code, the key is to identify whether the parameters you want to change are on the component, on the Serie, or on the specific data item SerieData.
|
||||
All parameters seen in the `Inspector` can be modified with code. The key is to locate the parameter you want to change, whether it is on the component, the Serie, or the specific data item SerieData.
|
||||
|
||||
### Change the parameters on the main component
|
||||
In addition, unless customized, it is recommended to call the `public` interfaces provided under `Chart`, especially for data-related and list operations. These interfaces will do some associated processing internally, such as refreshing the chart. Common interfaces include:
|
||||
|
||||
You need to obtain the component first, and then modify the parameters in it:
|
||||
1. `chart.ClearData()`: Clear chart data (does not remove Series)
|
||||
2. `chart.RemoveData()`: Clear chart data (will remove all Series)
|
||||
3. `chart.AddSerie()`: Add Serie
|
||||
4. `chart.AddXAxisData()`: Add X-axis data
|
||||
5. `chart.AddData()`: Add Serie data
|
||||
6. `chart.UpdateData()`: Update Serie data
|
||||
7. `chart.UpdateXAxisData()`: Update X-axis data
|
||||
8. `chart.UpdateDataName()`: Update the name of Serie data
|
||||
|
||||
XCharts has an automatic refresh mechanism, but it is also triggered under certain conditions. If you have called the internal component interfaces and encountered components that have not been refreshed, and you cannot find the reason, you can use the following two interfaces to force a refresh:
|
||||
|
||||
1. `chart.RefreshAllComponent()`: Refresh chart components, which will re-initialize all components. It is not recommended to use it frequently.
|
||||
2. `chart.RefreshChart()`: Refresh chart rendering, which only refreshes the rendering part and will not refresh component text, position, etc.
|
||||
3. Each component can also refresh itself by calling `SetAllDirty()`.
|
||||
|
||||
:::tip
|
||||
|
||||
Use APIs to manipulate data and various lists, not directly access the list for processing.
|
||||
|
||||
:::
|
||||
|
||||
### Changing Parameters on Main Components
|
||||
|
||||
You need to obtain the component first, then modify its parameters:
|
||||
|
||||
```csharp
|
||||
var title = chart.EnsureChartComponent<Title>();
|
||||
@@ -225,11 +327,15 @@ xAxis.boundaryGap = true;
|
||||
xAxis.type = Axis.AxisType.Category;
|
||||
```
|
||||
|
||||
> Note: When the earlier version does not have the EnsureChartComponent() interface, GetOrAddChartComponent() is used.
|
||||
:::tip
|
||||
|
||||
### Change Serie parameters
|
||||
In older versions without the `EnsureChartComponent()` interface, use `GetOrAddChartComponent()`
|
||||
|
||||
For newly added Serie:
|
||||
:::
|
||||
|
||||
### Changing Serie Parameters
|
||||
|
||||
For newly added Series:
|
||||
|
||||
```csharp
|
||||
var serie = chart.AddSerie<Pie>();
|
||||
@@ -241,7 +347,7 @@ serie.animation.dataChangeEnable = true;
|
||||
serie.roundCap = true;
|
||||
```
|
||||
|
||||
For existing Serie:
|
||||
For existing Series:
|
||||
|
||||
```csharp
|
||||
var serie = chart.GetSerie<Pie>();
|
||||
@@ -253,7 +359,7 @@ serie.animation.dataChangeEnable = true;
|
||||
serie.roundCap = true;
|
||||
```
|
||||
|
||||
Add additional components to Serie:
|
||||
Adding additional components to Serie:
|
||||
|
||||
```csharp
|
||||
serie.EnsureComponent<AreaStyle>();
|
||||
@@ -262,14 +368,14 @@ var label = serie1.EnsureComponent<LabelStyle>();
|
||||
label.offset = new Vector3(0,20,0);
|
||||
```
|
||||
|
||||
### Change the parameter on the data item SerieData
|
||||
### Changing Parameters on Data Item SerieData
|
||||
|
||||
```csharp
|
||||
var serieData = chart.AddData(0, 20);
|
||||
//var serieData = serie.GetSerieData(0); //从已有数据中获取
|
||||
//var serieData = serie.GetSerieData(0); //To get from existing data
|
||||
serieData.radius = 10;
|
||||
|
||||
var itemStyle = serieData.EnsureComponent<ItemStyle>(); //给数据项添加ItemStyle组件
|
||||
var itemStyle = serieData.EnsureComponent<ItemStyle>(); //Add ItemStyle component to the data item
|
||||
itemStyle.color = Color.blue;
|
||||
|
||||
```
|
||||
```
|
||||
|
||||
10397
Documentation~/zh/api.md
@@ -6,6 +6,16 @@ slug: /changelog
|
||||
# 更新日志
|
||||
|
||||
[master](#master)
|
||||
[v3.15.0](#v3150)
|
||||
[v3.14.0](#v3140)
|
||||
[v3.13.0](#v3130)
|
||||
[v3.12.1](#v3121)
|
||||
[v3.12.0](#v3120)
|
||||
[v3.11.2](#v3112)
|
||||
[v3.11.1](#v3111)
|
||||
[v3.11.0](#v3110)
|
||||
[v3.10.2](#v3102)
|
||||
[v3.10.1](#v3101)
|
||||
[v3.10.0](#v3100)
|
||||
[v3.9.0](#v390)
|
||||
[v3.8.1](#v381)
|
||||
@@ -71,6 +81,227 @@ slug: /changelog
|
||||
|
||||
## master
|
||||
|
||||
## v3.15.0
|
||||
|
||||
版本要点:
|
||||
|
||||
* __时间轴与缩放能力增强__:新增 `DataZoom.minZoomRatio`(替代 `minShowNum`)、`Chart.useUtc`,并持续优化 `Axis Time` 在缩放与大年份场景下的表现。
|
||||
* __柱图与坐标轴配置更灵活__:新增 `Axis.mainAxis` 控制柱图朝向、`Serie.ignoreZeroOccupy` 控制 0 值柱是否占位、`AxisLine` 延长线配置等。
|
||||
* __图表样式与交互能力提升__:新增 `Pie.pieType`、`Legend.itemInactiveOpacity`、`Axis.onLabelClick`、`Animation.Exchange`、`LabelStyle.fixedX/fixedY` 等。
|
||||
* __扩展 UI 组件持续完善__:`UITable` 新增 `Title` 与 `Viewport` 配置,`UIStatistic.desc` 增强,`Comment.layer` 与坐标刷新体验优化。
|
||||
* __稳定性与兼容性修复集中推进__:修复 `SaveAsImage` 遮挡保存、`Pie` 点击失效、`TMP` 兼容、`Gantt` 时间区间与 2038 年问题、`MarkArea/GridCoord/Axis` 等多项关键问题。
|
||||
|
||||
日志详情:
|
||||
|
||||
* (2026.03.01) 发布`v3.15.0`版本
|
||||
* (2026.02.26) 增加`Serie`的`ignoreZeroOccupy`可设置0数据的Bar是否占位 (#286)
|
||||
* (2026.02.26) 修复`SaveAsImage`被其他组件遮挡时无法正常保存的问题 (#337)
|
||||
* (2026.02.26) 增加`Axis`的`mainAxis`参数设置主轴可控制柱图的朝向 (#331)
|
||||
* (2026.02.03) 修复`UITable`的`viewport`在不同的锚点下可能会绘制异常的问题
|
||||
* (2026.01.15) 修复`Pie`的点击有时候不响应的问题 (#357)
|
||||
* (2026.01.08) 增加`DataZoom`的`minZoomRatio`替换旧的`minShowNum` (#350)
|
||||
* (2025.11.05) 修复`Axis`的`indicatorLabel`无法隐藏的问题
|
||||
* (2025.11.03) 增加`Tooltip`的`Title`可通过`TitleLabelStyle`的`numericFormatter`格式化时间显示 (#353)
|
||||
* (2025.10.30) 增加`Chart`的`useUtc`参数设置显示时间是否用UTC时间
|
||||
* (2025.10.30) 优化`Candlestick`对时间轴的支持
|
||||
* (2025.10.30) 增加`Scatter`的`ignore`支持设置忽略数据
|
||||
* (2025.10.24) 优化`Sankey`的线条绘制排序
|
||||
* (2025.10.22) 增加`Pie`的`pieType`支持实心饼图和线框柄图 (#349)
|
||||
* (2025.09.05) 优化`MarkLine`的表现
|
||||
* (2025.09.01) 增加`AxisLine`的`startExtendLength`和`endExtendLength`设置轴线的延长线
|
||||
* (2025.08.27) 修复`Serie`的`TitleStyle`在数据变更时不及时刷新的问题
|
||||
* (2025.05.19) 修复`TMP`开启时`Axis`运行报错
|
||||
* (2025.04.25) 修复`MarkArea`指定`yValue`或`xValue`时绘制区域不准确的问题
|
||||
* (2025.04.17) 增加`UITable`的`Title`支持设置标题
|
||||
* (2025.04.17) 增加`UITable`的`Viewport`支持设置表格视口边距边框
|
||||
* (2025.04.15) 增加`Bar`支持通过`VisualMap`设置颜色
|
||||
* (2025.04.14) 增加`AxisLabel`的`showZeroLabel`设置是否显示0刻度
|
||||
* (2025.04.08) 增加`UIStatistic`的`desc`描述文本设置支持
|
||||
* (2025.04.07) 修复`Gantt`甘特图在有多维数据时计算的时间区间不准确的问题
|
||||
* (2025.04.07) 优化`Axis`的`Time`时间轴支持设置Custom和ceilRate
|
||||
* (2025.04.07) 修复`GridCoord`在设置背景色且Serie开启Clip时会覆盖图表的问题
|
||||
* (2025.04.07) 修复`Gantt`甘特图年份大于2038时显示异常的问题
|
||||
* (2025.04.07) 修复`Axis`的`Time`时间轴无法显示大于2038的年份的问题
|
||||
* (2025.04.06) 修复`Axis`的`Time`时间轴在有`DataZoom`缩放时文本显示异常的问题
|
||||
* (2025.03.28) 修复`Pie3D`的`avoidLabelOverlap`不生效的问题
|
||||
* (2025.03.27) 增加`Legend`的`itemInactiveOpacity`可设置非激活状态时的颜色透明度 (#343)
|
||||
* (2025.03.27) 增加`Axis`的`onLabelClick`回调事件
|
||||
* (2025.03.26) 增加`Animation`的`Exchange`排序交换动画
|
||||
* (2025.03.22) 增加`Comment`的`layer`设置层级
|
||||
* (2025.03.21) 优化`Comment`的坐标刷新
|
||||
* (2025.03.19) 增加`Serie`的`Label`的`formatter`支持`{index}`通配符
|
||||
* (2025.03.18) 增加`Bar`可添加`TitleStyle`组件支持
|
||||
* (2025.03.18) 增加`LabelStyle`的`fixedX`和`fixedY`可固定label的坐标
|
||||
* (2025.03.17) 增加`ItemStyle`的`backgroundGap`可设置数据项背景间隙
|
||||
|
||||
## v3.14.0
|
||||
|
||||
版本要点:
|
||||
|
||||
* 新增`Bar`的实时排序功能
|
||||
* 新增`Tooltip`的`itemFormatter`支持`\n`换行
|
||||
* 新增`AxisLabel`的格式化支持`{index}`
|
||||
* 新增`Animation`的`speed`可指定动画速度
|
||||
* 优化`Tooltip`的列对齐方式
|
||||
|
||||
日志详情:
|
||||
|
||||
* (2025.03.15) 发布`v3.14.0`版本
|
||||
* (2025.03.09) 修复`Bar`在同一个`Chart`不同`Grid`里时绘制有些异常的问题
|
||||
* (2025.03.07) 增加`Animation`的`speed`可指定动画速度
|
||||
* (2025.03.06) 优化`Animation`的新增动画表现
|
||||
* (2025.03.04) 修复`Treemap`的`label`显示异常的问题
|
||||
* (2025.03.02) 增加`Tooltip`的`columnGapWidths`参数设置列文本间隙距离
|
||||
* (2025.03.01) 优化`Comment`的组件刷新
|
||||
* (2025.02.23) 增加`Axis`的`Label`的`formatter`支持`{index}``{index-1}``{-index}``{-index-1}`通配符
|
||||
* (2025.02.23) 增加`Bar`的`realtimeSort`支持实时排序
|
||||
* (2025.02.19) 增加`Tooltip`的`itemFormatter`对`\n`换行的支持
|
||||
* (2025.02.18) 优化`Tooltip`的对齐方式
|
||||
* (2025.02.09) 修复`SaveAsImage`保存图片时不支持透明度的问题 (#337)
|
||||
* (2025.02.05) 增加`GraphChart`可单独设置`data`样式的支持
|
||||
* (2025.02.05) 重构`SerieSymbol`的`sizeFunction`参数
|
||||
* (2025.01.23) 修复`Treemap`的`Label`不显示的问题
|
||||
* (2025.01.15) 修复`Chart`在运行时动态添加`Component`异常的问题 (#339)
|
||||
* (2025.01.08) 修复`TextMeshPro`关闭时残留组件影响`Text`初始化的问题
|
||||
|
||||
## v3.13.0
|
||||
|
||||
版本要点:
|
||||
|
||||
* 新增`UIText`扩展组件
|
||||
* 新增`UIToggle`扩展组件
|
||||
* 新增`UISlider`扩展组件
|
||||
* 重构`UIProgress`扩展组件
|
||||
* 增加`SymbolStyle`的`borderWidth`和`emptyColor`配置
|
||||
* 增加`SymbolStyle`的`size2`参数支持长方形标记
|
||||
* 其他优化和问题修复
|
||||
|
||||
日志详情:
|
||||
|
||||
* (2025.01.01) 发布`v3.13.0`版本
|
||||
* (2024.12.27) 增加`SymbolStyle`的`size2`参数支持长方形标记
|
||||
* (2024.12.26) 优化`Text`在`TextMeshPro`下的居中对齐方式
|
||||
* (2024.12.25) 增加`Tooltip`的`itemFormatter`设置`{f0}`支持
|
||||
* (2024.12.25) 修复`YAxis`在范围变更刷新时部分label可能不显示的问题
|
||||
* (2024.12.23) 增加`SymbolStyle`的`borderWidth`和`emptyColor`配置
|
||||
* (2024.12.17) 增加`UISlider`扩展组件
|
||||
* (2024.12.10) 增加`UIToggle`扩展组件
|
||||
* (2024.12.09) 修复`UITable`的`scrollbar`无法拖动的问题
|
||||
* (2024.12.07) 修复`Chart`节点下不能放自定义节点的问题
|
||||
* (2024.12.05) 增加`UIText`扩展组件
|
||||
* (2024.12.04) 删除`TextStyle`的无用配置项`tmpAlignment`
|
||||
|
||||
## v3.12.1
|
||||
|
||||
版本要点:
|
||||
|
||||
* 完善官网文档的中英文支持
|
||||
* 优化折线图数据密集时的绘制效果
|
||||
* 其他问题修复
|
||||
|
||||
日志详情:
|
||||
|
||||
* (2024.12.01) 发布`v3.12.1`版本
|
||||
* (2024.11.30) 修复`Tooltip`在图表设置其他锚点时手机上显示位置异常的问题
|
||||
* (2024.11.27) 修复`Unity6`的一些代码警告问题
|
||||
* (2024.11.26) 修复`Tooltip`在特殊情况下可能会超出屏幕显示不完整的问题
|
||||
* (2024.11.24) 修复`UITable`在拖拽时也会点选的问题
|
||||
* (2024.11.22) 修复`Time`时间轴在开启`Animation`时动态变更效果异常的问题
|
||||
* (2024.11.18) 优化`Line`在数据点过密时有更好的绘制效果
|
||||
* (2024.11.16) 修复`Animation`无法通过代码开启的问题 (#334)
|
||||
* (2024.11.13) 修复`DataZoom`的start和end在代码动态修改时图表不刷新的问题
|
||||
* (2024.11.05) 修复`Title`设置隐藏后运行还显示的问题
|
||||
* (2024.11.01) 完善`website`中英文文档
|
||||
|
||||
## v3.12.0
|
||||
|
||||
版本要点:
|
||||
|
||||
* 增加`Ring`的`radiusGradient`参数设置渐变方向
|
||||
* 增加`numericFormatter`对`date`和`time`的支持
|
||||
* 完善`AreaStyle`的`origin`参数设置区域填充起始位置
|
||||
* 调整和完善文档
|
||||
* 其他优化和修复
|
||||
|
||||
日志详情:
|
||||
|
||||
* (2024.09.30) 发布`v3.12.0`版本
|
||||
* (2024.09.27) 完善`5分钟教程`
|
||||
* (2024.09.24) 完善`Legend`的`formatter`对多Serie的支持 (#332)
|
||||
* (2024.09.22) 调整`Documentation`文档显示样式
|
||||
* (2024.09.09) 增加`numericFormatter`对`date`和`time`的支持
|
||||
* (2024.09.03) 完善`AreaStyle`的`origin`参数设置区域填充起始位置
|
||||
* (2024.09.01) 增加`Ring`的`radiusGradient`参数设置渐变方向
|
||||
* (2024.09.01) 优化`Axis`为时间轴时首个Label的位置
|
||||
|
||||
## v3.11.2
|
||||
|
||||
* (2024.08.01) 发布`v3.11.2`版本
|
||||
* (2024.07.29) 修复`Tooltip`在微信小游戏平台上报错的兼容问题 (#326)
|
||||
* (2024.07.27) 调整`Axis`的`AxisName`的默认位置
|
||||
* (2024.07.22) 优化`Pie`的`Label`在`Tooltip`触发时的表现
|
||||
* (2024.07.21) 修复`Tooltip`在开启`DataZoom`时指示内容不准确的问题
|
||||
* (2024.07.17) 修复`MarkLine`的`Label`在初始化时可能会闪烁的问题
|
||||
* (2024.07.16) 优化`Axis`为`Time`时间轴时的`Tooltip`默认效果
|
||||
* (2024.07.15) 优化`Axis`为`Time`时间轴时的分割效果
|
||||
* (2024.07.14) 优化`Axis`为`Time`时间轴时的移动表现
|
||||
* (2024.07.12) 优化`Label`的初始化显示效果
|
||||
* (2024.07.06) 修复`Chart`在动态创建时背景没有自适应的问题 (#323)
|
||||
|
||||
## v3.11.1
|
||||
|
||||
* (2024.07.01) 发布`v3.11.1`版本
|
||||
* (2024.07.01) 修复`Serie`有多个时颜色异常的问题
|
||||
* (2024.06.23) 修复`Label`在初始化时会堆积的问题
|
||||
|
||||
## v3.11.0
|
||||
|
||||
版本要点:
|
||||
|
||||
* 增加`Line3DChart`3D折线图
|
||||
* 增加`GraphChart`关系图
|
||||
* 增加`3D`坐标系支持
|
||||
* 增加`Tooltip`的`triggerOn`设置触发条件
|
||||
* 其他问题修复和优化
|
||||
|
||||
日志详情:
|
||||
|
||||
* (2024.06.16) 发布`v3.11.0`版本
|
||||
* (2024.06.15) 增加`Editor`下`Data`的添加、删除、上下移动操作按钮
|
||||
* (2024.06.11) 修复`Axis`的`IndicatorLabel`可能会遮挡住`Tooltip`的问题
|
||||
* (2024.06.11) 修复`Tooltip`在`Cross`时`Axis`的`IndicatorLabel`可能不显示的问题 (#315)
|
||||
* (2024.06.10) 调整`Tooltip`的`Corss`重命名为`Cross`
|
||||
* (2024.06.09) 增加`Axis`的`minCategorySpacing`设置类目轴默认的最小类目间距
|
||||
* (2024.06.09) 修复`Tooltip`的`Cross`在`Axis`是类目轴并且开启`DataZoom`的情况下指示位置不准确的问题
|
||||
* (2024.06.06) 修复`Serie`在`Clone`时动画异常问题 (#320)
|
||||
* (2024.06.04) 修复`Serie`的`state`在代码动态设置时不刷新的问题
|
||||
* (2024.05.29) 调整`XCharts`在`Hierarchy`视图下的右键菜单到`UI/XCharts`下
|
||||
* (2024.05.29) 增加`3D`坐标系对类目轴的支持
|
||||
* (2024.05.19) 优化`Editor`下的编辑性能
|
||||
* (2024.05.09) 增加`JsonUtil`工具类
|
||||
* (2024.05.01) 修复`Tooltip`每帧产生GC的问题 (#311) (by @stefanbursuc)
|
||||
* (2024.04.23) 修复`ConvertXYAxis()`多次调用后图表异常的问题
|
||||
* (2024.04.22) 修复`DataZoom`控制多个轴时的`GridCoord`获取可能不正确的问题 (#317)
|
||||
* (2024.04.22) 增加`3D`坐标系
|
||||
* (2024.04.15) 优化`DateTimeUtil`时间戳转`DateTime`接口时区的问题
|
||||
* (2024.04.15) 优化`GridCoord`在开启`GridLayout`时也显示`Left` `Right` `Top` `Bottom`参数 (#316)
|
||||
* (2024.04.14) 修复`Tooltip`的`Cross`在开启`DataZoom`的情况下`label`位置不正确的问题 (#315)
|
||||
* (2024.04.12) 修复`Candlesticks`效果不对的问题 (#313)
|
||||
* (2024.03.20) 增加`Tooltip`的`triggerOn`设置触发条件
|
||||
* (2024.03.19) 修复`Pie`在设置`ItemStyle`的`opacity`时颜色不对的问题 (#309)
|
||||
|
||||
## v3.10.2
|
||||
|
||||
* (2024.03.11) 发布`v3.10.2`版本
|
||||
* (2024.03.11) 修复`Legend`的`formatter`在设置`{d}`通配符时显示可能不匹配的问题 (#304)
|
||||
* (2024.03.11) 修复`Tooltip`移出坐标系后还显示的问题
|
||||
* (2024.03.08) 修复`Tooltip`的`title`从旧版本升级后可能不显示的问题
|
||||
|
||||
## v3.10.1
|
||||
|
||||
* (2024.02.21) 发布`v3.10.1`版本
|
||||
* (2024.02.19) 修复`Tooltip`的圆点标记不会自适应颜色的问题
|
||||
|
||||
## v3.10.0
|
||||
|
||||
版本要点:
|
||||
@@ -94,12 +325,19 @@ slug: /changelog
|
||||
* (2024.01.23) 增加`{y}`通配符用于获取Y轴的类目名
|
||||
* (2024.01.23) 增加`Line`支持X轴和Y轴都为`Category`类目轴
|
||||
* (2024.01.18) 修复`Animation`的`type`代码动态修改无效的问题
|
||||
* (2024.01.16) 增加`UIImage`图片组件
|
||||
* (2024.01.16) 优化`Background`组件,可设置圆角和边框
|
||||
* (2024.01.13) 增加`Chart`的更多快捷创建图表菜单
|
||||
* (2024.01.09) 增加`Background`的`borderStyle`,给图表默认设置圆角
|
||||
* (2024.01.07) 修复`Tooltop`的第一个`ContentLabelStyle`设置`color`无效的问题
|
||||
* (2024.01.03) 增加`UITable`的`carouselStyle`的`hoverPause`
|
||||
* (2024.01.02) 增加`UITable`的`scrollStyle`的`borderStyle`
|
||||
* (2024.01.02) 增加`UITable`的`columnHeadStyle`的`opaque`
|
||||
* (2024.01.01) 调整`UITable`的`border`边框相关设置,用`BorderStyle`代替
|
||||
* (2024.01.01) 增加`BorderStyle`边框样式
|
||||
* (2023.12.26) 增加`Heatmap`的`maxCache`参数支持
|
||||
* (2023.12.25) 优化`Line`开启`clip`时绘制的顶点数
|
||||
* (2023.12.22) 增加`UITable`的行边框
|
||||
* (2023.12.22) 修复`Scatter`散点图部分边界数据不显示的问题
|
||||
* (2023.12.21) 修复`TriggerTooltip()`接口在指定0或最大index时可能无法触发的问题
|
||||
* (2023.12.19) 修复`Legend`的`LabelStyle`设置`formatter`后不生效的问题
|
||||
@@ -138,15 +376,27 @@ slug: /changelog
|
||||
* (2023.11.23) 增加`Axis`的`Animation`支持动画效果
|
||||
* (2023.11.16) 取消`Legend`的`formatter`,用`LabelStyle`的代替
|
||||
* (2023.11.14) 完善`LabelStyle`的`formatter`的注释和文档(#291)
|
||||
* (2023.11.14) 增加`UITable`的`GetData()`和`GetContent()`接口
|
||||
* (2023.11.12) 增加`UITable`的`onTableClick`点击表格回调
|
||||
* (2023.11.11) 重构`UITable`的`SeparatorStyle`,可分开设置行列的分割线
|
||||
* (2023.11.11) 修复`Documentation`部分注释生成文档不完整的问题 (#290)
|
||||
* (2023.11.11) 修复`Legend`的`formatter`在数据变更时没有自动刷新的问题
|
||||
* (2023.11.05) 增加`UITable`的`ColumnStyle`,重构Column相关参数
|
||||
* (2023.11.05) 增加`UITable`的`RowStyle`,重构Row相关参数
|
||||
* (2023.11.05) 修复`SerieEventData`的`value`一直是0的问题 (#287)
|
||||
* (2023.11.03) 修复`Bar`设置渐变色时鼠标移出效果异常的问题 (#285)
|
||||
* (2023.11.02) 优化`SerieData`设置`ignore`时`formatter`的忽略问题
|
||||
* (2023.11.01) 增加`UITable`的`CarouselStyle`轮播功能
|
||||
* (2023.11.01) 增加`UITable`的`AddColumn()`和`UpdateColumn()`接口
|
||||
* (2023.11.01) 增加`MarkLine`的`onTop`设置是否显示在最上层
|
||||
* (2023.10.23) 修复`UITable`点击`Rebuild Object`异常的问题
|
||||
* (2023.10.23) 修复`UITable`尺寸变化时不刷新的问题
|
||||
* (2023.10.21) 修复`Pie`有0数据时`Label`的位置异常的问题
|
||||
* (2023.10.21) 增加`Axis`的对数轴支持子刻度
|
||||
* (2023.10.19) 修复`Pie`设置玫瑰图时引导线异常的问题
|
||||
* (2023.10.17) 修复`UITable`首次初始化异常的问题
|
||||
* (2023.10.17) 增加`UITable`的数据操作接口
|
||||
* (2023.10.17) 增加`UITable`的`RefreshTable()`刷新接口
|
||||
* (2023.10.15) 修复`Line`设置`Animation`为`AlongPath`时动画异常的问题 (#281)
|
||||
* (2023.10.12) 修复`MarkLine`指定`yValue`时对数值轴无效的问题
|
||||
* (2023.10.11) 修复`Serie`的`showDataDimension`设置无效的问题
|
||||
@@ -191,7 +441,7 @@ slug: /changelog
|
||||
* (2023.08.22) 修复`Bar`显示隐藏时绘制表现异常的问题
|
||||
* (2023.08.22) 优化`Zebra`斑马柱图的绘制表现 (#276)
|
||||
* (2023.08.16) 增加`Daemon`守护程序,解决本地开启TMP后更新版本报错问题
|
||||
* (2023.08.15) 修复`Data`数据在-1到1之间时坐标轴显示错误的问题 (#273) (by **Ambitroc**)
|
||||
* (2023.08.15) 修复`Data`数据在-1到1之间时坐标轴显示错误的问题 (#273) (by @Ambitroc)
|
||||
* (2023.08.14) 修复`XCharts`本地开启`TextMeshPro`和 `NewInputSystem`后更新版本会报错的问题 (#272)
|
||||
* (2023.08.12) 修复`Chart`在运行时被删除时会异常报错的问题 (#269)
|
||||
* (2023.08.11) 修复`DataZoom`开启时可能会导致无法添加数据的问题
|
||||
@@ -232,7 +482,7 @@ slug: /changelog
|
||||
|
||||
* (2023.06.08) 发布`v3.7.0`版本
|
||||
* (2023.06.04) 增加`HelpDoc`帮助文档跳转
|
||||
* (2023.05.30) 修复`Serie`的名字带`_`线导致`Legend`无法触发的问题 (#259) (by **svr2kos2**)
|
||||
* (2023.05.30) 修复`Serie`的名字带`_`线导致`Legend`无法触发的问题 (#259) (by @svr2kos2)
|
||||
* (2023.05.10) 增加`Axis`的`MinMaxAuto`范围类型
|
||||
* (2023.05.10) 增加`Line`对`Clip`的支持
|
||||
* (2023.05.04) 优化`Axis`在-1到1范围时设置`CeilRate`不生效的问题
|
||||
@@ -251,9 +501,9 @@ slug: /changelog
|
||||
|
||||
版本要点:
|
||||
|
||||
* 增加`InputSystem`支持 (by **Bian-Sh**)
|
||||
* 增加官网[在线示例](https://xcharts-team.github.io/examples/)多版本支持 (by **SHL-COOL**)
|
||||
* 完善对`VR`的支持 (by **Ambitroc**)
|
||||
* 增加`InputSystem`支持 (by @Bian-Sh)
|
||||
* 增加官网[在线示例](https://xcharts-team.github.io/examples/)多版本支持 (by @SHL-COOL)
|
||||
* 完善对`VR`的支持 (by @Ambitroc)
|
||||
* 增加`UITable`,`UIStatistic`等[扩展UI组件](https://xcharts-team.github.io/docs/ui)
|
||||
* 增加`ItemStyle`的`MarkColor`
|
||||
* 增加通配符`{h}`的支持
|
||||
@@ -269,9 +519,9 @@ slug: /changelog
|
||||
|
||||
* (2023.04.01) 发布`v3.6.0`版本
|
||||
* (2023.03.14) 修复`Tooltip`的`titleFormater`设置`{b}`可能不生效的问题
|
||||
* (2023.03.14) 修复`BarChart`在数据为0时不绘制柱条背景的问题 (#250) (by **Ambitroc**)
|
||||
* (2023.03.14) 修复`BarChart`在数据为0时不绘制柱条背景的问题 (#250) (by @Ambitroc)
|
||||
* (2023.03.12) 增加`LabelStyle`的`autoRotate`可设置有角度的竖版文本的自动旋转
|
||||
* (2023.03.10) 增加`VR`等其他非鼠标输入方式的Point位置获取 (#248) (by **Ambitroc**)
|
||||
* (2023.03.10) 增加`VR`等其他非鼠标输入方式的Point位置获取 (#248) (by @Ambitroc)
|
||||
* (2023.03.09) 增加`Chart`的`onSerieClick`,`onSerieDown`,`onSerieEnter`和`onSerieExit`回调
|
||||
* (2023.03.09) 修复`Pie`的点击选中偏移不生效的问题
|
||||
* (2023.03.04) 增加`Legend`的`Positions`可自定义图例的位置
|
||||
@@ -285,7 +535,7 @@ slug: /changelog
|
||||
* (2023.02.02) 修复`DataZoom`开启时`X轴`的`Label`可能会显示在图表外的问题
|
||||
* (2023.02.02) 优化`SerieData`的`ignore`设置时的忽略数据判断
|
||||
* (2023.02.01) 修复`XChartsMgr.ContainsChart()`接口异常
|
||||
* (2023.01.31) 增加`InputSystem`的支持 (#242) (by **Bian-Sh**)
|
||||
* (2023.01.31) 增加`InputSystem`的支持 (#242) (by @Bian-Sh)
|
||||
* (2023.01.11) 修复`Inspector`上移除`Component`后图表没有及时刷新的问题 (#241)
|
||||
* (2023.01.06) 修复`Pie`在最后的几个数据都为0时`Label`显示不正常的问题 (#240)
|
||||
* (2023.01.03) 删除`Serie`的`MarkColor`,增加`ItemStyle`的`MarkColor`
|
||||
|
||||
@@ -5,183 +5,147 @@ slug: /faq
|
||||
|
||||
# 常见问题
|
||||
|
||||
[FAQ 1:如何调整坐标轴与背景的边距?](#如何调整坐标轴与背景的边距)
|
||||
[FAQ 2:如何让初始动画重新播放?](#如何让初始动画重新播放)
|
||||
[FAQ 3:如何自定义折线图饼图的颜色?](#如何自定义折线图饼图的颜色)
|
||||
[FAQ 4:如何给坐标轴上的文本加上单位?](#如何给坐标轴上的文本加上单位)
|
||||
[FAQ 5:如何让柱形图的柱子堆叠显示?](#如何让柱形图的柱子堆叠显示)
|
||||
[FAQ 6:如何让柱形图的柱子同柱但不重叠?](#如何让柱形图的柱子同柱但不重叠)
|
||||
[FAQ 7:如何调整柱形图的柱子宽度和间距?](#如何调整柱形图的柱子宽度和间距)
|
||||
[FAQ 8:如何调整柱形图单个柱子的颜色?](#如何调整柱形图单个柱子的颜色)
|
||||
[FAQ 9:如何调整图表的对齐方式?](#如何调整图表的对齐方式)
|
||||
[FAQ 10:可以显示超过1000以上的大数据吗?](#可以显示超过1000以上的大数据吗)
|
||||
[FAQ 11:折线图可以画虚线、点线、点划线吗?](#折线图可以画虚线点线点划线吗)
|
||||
[FAQ 12:如何限定Y轴的值范围?](#如何限定y轴的值范围)
|
||||
[FAQ 13:如何自定义数值轴刻度大小?](#如何自定义数值轴刻度大小)
|
||||
[FAQ 14:如何在数据项顶上显示文本?](#如何在数据项顶上显示文本)
|
||||
[FAQ 15:如何给数据项自定义图标?](#如何给数据项自定义图标)
|
||||
[FAQ 16:锯齿太严重,如何让图表更顺滑?](#锯齿太严重如何让图表更顺滑)
|
||||
[FAQ 17:为什么鼠标移上图表Tooltip不显示?](#为什么鼠标移上图表tooltip不显示)
|
||||
[FAQ 18:如何取消Tooltip的竖线?](#如何取消tooltip的竖线)
|
||||
[FAQ 19:如何自定义Tooltip的显示内容?](#如何自定义tooltip的显示内容)
|
||||
[FAQ 20:如何让y轴显示多位小数?](#如何让y轴显示多位小数)
|
||||
[FAQ 21:如何用代码动态更新数据?](#如何用代码动态更新数据)
|
||||
[FAQ 22:如何显示图例?为什么有时候图例无法显示?](#如何显示图例为什么有时候图例无法显示)
|
||||
[FAQ 23:如何做成预设?](#如何做成预设)
|
||||
[FAQ 24:如何在图表上画点画线等自定义内容?](#如何在图表上画点画线等自定义内容)
|
||||
[FAQ 25:如何实现心电图类似的数据移动效果?](#如何实现心电图类似的数据移动效果)
|
||||
[FAQ 26:如何使用背景组件?有什么条件限制?](#如何使用背景组件有什么条件限制)
|
||||
[FAQ 27:Mesh can not have more than 65000 vertices?](#mesh_cannot_have_more_than_65000_vertices)
|
||||
[FAQ 28:为什么serie里设置的参数运行后又被重置了?](#为什么serie里设置的参数运行后又被重置了)
|
||||
[FAQ 29:如何修改serie的symbol的颜色?](#如何修改serie的symbol的颜色)
|
||||
[FAQ 30:导入或更新XCharts时TMP报错如何处理?](#导入或更新xcharts时tmp报错怎么办)
|
||||
[FAQ 31:支持空数据吗?如何实现折线图断开的效果?](#支持空数据吗如何实现折线图断开的效果)
|
||||
[FAQ 32:2.x版本升级3.x版本时常见的问题有哪些?](#xcharts2升级xcharts3时常见的问题有哪些)
|
||||
[FAQ 33:折线图如何两边不留空白而从0坐标开始显示?](#折线图如何两边不留空白而从0坐标开始显示)
|
||||
[FAQ 34:如何设置部分Serie不显示Tooltip?](#如何设置部分serie不显示tooltip)
|
||||
|
||||
## 如何调整坐标轴与背景的边距
|
||||
## FAQ 1:如何调整坐标轴与背景的边距?
|
||||
|
||||
调整`Grid`组件,可调整上下左右边距。
|
||||
|
||||
## 如何让初始动画重新播放
|
||||
## FAQ 2:如何让初始动画重新播放?
|
||||
|
||||
调用`chart.AnimationReset()`接口。
|
||||
|
||||
## 如何自定义折线图饼图的颜色
|
||||
## FAQ 3:如何自定义折线图饼图的颜色?
|
||||
|
||||
通过`Theme`的`colorPalette`调整,或者部分`Serie`下的`LineStyle`和`ItemStyle`。
|
||||
|
||||
## 如何给坐标轴上的文本加上单位
|
||||
## FAQ 4:如何给坐标轴上的文本加上单位?
|
||||
|
||||
通过`formatter`和`numericFormatter`参数,在`Legend`、`Axis`的`AxisLabel`、`Tooltop`、`Serie`的`Label`都提供该参数的配置。
|
||||
|
||||
## 如何让柱形图的柱子堆叠显示
|
||||
## FAQ 5:如何让柱形图的柱子堆叠显示?
|
||||
|
||||
设置`Serie`下的`stack`,`stack`相同的`serie`会堆叠显示在一个柱子上。
|
||||
|
||||
## 如何让柱形图的柱子同柱但不重叠
|
||||
## FAQ 6:如何让柱形图的柱子同柱但不重叠?
|
||||
|
||||
设置`Serie`下的`barGap`为`-1`,`stack`为空。
|
||||
|
||||
## 如何调整柱形图的柱子宽度和间距
|
||||
## FAQ 7:如何调整柱形图的柱子宽度和间距?
|
||||
|
||||
调整`Serie`下的`barWidth`和`barGap`,多个`serie`时最后一个`serie`的`barWidth`和`barGap`有效。
|
||||
|
||||
## 如何调整柱形图单个柱子的颜色
|
||||
## FAQ 8:如何调整柱形图单个柱子的颜色?
|
||||
|
||||
可通过调整单个`Data`下的`ItemStyle`调整,也可以通过两个`serie`同柱不堆叠来实现,通过设置数据项为`0`来达到类似效果。
|
||||
|
||||
## 如何调整图表的对齐方式
|
||||
## FAQ 9:如何调整图表的对齐方式?
|
||||
|
||||
调整RectTransform的锚点,和UGUI的其他组件的用法一致。
|
||||
|
||||
## 可以显示超过1000以上的大数据吗
|
||||
## FAQ 10:可以显示超过1000以上的大数据吗?
|
||||
|
||||
可以。但`UGUI`对单个`Graphic`限制`65000`个顶点,所以太多的数据不一定能显示完全。可通过设置采样距离`sampleDist`开启采样简化过密曲线。也可以通过设置一些参数来减少图表的顶点数有助于显示更多数据。如缩小图表的尺寸,关闭或减少坐标轴的客户端绘制,关闭`Serie`的`symbol`和`label`显示等。折线图的普通线图`Normal`比平滑线图`Smooth`占用顶点数更少。`1.5.0`以上版本可以设置`large`和`largeThreshold`参数来开启性能模式。
|
||||
|
||||
## 折线图可以画虚线点线点划线吗
|
||||
## FAQ 11:折线图可以画虚线、点线、点划线吗?
|
||||
|
||||
可以。通过`Serie`下的`lineType`选择线条样式。当要显示的数据过多(成千以上)数据间过密时建议使用`Normal`或者`Step`样式。
|
||||
|
||||
## 如何限定y轴的值范围
|
||||
## FAQ 12:如何限定Y轴的值范围?
|
||||
|
||||
设置`Axis`下的`minMaxType`为`Custom`,自定义`min`和`max`。
|
||||
|
||||
## 如何自定义数值轴刻度大小
|
||||
## FAQ 13:如何自定义数值轴刻度大小?
|
||||
|
||||
默认时通过`Axis`下的`splitNumer`进行自动划分。也可以设置`interval`自定义刻度大小。
|
||||
|
||||
## 如何在数据项顶上显示文本
|
||||
## FAQ 14:如何在数据项顶上显示文本?
|
||||
|
||||
通过设置`Serie`下的`Label`。3.0版本需要先添加`LabelStyle`组件。
|
||||
|
||||
## 如何给数据项自定义图标
|
||||
## FAQ 15:如何给数据项自定义图标?
|
||||
|
||||
通过设置`Serie`的`data`下的数据项可单独设置`icon`相关参数。
|
||||
|
||||
## 锯齿太严重如何让图表更顺滑
|
||||
## FAQ 16:锯齿太严重,如何让图表更顺滑?
|
||||
|
||||
开启抗锯齿设置(在`Unity`里设置)。调整UI渲染模式为`Camera`模式,开启`MSAA`,设置`4`倍或更高抗锯齿。
|
||||
|
||||
## 为什么鼠标移上图表tooltip不显示
|
||||
## FAQ 17:为什么鼠标移上图表Tooltip不显示?
|
||||
|
||||
确认`Tooltip`是否开启;确认父节点是否关闭了鼠标事件。
|
||||
|
||||
## 如何取消tooltip的竖线
|
||||
## FAQ 18:如何取消Tooltip的竖线?
|
||||
|
||||
设置`Tooltip`的`type`为`None`。或者调整`lineStyle`的参数。
|
||||
|
||||
## 如何自定义tooltip的显示内容
|
||||
## FAQ 19:如何自定义Tooltip的显示内容?
|
||||
|
||||
自定义总的内容可以通过`Tooltip`的`formatter`。如果只是想调整所有的`serie`的显示格式可以用`itemFormatter`和`titleFormatter`结合。如果想每个`serie`的显示格式不一样,可以定制`serie`的`itemStyle`里的`tooltipFormatter`。具体的用法请查阅[XCharts配置项手册](https://xcharts-team.github.io/docs/configuration#Tooltip-itemFormatter)。
|
||||
|
||||
## 如何让y轴显示多位小数
|
||||
## FAQ 20:如何让y轴显示多位小数?
|
||||
|
||||
设置`Axis`下的`AxisLabel`中的`formatter`为`{value:f1}`或`{value:f2}`。`1.5.0`及以上版本通过`numericFormatter`设置。
|
||||
|
||||
## 如何用代码动态更新数据
|
||||
## FAQ 21:如何用代码动态更新数据?
|
||||
|
||||
请查阅`Example`下的代码,`Example13_LineSimple.cs`就是一个简单添加数据构建折线图的例子,其他`Demo`也都是通过代码控制不同的组件实现不同的功能,相关API请查看文档:[XChartsAPI接口](api.md) 。
|
||||
|
||||
## 如何显示图例为什么有时候图例无法显示
|
||||
## FAQ 22:如何显示图例?为什么有时候图例无法显示?
|
||||
|
||||
首先,你的`serie`里的`name`需有值不为空。然后开启`Legend`显示,里面的`data`可以默认为空,表示显示所有的图例。如果你只想显示部分`serie`的图例,在`data`中填入要显示的图例的`name`即可。如果`data`中的值都不是系列的`name`,那图例就不会显示。
|
||||
|
||||
## 如何做成预设
|
||||
## FAQ 23:如何做成预设?
|
||||
|
||||
做成prefab前,执行一下`Rebuild Chart Object`重新刷新节点,避免有冗余的节点存在。
|
||||
|
||||
## 如何在图表上画点画线等自定义内容
|
||||
## FAQ 24:如何在图表上画点画线等自定义内容?
|
||||
|
||||
`XCharts`有自定义绘制回调`onCustomDraw`,具体可参考`Example12_CustomDrawing.cs`
|
||||
|
||||
## 如何实现心电图类似的数据移动效果
|
||||
## FAQ 25:如何实现心电图类似的数据移动效果?
|
||||
|
||||
参考`Example`目录下的`Example_Dynamic.cs`。主要通过设置`maxCache`参数实现。`axis`和`serie`都设置相同的`maxCache`。`maxCache`可固定数据个数,当数据超过设定时会先删除第一个在添加新数据,实现数据移动效果。
|
||||
|
||||
## 如何使用背景组件有什么条件限制
|
||||
## FAQ 26:如何使用背景组件?有什么条件限制?
|
||||
|
||||
设置`background`组件的`show`为`true`。
|
||||
|
||||
## 区域折线图在用半透明颜色时有时候会一条叠加的线
|
||||
|
||||
这是区域折线图绘制的bug。可以用浅的不透的颜色替代半透明颜色。
|
||||
|
||||
## mesh_cannot_have_more_than_65000_vertices
|
||||
## FAQ 27:Mesh can not have more than 65000 vertices?
|
||||
|
||||
这是`UGUI`对单个`Graphic`的顶点数限制。`XCharts`是将图形绘制在单个`Graphic`上,所以也会有这个限制。解决的办法可以参考:[FAQ 10:可以显示超过1000以上的大数据吗?](#可以显示超过1000以上的大数据吗)
|
||||
|
||||
## 为什么serie里设置的参数运行后又被重置了
|
||||
## FAQ 28:为什么serie里设置的参数运行后又被重置了?
|
||||
|
||||
检测下代码里是否调用了`RemoveData()`并重新添加`Serie`了。如果想保留`Serie`的配置可以只`ClearData()`,然后重新添加数据。
|
||||
|
||||
## 如何修改serie的symbol的颜色
|
||||
## FAQ 29:如何修改serie的symbol的颜色?
|
||||
|
||||
`Symbol` 的颜色是使用的 `ItemStyle` 的 `color`。
|
||||
|
||||
## 导入或更新xcharts时tmp报错怎么办
|
||||
## FAQ 30:导入或更新XCharts时TMP报错如何处理?
|
||||
|
||||
XCharts默认时不开启TMP,所以asmdef上没有TMP的引用。当本地开启TMP后再更新XCharts可能会出现这个问题。可通过以下两种方式解决:
|
||||
XCharts默认时不开启TMP,所以asmdef上没有TMP的引用。当本地开启TMP后再更新XCharts可能会出现这个问题。可通过以下两种方式的任意一种解决:
|
||||
|
||||
1. 找到`XCharts.Runtime.asmdef`和`XCharts.Editor.asmdef`,手动加上 `TextMeshPro`的引用
|
||||
2. 移除`PlayerSetting`中`Scripting Define Symbols`的`dUI_TextMeshPro`宏
|
||||
|
||||
`3.8.0`版本后增加[XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon)守护程序,将XCharts-Daemon导入项目后,在更新XCharts时守护程序会自动根据本地开启的TMP情况刷新asmdef,确保编译正常。
|
||||
|
||||
## 支持空数据吗如何实现折线图断开的效果
|
||||
## FAQ 31:支持空数据吗?如何实现折线图断开的效果?
|
||||
|
||||
`Serie`的`data`是`double`类型,所以无法表示空数据。可通过开启`Serie`的`ignore`和指定`ignoreValue`来达到空数据的效果。也可以每个`SerieData`设置`ignore`参数。忽略数据后断开还是连接可设置`ignoreLineBreak`参数。
|
||||
|
||||
## xcharts2升级xcharts3时常见的问题有哪些
|
||||
## FAQ 32:2.x版本升级3.x版本时常见的问题有哪些?
|
||||
|
||||
1. 'XCharts.Runtime.XChartsMgr' is missing the class attribute 'ExtensionOfNativeClass'!
|
||||
3.x版本时不需要挂载XChartsMgr,直接删掉场景上的`_xcharts_`节点即可。
|
||||
1. 出现:`'XCharts.Runtime.XChartsMgr' is missing the class attribute 'ExtensionOfNativeClass'!`的问题时,是因为3.x版本时不需要挂载XChartsMgr,直接删掉场景上的`_xcharts_`节点即可。
|
||||
|
||||
## 折线图如何两边不留空白而从0坐标开始显示
|
||||
## FAQ 33:折线图如何两边不留空白而从0坐标开始显示?
|
||||
|
||||
设置X轴的`boundaryGap`参数。
|
||||
|
||||
## 如何设置部分serie不显示tooltip
|
||||
## FAQ 34:如何设置部分Serie不显示Tooltip?
|
||||
|
||||
`serie`的`itemStyle`的`itemFormatter`设置为`-`可以忽略`tooltip`。
|
||||
`serie`的`itemStyle`的`itemFormatter`设置为`-`可以忽略该`serie`的`tooltip`。
|
||||
|
||||
## FAQ 35:区域折线图在用半透明颜色时有时候会一条叠加的线
|
||||
|
||||
这是区域折线图绘制的bug。可以用浅的不透的颜色替代半透明颜色。
|
||||
|
||||
|
Before Width: | Height: | Size: 293 KiB After Width: | Height: | Size: 704 KiB |
|
Before Width: | Height: | Size: 225 KiB After Width: | Height: | Size: 660 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 86 KiB |
BIN
Documentation~/zh/img/tutorial01_axisdata.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
Documentation~/zh/img/tutorial01_seriedata.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
@@ -6,94 +6,87 @@ slug: /support
|
||||
|
||||
# 订阅服务
|
||||
|
||||
如需技术支持和购买扩展图表,可订阅`VIP`服务。详情可查看以下内容,也可以加QQ`3525422251(XCharts技术支持)`或发邮件到`monitor1394@gmail.com`进行咨询。
|
||||
如需技术支持和扩展图表购买,可通过订阅 VIP 服务获取专属权益。企业商务合作请联系 QQ `3525422251` 或邮件至 `monitor1394@gmail.com`。
|
||||
|
||||
企业商务合作可QQ和邮件咨询。
|
||||
## 订阅计划
|
||||
|
||||
## 订阅VIP服务
|
||||
### 订阅类型
|
||||
|
||||
订阅服务分`个人订阅`和`企业订阅`:
|
||||
- **个人订阅**
|
||||
- 归属个人,不可转让,服务仅限订阅者本人使用。
|
||||
- **企业订阅**
|
||||
- 归属企业,席位可分配给指定员工,支持席位变更(如员工离职后重新分配)。
|
||||
- 通过企业专属群组提供技术支持。
|
||||
|
||||
- __个人订阅__:`个人VIP`属于个人,不可转让,`XCharts`团队只服务于订阅当事人。
|
||||
- __企业订阅__:`企业VIP`属于企业,席位内可安排固定职员,职员离职后席位可重新安排,`XCharts`团队通过专属企业群为企业服务。
|
||||
### 订阅优势
|
||||
|
||||
订阅服务有哪些优势?
|
||||
- **高效支持**:快速定位技术问题,节省开发时间。
|
||||
- **深度交流**:与 XCharts 核心团队及开发者社区直接互动,获取行业经验。
|
||||
- **扩展功能**:解锁高级图表和 UI 组件,持续获得更新支持。
|
||||
- **社区共建**:加入 GitHub 组织,访问私有仓库,参与项目生态建设。
|
||||
- **专属标识**:在交流群中享有 VIP 身份标识,优先响应需求。
|
||||
|
||||
- __提高工作效率,节省时间成本__。`XCharts`功能强大,配置项众多,`VIP`服务可快速帮您定位,节省查找和核对的时间;`VIP`的即时回答服务可快速为您答疑解惑,快速上手,提高工作效率。
|
||||
- __更多技术交流,更多经验交流__。`XCharts`团队成员从业多年,有丰富的技术和工作经验。`VIP`服务不仅可以交流`XCharts`相关的内容,也可以咨询其他方面内容。`VIP`群也有更多的交流碰撞。
|
||||
- __订阅扩展图表,获得更新支持__。扩展图表需要订阅`VIP`服务后才能购买,扩展图表超过1年后的更新支持也需要持续订阅`VIP`服务。
|
||||
- __加入团队组织,参与社区建设__。订阅`VIP`后可加入`GitHub`组织,参与社区建设,访问专有仓库,扩展图表仓库等其他私有仓库。
|
||||
- __专属高级功能,专属身份标识__。订阅`VIP`后可以享有扩展UI组件,扩展图表等其他高级功能,XCharts后续也会陆续推出更多高级功能。在`XCharts交流群`里拥有`专属头衔`,方便快速识别,优先响应,第一时间回复VIP用户的各种问题。
|
||||
## 服务详情
|
||||
|
||||
| |免费用户|付费咨询|个人`VIP` | 个人`SVIP` | 企业`VIP` | 企业`SVIP` |
|
||||
| ----- |--|--|--|--|--|--|
|
||||
| 订阅费用 | -- | `98`¥ | `298`¥ | 首年`1298`¥<br/>后续`298¥`* | 首年`1698`¥<br/>后续`298¥`* | `联系我们` |
|
||||
| 订阅时长 | -- | `7`天* | `1`年 | `1`年 | `1`年 | `1`年 |
|
||||
| 拥有席位 | -- | `1`个席位 | `1`个席位 |`1`个席位|`1`个席位|`5`个以上席位|
|
||||
| 增加席位 | -- | -- | -- | -- |支持|支持|
|
||||
| __`服务方式:`__|
|
||||
| 官方QQ群交流 | √ | √ | √ | √ | √ | √ |
|
||||
| QQ一对一交流 | | √ | √ | √ | √ | √ |
|
||||
| 专属VIP群交流 | | | √ | √ | √ | √ |
|
||||
| 微信交流 | | | | | √ | √(企业专属群) |
|
||||
| 电话交流 | | | | | | √ |
|
||||
| __`服务内容:`__|
|
||||
| 可商用可二次开发 | √ | √ | √ | √ | √ | √ |
|
||||
| 有问即答 | | √ | √ | √ | √ | √ |
|
||||
| 新手入门指导 | | √ | √ | √ | √ | √ |
|
||||
| 开发优化指导 | | √ | √ | √ | √ | √ |
|
||||
| 其他技术支持 | | | √ | √ | √ | √ |
|
||||
| 问题及时处理 | | | √ | √ | √ | √ |
|
||||
| 需求优先考虑 | | | √ | √ | √ | √ |
|
||||
| 可另付费定制 | | | √ | √ | √ | √ |
|
||||
| 可另付费加急 | | | √ | √ | √ | √ |
|
||||
| 扩展UI组件 | | | √ | √ | √ | √ |
|
||||
| 首页赞助展示 | | | | | | √ |
|
||||
| 付费方式 | | | 二维码 | 二维码 | __公对公转账__* | __公对公转账__* |
|
||||
| 支持开发票 | | | 普票 | 普票 | __可开专票__ | __可开专票__ |
|
||||
| 扩展图表购买 | | | 按需购买 | __全部免费__* | __全部免费__* | __全部免费__* |
|
||||
| 扩展图表源码 | | | 永久持有 | 永久持有 | 永久持有 | 永久持有 |
|
||||
| 扩展图表更新 | | | 1年更新支持 | 1年更新支持 | 1年更新支持 | 1年更新支持 |
|
||||
| Github仓库 | XCharts<br/>[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo) | XCharts<br/>[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo) | XCharts<br/>[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo)<br/>[XCharts-UI](https://github.com/XCharts-Team/XCharts-UI) | XCharts<br/>[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo)<br/>[XCharts-UI](https://github.com/XCharts-Team/XCharts-UI)<br/>[XCharts-Pro](https://github.com/XCharts-Team/XCharts-Pro)<br/>[XCharts-Pro-Demo](https://github.com/XCharts-Team/XCharts-Pro-Demo) | XCharts<br/>[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo)<br/>[XCharts-UI](https://github.com/XCharts-Team/XCharts-UI)<br/>[XCharts-Pro](https://github.com/XCharts-Team/XCharts-Pro)<br/>[XCharts-Pro-Demo](https://github.com/XCharts-Team/XCharts-Pro-Demo) | XCharts<br/>[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo)<br/>[XCharts-UI](https://github.com/XCharts-Team/XCharts-UI)<br/>[XCharts-Pro](https://github.com/XCharts-Team/XCharts-Pro)<br/>[XCharts-Pro-Demo](https://github.com/XCharts-Team/XCharts-Pro-Demo) |
|
||||
| 权益/服务 | 免费用户 | 个人 VIP | 个人 SVIP | 企业 VIP | 企业 SVIP |
|
||||
|-------------------|----------|----------|-----------------|-----------------|----------------|
|
||||
| **订阅费用** | — | 298¥/年 | 首年 1298¥<br/>续费 298¥/年 | 首年 1698¥<br/>续费 298¥/年 | 定制报价 |
|
||||
| **服务时长** | — | 1 年 | 1 年 | 1 年 | 1 年 |
|
||||
| **服务席位** | — | 1 个 | 1 个 | 1 个 | ≥5 个 |
|
||||
| **增加席位** | — | — | — | 支持(298¥/席位/年) | 支持(定制报价)|
|
||||
| **支持方式** | | | | | |
|
||||
| - Github Issues | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 官方 QQ 群 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - QQ 一对一支持 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 专属 VIP 群 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 微信支持 | — | — | — | ✔️ | ✔️ |
|
||||
| - 电话支持 | — | — | — | — | ✔️ |
|
||||
| - 专属企业群 | — | — | — | — | ✔️ |
|
||||
| **核心权益** | | | | | |
|
||||
| - 商用与二次开发 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 即时技术支持 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 开发优化指导 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 需求优先处理 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 付费定制 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 扩展 UI 组件 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 扩展图表免费使用 | — | 按需购买 | ✔️(全量) | ✔️(全量) | ✔️(全量) |
|
||||
| **企业专属权益** | | | | | |
|
||||
| - 电子发票 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 专用发票 | — | — | — | ✔️ | ✔️ |
|
||||
| - 首页赞助展示 | — | — | — | — | ✔️ |
|
||||
| **源码与更新** | | | | | |
|
||||
| - 永久持有源码 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| - 1 年更新支持 | — | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| **GitHub 仓库权限**| 公开仓库 | +UI 扩展组件 | +Pro 扩展图表 | +Pro 扩展图表 | +Pro 扩展图表 |
|
||||
|
||||
>备注:
|
||||
>*__`付费定制`__ 用户可根据自己的需求可付费定制不同的图表或新功能,只有`VIP`用户才享有`付费定制`权利。
|
||||
>*__`付费加急`__ 用户可对已在开发计划中或正在开发中的功能进行付费加急,将开发优先级提到最高,并可要求在指定`截止日期`内交付,只有`VIP`用户才享有`付费加急`权利。
|
||||
>*__`付费咨询`__ 付费咨询有效期`7`天,且总咨询时长不超过`7`个小时。
|
||||
>*__`扩展图表`__ 购买后代码可永久持有和商用,1年的更新和技术支持。可继续订阅VIP延长服务时间。
|
||||
>*__`全部免费`__ 是指在订阅期间的`个人SVIP`和`企业VIP`的订阅用户,可免费使用全部的扩展图表。
|
||||
>*__`次年付费`__ 个人SVIP和企业VIP的首年和次年付费不一样,次年付费都是`298¥`。
|
||||
>*__`增加席位`__ 企业VIP支持增加席位,每个席位`298¥`一年。
|
||||
>*__`对公转账`__ 有开专票需求时,可用企业银行帐号进行公对公转账支付。二维码支付不支持开专票,只能开普票。发票默认都是电子发票。
|
||||
>*__`登记资料`__ 订阅成功后,需提供手机号和Github帐号进行登记,手机号用于确认归属,Github帐号用于加入Github的Team组织,下载源码。
|
||||
## 扩展图表
|
||||
|
||||
## 购买扩展图表
|
||||
以下扩展图表需订阅 VIP 后购买(个人SVIP 及企业 VIP 用户可免费使用全量图表):
|
||||
|
||||
扩展图表为另付费购买图表,只对订阅了`VIP`服务的用户开放购买。对于`个人SVIP`和`企业VIP`的订阅用户,所有扩展图表仓库在订阅期间可全部免费使用,不用再单独购买。
|
||||
|
||||
对所有已购买的扩展图表,源码可永久持有但不能传播,并获得持续一年的更新支持和技术服务,一年后如需更新支持等服务,可再继续订阅`VIP`服务。
|
||||
|
||||
|编号|扩展图表|扩展图表|价格|
|
||||
|编号|扩展图表|图表类名|价格|
|
||||
|--|--|--|--|
|
||||
| 101 | [象形柱图](https://xcharts-team.github.io/docs/pictorialbar) |PictorialBarChart | 98¥ |
|
||||
| 102 | [漏斗图](https://xcharts-team.github.io/docs/funnel) |FunnelChart | 98¥ |
|
||||
| 103 | [3D金字塔](https://xcharts-team.github.io/docs/pyramid) |PyramidChart | 98¥ |
|
||||
| 104 | [树形矩图](https://xcharts-team.github.io/docs/treemap) |TreemapChart | 98¥ |
|
||||
| 105 | [桑基图](https://xcharts-team.github.io/docs/sankey) |SankeyChart | 98¥ |
|
||||
| 201 | [3D柱图](https://xcharts-team.github.io/docs/bar3d) |Bar3DChart | 198¥ |
|
||||
| 202 | [3D饼图](https://xcharts-team.github.io/docs/pie3d) |Pie3DChart | 198¥ |
|
||||
| 203 | [甘特图](https://xcharts-team.github.io/docs/gantt) |GanttChart | 198¥ |
|
||||
| 204 | [仪表盘](https://xcharts-team.github.io/docs/gauge) |GaugeChart | 198¥ |
|
||||
| 205 | [水位图](https://xcharts-team.github.io/docs/liquid) |LiquidChart | 198¥ |
|
||||
| 206 | [3D折线图](https://xcharts-team.github.io/docs/line3d) |Line3DChart | 198¥ |
|
||||
| 207 | [关系图](https://xcharts-team.github.io/docs/graph) |GraphChart | 198¥ |
|
||||
|
||||
扩展图表的在线效果图也可以查看[WebGL在线Demo](https://xcharts-team.github.io/examples/)
|
||||
## 附注说明
|
||||
|
||||
## 捐助支持
|
||||
1. **扩展图表更新**:购买后享 1 年免费更新,续订 VIP 可延长服务周期。
|
||||
2. **企业订阅**:支持公对公转账与专用发票,席位可灵活调整。
|
||||
3. **定制服务**:VIP 用户可额外付费定制功能或加急需求开发。
|
||||
|
||||
如果这个项目对您有帮助,请右上方点 `Star` 予以支持!也欢迎扫后面的二维码进行任意金额的捐助,XCharts需要您的支持和帮助。
|
||||
## 支持我们
|
||||
|
||||
## 二维码
|
||||
|
||||
如果看不到二维码图片,可以加Q联系`XCharts技术支持:3525422251`或邮件`monitor1394@gmail.com`咨询。
|
||||
|
||||

|
||||

|
||||
- **社区支持**:欢迎在 GitHub 为 XCharts 点 ⭐️ [Star 支持](https://github.com/XCharts-Team/XCharts)
|
||||
- **扫码捐助**:
|
||||

|
||||

|
||||
|
||||
@@ -6,84 +6,146 @@ slug: /tutorial01
|
||||
|
||||
# 教程:5分钟上手 XCharts 3.0
|
||||
|
||||
> 注:本教程适用XCharts 3.x版本,2.x版本请看 [教程:5分钟上手XCharts 2.0](https://github.com/XCharts-Team/XCharts/blob/2.0/Doc/教程:5分钟上手XCharts.md)
|
||||
:::warning
|
||||
|
||||
## 使用 XCharts 前需要掌握什么
|
||||
Note:本教程仅适用XCharts 3.x版本,2.x版本请看 [教程:5分钟上手XCharts 2.0](https://github.com/XCharts-Team/XCharts/blob/2.0/Doc/教程:5分钟上手XCharts.md)
|
||||
|
||||
- 会简单使用Unity
|
||||
- 了解UGUI,会使用UGUI
|
||||
- 了解Unity的MonoBehavior脚本用法,知道怎么挂脚本,用代码操作脚本
|
||||
:::
|
||||
|
||||
## 获取和导入 XCharts
|
||||
## XCharts的前提条件
|
||||
|
||||
XCharts可通过以下任意一种方式导入到项目:
|
||||
XCharts是一个Unity图表插件,目前只能在Unity平台使用。
|
||||
|
||||
- 直接将XCharts源码到项目
|
||||
使用XCharts前,你需要:
|
||||
|
||||
下载好XCharts源码后,直接将XCharts目录拷贝到Unity项目工程的Assets目录下。
|
||||
- 掌握Unity的基本用法。
|
||||
- 掌握UGUI制作UI的基本用法。
|
||||
- 了解Unity的MonoBehavior脚本用法,知道怎么挂脚本和用代码操作脚本。
|
||||
|
||||
- 通过`Assets/Import Package`导入XCharts
|
||||
如果你刚接触Unity,建议先学习Unity相关的基础教程再使用XCharts。
|
||||
|
||||
下载好XCharts的.unitypackage文件后,打开Unity,菜单栏 Assets-->Import Package-->选中.unitypackage导入即可开始使用XCharts。
|
||||
## XCharts的获取和导入
|
||||
|
||||
- 通过`Package Manager`导入XCharts
|
||||
XCharts主要通过Github来维护更新和发布,可以到[【Github主页】](https://github.com/XCharts-Team)进行下载获取源码和Pacakge;对于无Github访问条件的用户,可以访问[【国内镜像】](https://gitee.com/monitor1394/unity-ugui-XCharts)进行下载。国内镜像的版本更新可能会相对滞后。
|
||||
|
||||
对于Unity 2018.3以上版本,可通过 Package Manager来导入XCharts,打开Package Manager后,通过 `Add package form git URL...`,输入XCharts3.0的GitHub URL: `https://github.com/XCharts-Team/XCharts.git#3.0` 稍等片刻后即可使用XCharts。
|
||||
XCharts可通过以下任意一种方式导入到你的项目:
|
||||
|
||||
也可以直接将package加入到`manifest.json`文件:打开`Packages`目录下的`manifest.json`文件,在`dependencies`下加入:
|
||||
### 直接将XCharts源码拷贝到项目
|
||||
|
||||
``` json
|
||||
"com.monitor1394.xcharts": "https://github.com/XCharts-Team/XCharts.git#3.0",
|
||||
```
|
||||
下载好XCharts源码后,直接将XCharts目录拷贝到Unity项目工程的Assets目录下。编译通过后即可使用。
|
||||
|
||||
如需更新`XCharts`,删除`manifest.json`文件(部分Unity版本可能是packages-lock.json文件)的`lock`下的`com.monitor1394.xcharts`相关内容即会重新下载编译。
|
||||
### 通过Import Package导入XCharts
|
||||
|
||||
- 建议先导入XCharts的守护程序(非必须)
|
||||
下载好XCharts的.unitypackage文件后,打开Unity,菜单栏 Assets-->Import Package-->选中下载好的.unitypackage进行导入。导入完成并通过编译后即可开始使用XCharts。
|
||||
|
||||
守护程序[XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon)可以确保更新时编译正常,当本地开启TextMeshPro或NewInputSystem时将会非常有用。将XCharts-Daemon导入项目后,在更新XCharts时守护程序会自动根据本地TMP等的开启情况刷新asmdef,确保编译正常,不用手动去解决,方便CI-CD等自动化流程执行。
|
||||
### 通过Package Manager导入XCharts
|
||||
|
||||
## 添加一个简单图表
|
||||
对于2018.3以上的Unity版本,可通过Package Manager来导入XCharts,打开Package Manager后,通过 `Add package form git URL...`,输入XCharts的GitHub URL: `https://github.com/XCharts-Team/XCharts.git` 编译通过后即可使用XCharts。
|
||||
|
||||
在`Hierarchy`视图下右键或菜单栏`GameObject`下拉选择`XCharts->LineChart`,即可快速创建一个默认的折线图出来:
|
||||
对于部分Unity版本,也可以直接将package加入到`manifest.json`文件:打开`Packages`目录下的`manifest.json`文件,在`dependencies`下加入:
|
||||
|
||||
>"com.monitor1394.xcharts": "https://github.com/XCharts-Team/XCharts.git",
|
||||
|
||||
如需更新`XCharts`,删除`manifest.json`文件(部分Unity版本可能是packages-lock.json文件)的`lock`下的`com.monitor1394.xcharts`相关内容即会重新下载编译。
|
||||
|
||||
### 建议导入XCharts的守护程序
|
||||
|
||||
守护程序[XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon)可以确保更新时编译正常,当本地开启TextMeshPro或NewInputSystem时将会非常有用。将XCharts-Daemon导入项目后,在更新XCharts时守护程序会自动根据本地TMP等的开启情况刷新XCharts的asmdef,确保编译正常,不用手动去解决,方便CI/CD等自动化流程执行。
|
||||
|
||||
XCharts-Daemon的导入方式可参考刚才的XCharts导入方式。可以通过源码或Package的方式导入项目,XCharts-Daemon的Github URL:https://github.com/XCharts-Team/XCharts-Daemon.git
|
||||
|
||||
## XCharts的基本使用
|
||||
|
||||
导入XCharts并编译通过后,Unity编辑器的菜单栏会显示XCharts,这时可以开始使用XCharts了。
|
||||
|
||||
:::tip
|
||||
|
||||
Unity的菜单栏出现XCharts菜单时才表示XCharts可用。
|
||||
|
||||
:::
|
||||
|
||||
### 添加一个简单图表
|
||||
|
||||
在`Hierarchy`视图下右键`UI->XCharts->LineChart`或菜单栏`XCharts`下拉选择`LineChart`,即可快速创建一个默认的折线图:
|
||||
|
||||

|
||||
|
||||
## 添加多个Seire
|
||||
如需在某个节点下创建图表,可以选中节点右键`UI->XCharts->LineChart`即可在节点下创建图表。
|
||||
|
||||
### 修改图表数据
|
||||
|
||||
刚创建的图表,它的数据可以在Inspector视图面板上进行修改。
|
||||
|
||||
对于X轴数据,可通过:`XAxis->Data`展开后进行增删和修改:
|
||||
|
||||

|
||||
|
||||
对于Serie数据,可通过:`Serie->Data`展开后进行增删和修改:
|
||||
|
||||

|
||||
|
||||
Serie支持多维数据,一般折线图只用到二维数据:第一维表示X轴类目数据的编号,第二维表示对应的数值。
|
||||
|
||||
### 添加多个Seire
|
||||
|
||||
在`Inspector`视图,找到`LineChart`的面板,通过`Add Serie`按钮,可以添加第二条`Line`折线:
|
||||
|
||||

|
||||

|
||||
|
||||
## 添加其他组件
|
||||
:::tip
|
||||
|
||||
Serie通过`Add Serie`按钮添加。可添加不同类型的Serie。[XCharts有哪些Serie?](https://xcharts-team.github.io/docs/configuration#serie-系列)
|
||||
|
||||
:::
|
||||
|
||||
### 添加其他主组件
|
||||
|
||||
默认图表没有`Legend`,需要`Legend`组件可通过`Add Component`按钮添加:
|
||||
|
||||

|
||||
|
||||
## 添加Serie组件
|
||||
:::tip
|
||||
|
||||
Serie只自带了几个常见的组件,其他组件按需额外添加。比如,需要给折线图区域填充颜色,可单独给`Serie`添加`AreaStyle`组件:
|
||||
主组件通过`Add Component`按钮添加。[XCharts有哪些主组件?](https://xcharts-team.github.io/docs/configuration/#maincomponent-主组件)
|
||||
|
||||
:::
|
||||
|
||||
### 添加Serie组件
|
||||
|
||||
Serie只自带了几个常见的组件,其他组件用到时需额外添加。比如,需要给折线图进行区域填充颜色,可单独给`Serie`添加`AreaStyle`组件:
|
||||
|
||||

|
||||

|
||||
|
||||
## 添加SerieData组件
|
||||
:::tip
|
||||
|
||||
如果需要个性化定制每个数据项的配置,可以单独给每个`SerieData`添加`Component`。比如我们给折线图的第二个数据单独显示`Label`:
|
||||
Serie组件通过Serie右边的按钮添加。[XCharts有哪些Serie组件?](https://xcharts-team.github.io/docs/configuration/#iseriecomponent-可添加到serie的组件)
|
||||
|
||||
:::
|
||||
|
||||
### 添加SerieData组件
|
||||
|
||||
如果需要个性化定制每个数据项的配置,可以单独给每个`SerieData`添加组件。比如我们给折线图的第二个数据单独显示`Label`:
|
||||
|
||||

|
||||

|
||||
|
||||
## 更多组件和配置参数
|
||||
:::tip
|
||||
|
||||
XCharts经过不断的迭代优化,目前已有多达几十种的主组件和子组件,每个组件有几个至几十个不等的可配置参数,以支持各种灵活而复杂的功能。
|
||||
SerieData组件通过展开SerieData后Component右边的按钮添加。[XCharts有哪些SerieData组件?](https://xcharts-team.github.io/docs/configuration/#iseriedatacomponent-可添加到seriedata的组件)
|
||||
|
||||
首次使用XCharts,可在 `Inspector` 视图添加各种图表,给图表添加或调整里面组件,`Game` 视图会实时反馈调整后的效果,以熟悉各种组件的使用。各个组件的详细参数说明可查阅[XCharts配置项手册](configuration.md)。
|
||||
:::
|
||||
|
||||
## 如何快速调整参数
|
||||
### 更多组件和配置参数
|
||||
|
||||
`XCharts`是配置和数据来驱动的。想要什么效果,只需要去调整对应组件下的配置参数就可以,不需要去改`Hierarchy`视图下的节点,因为那些节点是由`XCharts`内部根据配置和数据生成的,即使改了也会在刷新时还原回来。
|
||||
XCharts经过不断的迭代优化,目前已有多达几十种的主组件和子组件,每个组件有几个到几十个的可配置参数,用来支持多样化的功能。
|
||||
|
||||
首次使用XCharts,建议亲自去测试下各个图表各个组件的实际效果。`Inspector` 视图可以直接添加各种图表,各种组件以及调整各个配置参数,`Game` 视图会实时反馈调整后的效果。各个组件的详细参数说明可查阅[XCharts配置项手册](configuration.md)。
|
||||
|
||||
### 如何快速调整参数
|
||||
|
||||
XCharts是数据和参数驱动的。想要什么效果,只需要去调整对应组件下的配置参数就可以,不能去改`Hierarchy`视图下的节点,因为那些节点是由XCharts内部根据配置和数据生成的,即使改了也会在刷新时被还原掉。
|
||||
|
||||
如何快速定位你想要改的效果所对应的组件,这就需要对组件有一定的了解。比如我们想要让X轴的轴线末端显示箭头,如何定位?第一步,X轴定位到`XAxis0`;第二步,轴线定位到`AxisLine`;最后,再去看`AxisLine`组件下有没有这样的参数可以实现这个效果,对于不太确定的参数可以查阅[XCharts配置项手册](configuration.md)。
|
||||
|
||||
@@ -93,9 +155,13 @@ XCharts经过不断的迭代优化,目前已有多达几十种的主组件和
|
||||
2. 如果`Serie`的`ItemStyle`配置有非`0000`颜色值,则优先用这个颜色值。
|
||||
3. 否则颜色值取自主题`Theme`的`Color Palette`。
|
||||
|
||||
通常颜色值为0000时表示用主题默认颜色,配置为0或null时表示用主题默认配置。
|
||||
:::tip
|
||||
|
||||
## 用代码添加折线图
|
||||
通常颜色值为0000时表示用主题默认颜色;其他参数为0或null时表示用主题默认配置;设置颜色时注意透明度。
|
||||
|
||||
:::
|
||||
|
||||
### 用代码添加折线图
|
||||
|
||||
给`gameObject`挂上`LineChart`脚本:
|
||||
|
||||
@@ -143,13 +209,21 @@ var yAxis = chart.EnsureChartComponent<YAxis>();
|
||||
yAxis.type = Axis.AxisType.Value;
|
||||
```
|
||||
|
||||
清空默认数据,添加`Line`类型的`Serie`用于接收数据:
|
||||
清空所有默认数据(包含Serie),添加`Line`类型的`Serie`用于接收数据:
|
||||
|
||||
```csharp
|
||||
chart.RemoveData();
|
||||
chart.AddSerie<Line>("line");
|
||||
```
|
||||
|
||||
如果Serie是固定的,建议只是清空数据,不用把Serie也清掉:
|
||||
|
||||
```csharp
|
||||
chart.ClearData();
|
||||
```
|
||||
|
||||
这样可以提前在UI上设置好Serie的配置参数。
|
||||
|
||||
添加10个数据:
|
||||
|
||||
```csharp
|
||||
@@ -164,30 +238,34 @@ for (int i = 0; i < 10; i++)
|
||||
|
||||

|
||||
|
||||
如果一个Chart里面有多个系列时,则Axis的data只需要加一次,不要多个循环加重复了。记住:Axis的数据个数要和Serie的数据个数一致。
|
||||
如果一个Chart里面有多个系列时,则Axis的data只需要加一次,不要多个循环加重复了。
|
||||
|
||||
:::danger
|
||||
|
||||
请确保Axis的数据个数和Serie的数据个数一致。
|
||||
|
||||
:::
|
||||
|
||||
完整代码请查阅`Examples`:`Example13_LineSimple.cs`
|
||||
|
||||
你还可以用代码控制更多的参数,`Examples`下还有更多的其他例子,凡是`Inspector`上看到的可配置的参数,都可以通过代码来设置。[XCharts配置项手册](configuration.md)里面的所有参数都是可以通过代码控制的。
|
||||
|
||||
另外,除非定制,建议调用`Chart`下提供的`public`接口,特别是数据相关操作部分。这些接口内部会做一些关联处理,比如刷新图表等。常见的接口有:
|
||||
### 设置默认字体
|
||||
|
||||
1. `chart.ClearData()`:清空图表数据(不移除Series)
|
||||
2. `chart.RemoveData()`:清除图表数据(会移除所有Serie)
|
||||
3. `chart.AddSerie()`:添加Serie
|
||||
4. `chart.AddXAxisData()`:添加X轴数据
|
||||
5. `chart.AddData()`:添加Serie数据
|
||||
6. `chart.UpdateData()`:更新Serie数据
|
||||
7. `chart.UpdateXAxisData()`:更新X轴数据
|
||||
8. `chart.UpdateDataName()`:更新Serie数据的名字
|
||||
XCharts默认使用的是Unity默认字体`Arial`,在WebGL平台上可能无法显示中文。在将XCharts用在你的项目时,建议先设置好字体:
|
||||
|
||||
XCharts内部有自动刷新机制,但也是在一定条件才会触发。如果自己调用了内部组件的接口,碰到组件没有刷新,确实找不到原因的话,可以用以下两个接口强制刷新:
|
||||
- 找到`XCharts/Resources/XCSetting.asset`资源,修改里面的`Font`并保存。
|
||||
- 找到`XCharts/Resources/XCTheme-Default.asset`和`XCharts/Resources/XCTheme-Default.asset`两个字体配置,点击`Sync Font from Setting`和`Sync Font to Sub Theme`按钮将字体同步到主题配置文件上。
|
||||
|
||||
1. `chart.RefreshAllComponent()`:刷新图表组件,会重新初始化所有组件,不建议频繁待用。
|
||||
2. `chart.RefreshChart()`:刷新图表绘制,只刷新绘制部分,不会刷新组件文本,位置等部分。
|
||||
3. 各个组件也可以通过`SetAllDirty()`只刷新自己。
|
||||
字体设置好后,新创建的图表就会用新设置的字体了。对于旧图表,可以点击`Rebuild Chart Object`进行刷新。
|
||||
|
||||
## 使用TextMeshPro
|
||||
:::warning
|
||||
|
||||
使用XCharts前建议先设置好字体;更新XCharts时注意设置的字体可能被还原的问题。
|
||||
|
||||
:::
|
||||
|
||||
### 使用TextMeshPro
|
||||
|
||||
XCharts支持TextMeshPro,但默认是不开启的,需要自己手动切换。可通过以下方式开启和关闭:
|
||||
|
||||
@@ -206,10 +284,33 @@ XCharts支持TextMeshPro,但默认是不开启的,需要自己手动切换
|
||||
|
||||
`3.8.0`版本后增加[XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon)守护程序,将XCharts-Daemon导入项目后,在更新XCharts时守护程序会自动根据本地开启的TMP情况刷新asmdef,确保编译正常。
|
||||
|
||||
## 用代码改图表参数
|
||||
## XCharts的代码控制
|
||||
|
||||
`Inspector`上看到的所有参数都可以用代码来修改,关键是要定位好你要改的参数是在组件上、还是Serie上、还是在具体的数据项SerieData上。
|
||||
|
||||
另外,除非定制,建议调用`Chart`下提供的`public`接口,特别是数据相关和列表的操作。这些接口内部会做一些关联处理,比如刷新图表等。常见的接口有:
|
||||
|
||||
1. `chart.ClearData()`:清空图表数据(不移除Series)
|
||||
2. `chart.RemoveData()`:清除图表数据(会移除所有Serie)
|
||||
3. `chart.AddSerie()`:添加Serie
|
||||
4. `chart.AddXAxisData()`:添加X轴数据
|
||||
5. `chart.AddData()`:添加Serie数据
|
||||
6. `chart.UpdateData()`:更新Serie数据
|
||||
7. `chart.UpdateXAxisData()`:更新X轴数据
|
||||
8. `chart.UpdateDataName()`:更新Serie数据的名字
|
||||
|
||||
XCharts内部有自动刷新机制,但也是在一定条件才会触发。如果自己调用了内部组件的接口,碰到组件没有刷新,确实找不到原因的话,可以用以下两个接口强制刷新:
|
||||
|
||||
1. `chart.RefreshAllComponent()`:刷新图表组件,会重新初始化所有组件,不建议频繁待用。
|
||||
2. `chart.RefreshChart()`:刷新图表绘制,只刷新绘制部分,不会刷新组件文本,位置等部分。
|
||||
3. 各个组件也可以通过`SetAllDirty()`只刷新自己。
|
||||
|
||||
:::danger
|
||||
|
||||
用API去操作数据和各种list,而不是直接访问list进行处理
|
||||
|
||||
:::
|
||||
|
||||
### 改主组件上的参数
|
||||
|
||||
需要先获取组件,再修改里面的参数:
|
||||
@@ -225,7 +326,11 @@ xAxis.boundaryGap = true;
|
||||
xAxis.type = Axis.AxisType.Category;
|
||||
```
|
||||
|
||||
> 注:低版本没有`EnsureChartComponent()`接口时,用`GetOrAddChartComponent()`
|
||||
:::note
|
||||
|
||||
低版本没有`EnsureChartComponent()`接口时,用`GetOrAddChartComponent()`
|
||||
|
||||
:::
|
||||
|
||||
### 改Serie的参数
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ namespace XCharts.Editor
|
||||
protected SerializedProperty m_Settings;
|
||||
protected SerializedProperty m_Theme;
|
||||
protected SerializedProperty m_ChartName;
|
||||
protected SerializedProperty m_UseUtc;
|
||||
protected SerializedProperty m_DebugInfo;
|
||||
protected SerializedProperty m_RaycastTarget;
|
||||
|
||||
@@ -49,6 +50,7 @@ namespace XCharts.Editor
|
||||
m_Script = serializedObject.FindProperty("m_Script");
|
||||
m_EnableTextMeshPro = serializedObject.FindProperty("m_EnableTextMeshPro");
|
||||
m_ChartName = serializedObject.FindProperty("m_ChartName");
|
||||
m_UseUtc = serializedObject.FindProperty("m_UseUtc");
|
||||
m_Theme = serializedObject.FindProperty("m_Theme");
|
||||
m_Settings = serializedObject.FindProperty("m_Settings");
|
||||
m_DebugInfo = serializedObject.FindProperty("m_DebugInfo");
|
||||
@@ -124,6 +126,7 @@ namespace XCharts.Editor
|
||||
{
|
||||
EditorGUILayout.PropertyField(m_Script);
|
||||
EditorGUILayout.PropertyField(m_ChartName);
|
||||
EditorGUILayout.PropertyField(m_UseUtc);
|
||||
EditorGUILayout.PropertyField(m_RaycastTarget);
|
||||
if (XChartsMgr.IsRepeatChartName(m_Chart, m_ChartName.stringValue))
|
||||
{
|
||||
@@ -282,7 +285,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
if (GUILayout.Button(Styles.btnSaveAsImage))
|
||||
{
|
||||
m_Chart.SaveAsImage();
|
||||
m_Chart.SaveAsImage("png", "", 4f);
|
||||
}
|
||||
if (m_CheckWarning)
|
||||
{
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace XCharts.Editor
|
||||
++EditorGUI.indentLevel;
|
||||
PropertyField(prop, "m_Delay");
|
||||
PropertyField(prop, "m_Duration");
|
||||
PropertyField(prop, "m_Speed");
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
@@ -30,6 +31,7 @@ namespace XCharts.Editor
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
PropertyField(prop, "m_Duration");
|
||||
PropertyField(prop, "m_Speed");
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
@@ -45,6 +47,7 @@ namespace XCharts.Editor
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
PropertyField(prop, "m_Duration");
|
||||
PropertyField(prop, "m_Speed");
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
@@ -68,6 +71,21 @@ namespace XCharts.Editor
|
||||
}
|
||||
}
|
||||
|
||||
[CustomPropertyDrawer(typeof(XCharts.Runtime.AnimationExchange), true)]
|
||||
public class AnimationExchangeDrawer : BasePropertyDrawer
|
||||
{
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
base.OnGUI(pos, prop, label);
|
||||
if (MakeComponentFoldout(prop, "m_Enable", true))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
PropertyField(prop, "m_Duration");
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[CustomPropertyDrawer(typeof(AnimationStyle), true)]
|
||||
public class AnimationDrawer : BasePropertyDrawer
|
||||
{
|
||||
@@ -85,6 +103,7 @@ namespace XCharts.Editor
|
||||
PropertyField(prop, "m_Change");
|
||||
PropertyField(prop, "m_Addition");
|
||||
PropertyField(prop, "m_Interaction");
|
||||
PropertyField(prop, "m_Exchange");
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ namespace XCharts.Editor
|
||||
protected override void DrawExtendeds(SerializedProperty prop)
|
||||
{
|
||||
base.DrawExtendeds(prop);
|
||||
PropertyField(prop, "m_UnableColor");
|
||||
PropertyField(prop, "m_InactiveColor");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace XCharts.Editor
|
||||
PropertyField(prop, "m_MarkColor");
|
||||
PropertyField(prop, "m_BackgroundColor");
|
||||
PropertyField(prop, "m_BackgroundWidth");
|
||||
PropertyField(prop, "m_BackgroundGap");
|
||||
PropertyField(prop, "m_CenterColor");
|
||||
PropertyField(prop, "m_CenterGap");
|
||||
PropertyField(prop, "m_BorderWidth");
|
||||
|
||||
@@ -24,6 +24,8 @@ namespace XCharts.Editor
|
||||
PropertyField(prop, "m_Rotate");
|
||||
PropertyField(prop, "m_Width");
|
||||
PropertyField(prop, "m_Height");
|
||||
PropertyField(prop, "m_FixedX");
|
||||
PropertyField(prop, "m_FixedY");
|
||||
PropertyField(prop, "m_Icon");
|
||||
PropertyField(prop, "m_Background");
|
||||
PropertyField(prop, "m_TextStyle");
|
||||
|
||||
@@ -29,6 +29,8 @@ namespace XCharts.Editor
|
||||
{
|
||||
base.DrawExtendeds(prop);
|
||||
PropertyField(prop, "m_OnZero");
|
||||
PropertyField(prop, "m_StartExtendLength");
|
||||
PropertyField(prop, "m_EndExtendLength");
|
||||
PropertyField(prop, "m_ShowArrow");
|
||||
PropertyField(prop, "m_Arrow");
|
||||
}
|
||||
@@ -46,6 +48,7 @@ namespace XCharts.Editor
|
||||
PropertyField(prop, "m_AutoColor");
|
||||
PropertyField(prop, "m_ShowStartLine");
|
||||
PropertyField(prop, "m_ShowEndLine");
|
||||
PropertyField(prop, "m_ShowZLine");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,10 @@ namespace XCharts.Editor
|
||||
}
|
||||
PropertyField(prop, "m_Color");
|
||||
PropertyField(prop, "m_Size");
|
||||
PropertyField(prop, "m_Size2");
|
||||
PropertyField(prop, "m_Gap");
|
||||
PropertyField(prop, "m_BorderWidth");
|
||||
PropertyField(prop, "m_EmptyColor");
|
||||
PropertyField(prop, "m_Offset");
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
|
||||
@@ -27,14 +27,13 @@ namespace XCharts.Editor
|
||||
PropertyField(prop, "m_Color");
|
||||
PropertyField(prop, "m_FontSize");
|
||||
PropertyField(prop, "m_LineSpacing");
|
||||
PropertyField(prop, "m_Alignment");
|
||||
PropertyField(prop, "m_AutoAlign");
|
||||
#if dUI_TextMeshPro
|
||||
PropertyField(prop, "m_TMPFontStyle");
|
||||
PropertyField(prop, "m_TMPSpriteAsset");
|
||||
PropertyField(prop, "m_TMPAlignment");
|
||||
#else
|
||||
PropertyField(prop, "m_FontStyle");
|
||||
PropertyField(prop, "m_Alignment");
|
||||
PropertyField(prop, "m_AutoAlign");
|
||||
PropertyField(prop, "m_AutoWrap");
|
||||
#endif
|
||||
--EditorGUI.indentLevel;
|
||||
|
||||
23
Editor/ChildComponents/ViewControlDrawer.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using XCharts.Runtime;
|
||||
|
||||
namespace XCharts.Editor
|
||||
{
|
||||
[CustomPropertyDrawer(typeof(ViewControl), true)]
|
||||
public class ViewControlDrawer : BasePropertyDrawer
|
||||
{
|
||||
public override string ClassName { get { return "ViewControl"; } }
|
||||
public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label)
|
||||
{
|
||||
base.OnGUI(pos, prop, label);
|
||||
if (MakeComponentFoldout(prop, "", true))
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
PropertyField(prop, "m_Alpha");
|
||||
PropertyField(prop, "m_Beta");
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1d778205a63524227a09c7e5b0e8736f
|
||||
guid: faeb8611591ee4c038e88fdb5a67b5ae
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
@@ -64,6 +64,7 @@ namespace XCharts.Editor
|
||||
if (type == Axis.AxisType.Category)
|
||||
{
|
||||
PropertyField("m_MaxCache");
|
||||
PropertyField("m_MinCategorySpacing");
|
||||
PropertyField("m_BoundaryGap");
|
||||
}
|
||||
else
|
||||
@@ -101,10 +102,33 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[ComponentEditor(typeof(XAxis))]
|
||||
public class XAxisEditor : AxisEditor { }
|
||||
public class XAxisEditor : AxisEditor
|
||||
{
|
||||
protected override void DrawExtendeds()
|
||||
{
|
||||
base.DrawExtendeds();
|
||||
PropertyField("m_MainAxis");
|
||||
}
|
||||
}
|
||||
|
||||
[ComponentEditor(typeof(YAxis))]
|
||||
public class YAxisEditor : AxisEditor { }
|
||||
public class YAxisEditor : AxisEditor
|
||||
{
|
||||
protected override void DrawExtendeds()
|
||||
{
|
||||
base.DrawExtendeds();
|
||||
PropertyField("m_MainAxis");
|
||||
}
|
||||
}
|
||||
|
||||
[ComponentEditor(typeof(XAxis3D))]
|
||||
public class XAxis3DEditor : AxisEditor { }
|
||||
|
||||
[ComponentEditor(typeof(YAxis3D))]
|
||||
public class YAxis3DEditor : AxisEditor { }
|
||||
|
||||
[ComponentEditor(typeof(ZAxis3D))]
|
||||
public class ZAxis3DEditor : AxisEditor { }
|
||||
|
||||
[ComponentEditor(typeof(SingleAxis))]
|
||||
public class SingleAxisEditor : AxisEditor
|
||||
@@ -154,6 +178,7 @@ namespace XCharts.Editor
|
||||
|
||||
PropertyField(prop, "m_ShowAsPositiveNumber");
|
||||
PropertyField(prop, "m_OnZero");
|
||||
PropertyField(prop, "m_ShowZeroLabel");
|
||||
PropertyField(prop, "m_ShowStartLabel");
|
||||
PropertyField(prop, "m_ShowEndLabel");
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ namespace XCharts.Editor
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
PropertyField("m_Layer");
|
||||
PropertyField("m_LabelStyle");
|
||||
//PropertyField("m_MarkStyle");
|
||||
PropertyListField("m_Items", true);
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace XCharts.Editor
|
||||
var m_SupportMarquee = baseProperty.FindPropertyRelative("m_SupportMarquee");
|
||||
var m_Start = baseProperty.FindPropertyRelative("m_Start");
|
||||
var m_End = baseProperty.FindPropertyRelative("m_End");
|
||||
var m_MinShowNum = baseProperty.FindPropertyRelative("m_MinShowNum");
|
||||
var m_MinZoomRatio = baseProperty.FindPropertyRelative("m_MinZoomRatio");
|
||||
++EditorGUI.indentLevel;
|
||||
PropertyField("m_Orient");
|
||||
PropertyField("m_SupportInside");
|
||||
@@ -31,10 +31,11 @@ namespace XCharts.Editor
|
||||
PropertyField(m_End);
|
||||
PropertyField("m_StartLock");
|
||||
PropertyField("m_EndLock");
|
||||
PropertyField(m_MinShowNum);
|
||||
PropertyField(m_MinZoomRatio);
|
||||
if (m_Start.floatValue < 0) m_Start.floatValue = 0;
|
||||
if (m_End.floatValue > 100) m_End.floatValue = 100;
|
||||
if (m_MinShowNum.intValue < 0) m_MinShowNum.intValue = 0;
|
||||
if (m_MinZoomRatio.floatValue < 0) m_MinZoomRatio.floatValue = 0;
|
||||
if (m_MinZoomRatio.floatValue > 1) m_MinZoomRatio.floatValue = 1;
|
||||
if (m_SupportSlider.boolValue)
|
||||
{
|
||||
PropertyField("m_ShowDataShadow");
|
||||
|
||||
23
Editor/MainComponents/GridCoord3DEditor.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using UnityEditor;
|
||||
using XCharts.Runtime;
|
||||
|
||||
namespace XCharts.Editor
|
||||
{
|
||||
[ComponentEditor(typeof(GridCoord3D))]
|
||||
public class GridCoord3DEditor : MainComponentEditor<GridCoord3D>
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
++EditorGUI.indentLevel;
|
||||
PropertyField("m_Left");
|
||||
PropertyField("m_Bottom");
|
||||
PropertyField("m_BoxWidth");
|
||||
PropertyField("m_BoxHeight");
|
||||
PropertyField("m_BoxDepth");
|
||||
PropertyField("m_XYExchanged");
|
||||
PropertyField("m_ShowBorder");
|
||||
PropertyField("m_ViewControl");
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Editor/MainComponents/GridCoord3DEditor.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c9a4a8a30b1124c4e996e234d5717a07
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -11,13 +11,10 @@ namespace XCharts.Editor
|
||||
++EditorGUI.indentLevel;
|
||||
var layoutIndex = baseProperty.FindPropertyRelative("m_LayoutIndex").intValue;
|
||||
PropertyField("m_LayoutIndex");
|
||||
if (layoutIndex < 0)
|
||||
{
|
||||
PropertyField("m_Left");
|
||||
PropertyField("m_Right");
|
||||
PropertyField("m_Top");
|
||||
PropertyField("m_Bottom");
|
||||
}
|
||||
PropertyField("m_Left");
|
||||
PropertyField("m_Right");
|
||||
PropertyField("m_Top");
|
||||
PropertyField("m_Bottom");
|
||||
PropertyField("m_BackgroundColor");
|
||||
PropertyField("m_ShowBorder");
|
||||
PropertyField("m_BorderWidth");
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace XCharts.Editor
|
||||
PropertyField("m_ItemGap");
|
||||
PropertyField("m_ItemAutoColor");
|
||||
PropertyField("m_ItemOpacity");
|
||||
PropertyField("m_ItemInactiveOpacity");
|
||||
PropertyField("m_SelectedMode");
|
||||
PropertyField("m_Orient");
|
||||
PropertyField("m_Location");
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace XCharts.Editor
|
||||
PropertyField(prop, "m_Name");
|
||||
switch (type)
|
||||
{
|
||||
case MarkLineType.None:
|
||||
case MarkLineType.Custom:
|
||||
PropertyField(prop, "m_XPosition");
|
||||
PropertyField(prop, "m_YPosition");
|
||||
PropertyField(prop, "m_XValue");
|
||||
@@ -48,7 +48,7 @@ namespace XCharts.Editor
|
||||
break;
|
||||
}
|
||||
PropertyField(prop, "m_Group");
|
||||
if (group > 0 && type == MarkLineType.None) PropertyField(prop, "m_ZeroPosition");
|
||||
if (group > 0 && type == MarkLineType.Custom) PropertyField(prop, "m_ZeroPosition");
|
||||
PropertyField(prop, "m_LineStyle");
|
||||
PropertyField(prop, "m_StartSymbol");
|
||||
PropertyField(prop, "m_EndSymbol");
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace XCharts.Editor
|
||||
++EditorGUI.indentLevel;
|
||||
PropertyField("m_Type");
|
||||
PropertyField("m_Trigger");
|
||||
PropertyField("m_TriggerOn");
|
||||
PropertyField("m_Position");
|
||||
PropertyField("m_FixedX");
|
||||
PropertyField("m_FixedY");
|
||||
@@ -40,6 +41,7 @@ namespace XCharts.Editor
|
||||
});
|
||||
PropertyField("m_LineStyle");
|
||||
PropertyField("m_TitleLabelStyle");
|
||||
PropertyListField("m_ColumnGapWidths");
|
||||
PropertyListField("m_ContentLabelStyles");
|
||||
--EditorGUI.indentLevel;
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
if (GUILayout.Button(Styles.btnSaveAsImage))
|
||||
{
|
||||
m_UIComponent.SaveAsImage();
|
||||
m_UIComponent.SaveAsImage("png", "", 4f);
|
||||
}
|
||||
OnDebugEndInspectorGUI();
|
||||
}
|
||||
|
||||
@@ -22,6 +22,12 @@ namespace XCharts.Editor
|
||||
PropertyField("m_BarWidth");
|
||||
PropertyField("m_BarGap");
|
||||
PropertyField("m_BarMaxWidth");
|
||||
PropertyField("m_IgnoreZeroOccupy");
|
||||
PropertyField("m_RealtimeSort");
|
||||
if(serie.useSortData)
|
||||
{
|
||||
PropertyField("m_DataSortType");
|
||||
}
|
||||
if (serie.IsUseCoord<PolarCoord>())
|
||||
{
|
||||
PropertyField("m_RoundCap");
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace XCharts.Editor
|
||||
public override void OnCustomInspectorGUI()
|
||||
{
|
||||
PropertyField("m_GridIndex");
|
||||
PropertyField("m_PieType");
|
||||
PropertyField("m_RoseType");
|
||||
PropertyField("m_Gap");
|
||||
PropertyTwoFiled("m_Center");
|
||||
|
||||
@@ -16,6 +16,7 @@ namespace XCharts.Editor
|
||||
PropertyField("m_RoundCap");
|
||||
PropertyField("m_Clockwise");
|
||||
PropertyField("m_AvoidLabelOverlap");
|
||||
PropertyField("m_RadiusGradient");
|
||||
|
||||
PropertyField("m_ItemStyle");
|
||||
PropertyField("m_Animation");
|
||||
|
||||
@@ -18,6 +18,8 @@ namespace XCharts.Editor
|
||||
}
|
||||
PropertyField("m_MaxCache");
|
||||
PropertyField("m_Clip");
|
||||
PropertyField("m_Ignore");
|
||||
PropertyField("m_IgnoreValue");
|
||||
|
||||
PropertyField("m_Symbol");
|
||||
PropertyField("m_ItemStyle");
|
||||
|
||||
@@ -9,8 +9,8 @@ namespace XCharts.Editor
|
||||
{
|
||||
public class SerieBaseEditor
|
||||
{
|
||||
internal BaseChart chart { get; private set; }
|
||||
internal Serie serie { get; private set; }
|
||||
public BaseChart chart { get; private set; }
|
||||
public Serie serie { get; private set; }
|
||||
|
||||
//Editor m_Inspector;
|
||||
internal SerializedProperty baseProperty;
|
||||
|
||||
@@ -53,14 +53,18 @@ namespace XCharts.Editor
|
||||
}
|
||||
}
|
||||
|
||||
private HeaderMenuInfo headMenuInfo = new HeaderMenuInfo("Import ECharts Data", null);
|
||||
|
||||
private void HeadMenuInfoCallback()
|
||||
{
|
||||
PraseExternalDataEditor.UpdateData(chart, serie, null, false);
|
||||
PraseExternalDataEditor.ShowWindow();
|
||||
}
|
||||
|
||||
private void PropertyFieldData()
|
||||
{
|
||||
m_DataFoldout = ChartEditorHelper.DrawHeader("Data", m_DataFoldout, false, null, null,
|
||||
new HeaderMenuInfo("Import ECharts Data", () =>
|
||||
{
|
||||
PraseExternalDataEditor.UpdateData(chart, serie, null, false);
|
||||
PraseExternalDataEditor.ShowWindow();
|
||||
}));
|
||||
headMenuInfo.action = HeadMenuInfoCallback;
|
||||
m_DataFoldout = ChartEditorHelper.DrawHeader("Data", m_DataFoldout, false, null, null, headMenuInfo);
|
||||
if (!m_DataFoldout) return;
|
||||
EditorGUI.indentLevel++;
|
||||
var m_Datas = FindProperty("m_Data");
|
||||
@@ -103,14 +107,18 @@ namespace XCharts.Editor
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
private HeaderMenuInfo linkHeadMenuInfo = new HeaderMenuInfo("Import ECharts Link", null);
|
||||
|
||||
private void LinkHeadMenuInfoCallback()
|
||||
{
|
||||
PraseExternalDataEditor.UpdateData(chart, serie, null, false);
|
||||
PraseExternalDataEditor.ShowWindow();
|
||||
}
|
||||
|
||||
protected void PropertyFieldLinks()
|
||||
{
|
||||
m_LinksFoldout = ChartEditorHelper.DrawHeader("Links", m_LinksFoldout, false, null, null,
|
||||
new HeaderMenuInfo("Import ECharts Link", () =>
|
||||
{
|
||||
//PraseExternalDataEditor.UpdateData(chart, serie, null, true);
|
||||
//PraseExternalDataEditor.ShowWindow();
|
||||
}));
|
||||
linkHeadMenuInfo.action = LinkHeadMenuInfoCallback;
|
||||
m_LinksFoldout = ChartEditorHelper.DrawHeader("Links", m_LinksFoldout, false, null, null, linkHeadMenuInfo);
|
||||
if (!m_LinksFoldout) return;
|
||||
EditorGUI.indentLevel++;
|
||||
var m_Links = FindProperty("m_Links");
|
||||
@@ -154,6 +162,84 @@ namespace XCharts.Editor
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawSerieDataHeader(Rect drawRect, HeaderCallbackContext context)
|
||||
{
|
||||
var serieData = context.serieData;
|
||||
var fieldCount = context.fieldCount;
|
||||
var showName = context.showName;
|
||||
var index = context.index;
|
||||
var dimension = context.dimension;
|
||||
|
||||
//drawRect.width -= 2f;
|
||||
var maxX = drawRect.xMax;
|
||||
var currentWidth = drawRect.width;
|
||||
var lastX = drawRect.x;
|
||||
var lastWid = drawRect.width;
|
||||
var lastFieldWid = EditorGUIUtility.fieldWidth;
|
||||
var lastLabelWid = EditorGUIUtility.labelWidth;
|
||||
var sereName = serieData.FindPropertyRelative("m_Name");
|
||||
var data = serieData.FindPropertyRelative("m_Data");
|
||||
#if UNITY_2019_3_OR_NEWER
|
||||
var gap = 2;
|
||||
var namegap = 3;
|
||||
var buttomLength = 30;
|
||||
#else
|
||||
var gap = 0;
|
||||
var namegap = 0;
|
||||
var buttomLength = 30;
|
||||
#endif
|
||||
if (showName)
|
||||
{
|
||||
buttomLength += 12;
|
||||
}
|
||||
if (fieldCount <= 1)
|
||||
{
|
||||
while (2 > data.arraySize)
|
||||
{
|
||||
var value = data.arraySize == 0 ? index : 0;
|
||||
data.arraySize++;
|
||||
data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
|
||||
}
|
||||
SerializedProperty element = data.GetArrayElementAtIndex(1);
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
|
||||
drawRect.x = startX;
|
||||
drawRect.xMax = maxX - buttomLength;
|
||||
EditorGUI.PropertyField(drawRect, element, GUIContent.none);
|
||||
}
|
||||
else
|
||||
{
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
|
||||
var dataWidTotal = currentWidth - (startX + 20.5f + 1) - buttomLength;
|
||||
var dataWid = dataWidTotal / fieldCount;
|
||||
var xWid = dataWid - 0;
|
||||
for (int i = 0; i < dimension; i++)
|
||||
{
|
||||
var dataCount = i < 1 ? 2 : i + 1;
|
||||
while (dataCount > data.arraySize)
|
||||
{
|
||||
var value = data.arraySize == 0 ? index : 0;
|
||||
data.arraySize++;
|
||||
data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
|
||||
}
|
||||
drawRect.x = startX + i * xWid;
|
||||
drawRect.width = dataWid + 25;
|
||||
SerializedProperty element = data.GetArrayElementAtIndex(dimension <= 1 ? 1 : i);
|
||||
EditorGUI.PropertyField(drawRect, element, GUIContent.none);
|
||||
}
|
||||
if (showName)
|
||||
{
|
||||
drawRect.x = startX + (fieldCount - 1) * xWid;
|
||||
drawRect.width = dataWid + 40 + dimension * namegap - 2.5f;
|
||||
EditorGUI.PropertyField(drawRect, sereName, GUIContent.none);
|
||||
}
|
||||
drawRect.x = lastX;
|
||||
drawRect.width = lastWid;
|
||||
ChartEditorHelper.UpDownAddDeleteButton(drawRect, context.listProp, index);
|
||||
EditorGUIUtility.fieldWidth = lastFieldWid;
|
||||
EditorGUIUtility.labelWidth = lastLabelWid;
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawSerieData(int dimension, SerializedProperty m_Datas, int index, bool showName)
|
||||
{
|
||||
bool flag;
|
||||
@@ -165,70 +251,16 @@ namespace XCharts.Editor
|
||||
var fieldCount = dimension + (showName ? 1 : 0);
|
||||
var serieData = m_Datas.GetArrayElementAtIndex(index);
|
||||
var dataIndex = serieData.FindPropertyRelative("m_Index").intValue;
|
||||
m_DataElementFoldout[index] = ChartEditorHelper.DrawHeader("SerieData " + dataIndex, flag, false, null,
|
||||
delegate (Rect drawRect)
|
||||
{
|
||||
//drawRect.width -= 2f;
|
||||
var maxX = drawRect.xMax;
|
||||
var currentWidth = drawRect.width;
|
||||
var lastX = drawRect.x;
|
||||
var lastWid = drawRect.width;
|
||||
var lastFieldWid = EditorGUIUtility.fieldWidth;
|
||||
var lastLabelWid = EditorGUIUtility.labelWidth;
|
||||
//var serieData = m_Datas.GetArrayElementAtIndex(index);
|
||||
var sereName = serieData.FindPropertyRelative("m_Name");
|
||||
var data = serieData.FindPropertyRelative("m_Data");
|
||||
#if UNITY_2019_3_OR_NEWER
|
||||
var gap = 2;
|
||||
var namegap = 3;
|
||||
#else
|
||||
var gap = 0;
|
||||
var namegap = 0;
|
||||
#endif
|
||||
if (fieldCount <= 1)
|
||||
{
|
||||
while (2 > data.arraySize)
|
||||
{
|
||||
var value = data.arraySize == 0 ? index : 0;
|
||||
data.arraySize++;
|
||||
data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
|
||||
}
|
||||
SerializedProperty element = data.GetArrayElementAtIndex(1);
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
|
||||
drawRect.x = startX;
|
||||
drawRect.xMax = maxX;
|
||||
EditorGUI.PropertyField(drawRect, element, GUIContent.none);
|
||||
}
|
||||
else
|
||||
{
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * 15 + gap;
|
||||
var dataWidTotal = (currentWidth - (startX + 20.5f + 1));
|
||||
var dataWid = dataWidTotal / fieldCount;
|
||||
var xWid = dataWid - 0;
|
||||
for (int i = 0; i < dimension; i++)
|
||||
{
|
||||
var dataCount = i < 1 ? 2 : i + 1;
|
||||
while (dataCount > data.arraySize)
|
||||
{
|
||||
var value = data.arraySize == 0 ? index : 0;
|
||||
data.arraySize++;
|
||||
data.GetArrayElementAtIndex(data.arraySize - 1).floatValue = value;
|
||||
}
|
||||
drawRect.x = startX + i * xWid;
|
||||
drawRect.width = dataWid + 25;
|
||||
SerializedProperty element = data.GetArrayElementAtIndex(dimension <= 1 ? 1 : i);
|
||||
EditorGUI.PropertyField(drawRect, element, GUIContent.none);
|
||||
}
|
||||
if (showName)
|
||||
{
|
||||
drawRect.x = startX + (fieldCount - 1) * xWid;
|
||||
drawRect.width = dataWid + 40 + dimension * namegap - 2.5f;
|
||||
EditorGUI.PropertyField(drawRect, sereName, GUIContent.none);
|
||||
}
|
||||
EditorGUIUtility.fieldWidth = lastFieldWid;
|
||||
EditorGUIUtility.labelWidth = lastLabelWid;
|
||||
}
|
||||
});
|
||||
var callbackContext = new HeaderCallbackContext()
|
||||
{
|
||||
serieData = serieData,
|
||||
fieldCount = fieldCount,
|
||||
showName = showName,
|
||||
index = index,
|
||||
dimension = dimension,
|
||||
listProp = m_Datas
|
||||
};
|
||||
m_DataElementFoldout[index] = ChartEditorHelper.DrawSerieDataHeader("SerieData " + dataIndex, flag, false, null, callbackContext, DrawSerieDataHeader);
|
||||
if (m_DataElementFoldout[index])
|
||||
{
|
||||
if (!(serie is ISimplifiedSerie))
|
||||
@@ -306,7 +338,10 @@ namespace XCharts.Editor
|
||||
var sourceIndex = dataLink.FindPropertyRelative("m_Source");
|
||||
var targetIndex = dataLink.FindPropertyRelative("m_Target");
|
||||
var value = dataLink.FindPropertyRelative("m_Value");
|
||||
ChartEditorHelper.MakeThreeField(ref drawRect, drawRect.width, sourceIndex, targetIndex, value, "");
|
||||
var hig = ChartEditorHelper.MakeThreeField(ref drawRect, drawRect.width, sourceIndex, targetIndex, value, "");
|
||||
var btnRect = drawRect;
|
||||
btnRect.y -= hig;
|
||||
ChartEditorHelper.UpDownAddDeleteButton(btnRect, m_Datas, index);
|
||||
});
|
||||
if (m_LinksElementFoldout[index])
|
||||
{
|
||||
|
||||
@@ -6,6 +6,16 @@ using XCharts.Runtime;
|
||||
|
||||
namespace XCharts.Editor
|
||||
{
|
||||
public class HeaderCallbackContext
|
||||
{
|
||||
public int fieldCount = 0;
|
||||
public SerializedProperty serieData;
|
||||
public bool showName;
|
||||
public int index;
|
||||
public int dimension;
|
||||
public SerializedProperty listProp;
|
||||
}
|
||||
|
||||
public class HeaderMenuInfo
|
||||
{
|
||||
public string name;
|
||||
@@ -43,6 +53,8 @@ namespace XCharts.Editor
|
||||
public const float GAP_WIDTH = 0;
|
||||
public const float DIFF_WIDTH = 1;
|
||||
#endif
|
||||
public const float ICON_WIDHT = 10;
|
||||
public const float ICON_GAP = 0;
|
||||
static Dictionary<string, GUIContent> s_GUIContentCache;
|
||||
|
||||
static ChartEditorHelper()
|
||||
@@ -96,31 +108,33 @@ namespace XCharts.Editor
|
||||
{
|
||||
EditorGUI.LabelField(drawRect, name);
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * INDENT_WIDTH + GAP_WIDTH;
|
||||
var diff = 13 + EditorGUI.indentLevel * 14;
|
||||
var diff = 12 + EditorGUI.indentLevel * 14;
|
||||
var offset = diff - INDENT_WIDTH;
|
||||
var tempWidth = (rectWidth - startX + diff) / 2;
|
||||
var centerXRect = new Rect(startX, drawRect.y, tempWidth, drawRect.height - 1);
|
||||
var centerYRect = new Rect(centerXRect.x + tempWidth - offset, drawRect.y, tempWidth - 1, drawRect.height - 1);
|
||||
var centerYRect = new Rect(centerXRect.x + tempWidth - offset + 3.4f, drawRect.y, tempWidth - 1, drawRect.height - 1);
|
||||
EditorGUI.PropertyField(centerXRect, prop1, GUIContent.none);
|
||||
EditorGUI.PropertyField(centerYRect, prop2, GUIContent.none);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
}
|
||||
|
||||
public static void MakeThreeField(ref Rect drawRect, float rectWidth, SerializedProperty prop1,
|
||||
SerializedProperty prop2, SerializedProperty prop3, string name)
|
||||
public static float MakeThreeField(ref Rect drawRect, float rectWidth, SerializedProperty prop1,
|
||||
SerializedProperty prop2, SerializedProperty prop3, string name, bool btnSpacing = true)
|
||||
{
|
||||
EditorGUI.LabelField(drawRect, name);
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * INDENT_WIDTH + GAP_WIDTH;
|
||||
var diff = 13 + EditorGUI.indentLevel * 14;
|
||||
var diff = 13f + EditorGUI.indentLevel * 14;
|
||||
var offset = diff - INDENT_WIDTH;
|
||||
var tempWidth = (rectWidth - startX + diff) / 3;
|
||||
var tempWidth = (rectWidth - startX + diff - (btnSpacing ? (ICON_WIDHT + ICON_GAP) * 4 : 0)) / 3 + 8.5f;
|
||||
var centerXRect = new Rect(startX, drawRect.y, tempWidth, drawRect.height - 1);
|
||||
var centerYRect = new Rect(centerXRect.x + tempWidth - offset, drawRect.y, tempWidth - 1, drawRect.height - 1);
|
||||
var centerZRect = new Rect(centerYRect.x + tempWidth - offset, drawRect.y, tempWidth - 1, drawRect.height - 1);
|
||||
EditorGUI.PropertyField(centerXRect, prop1, GUIContent.none);
|
||||
EditorGUI.PropertyField(centerYRect, prop2, GUIContent.none);
|
||||
EditorGUI.PropertyField(centerZRect, prop3, GUIContent.none);
|
||||
drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
var hig = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||||
drawRect.y += hig;
|
||||
return hig;
|
||||
}
|
||||
|
||||
public static void MakeVector2(ref Rect drawRect, float rectWidth, SerializedProperty prop, string name)
|
||||
@@ -312,7 +326,13 @@ namespace XCharts.Editor
|
||||
var foldoutRect = drawRect;
|
||||
foldoutRect.xMax -= 10;
|
||||
bool flag = EditorGUI.Foldout(foldoutRect, foldout, listProp.displayName, true);
|
||||
ChartEditorHelper.DrawMenu(drawRect, menus);
|
||||
if (!flag)
|
||||
{
|
||||
var startX = drawRect.x + EditorGUIUtility.labelWidth - EditorGUI.indentLevel * INDENT_WIDTH + GAP_WIDTH;
|
||||
var sizeRect = new Rect(startX, drawRect.y + 1f, (EditorGUI.indentLevel + 1) * 15, drawRect.height - 1);
|
||||
EditorGUI.IntField(sizeRect, GUIContent.none, listProp.arraySize);
|
||||
DrawMenu(drawRect, menus);
|
||||
}
|
||||
height += headerHeight;
|
||||
drawRect.y += headerHeight;
|
||||
drawRect.width = rawWidth;
|
||||
@@ -335,15 +355,12 @@ namespace XCharts.Editor
|
||||
{
|
||||
EditorGUI.indentLevel++;
|
||||
var listSize = listProp.arraySize;
|
||||
var iconWidth = 10;
|
||||
var iconGap = 0f;
|
||||
|
||||
if (showSize)
|
||||
{
|
||||
var headerHeight = DrawSplitterAndBackground(drawRect);
|
||||
if (showOrder)
|
||||
{
|
||||
var elementRect = new Rect(drawRect.x, drawRect.y, drawRect.width - iconWidth + 2, drawRect.height);
|
||||
var elementRect = new Rect(drawRect.x, drawRect.y, drawRect.width - ICON_WIDHT + 2, drawRect.height);
|
||||
var oldColor = GUI.contentColor;
|
||||
GUI.contentColor = Color.black;
|
||||
GUI.contentColor = oldColor;
|
||||
@@ -396,40 +413,14 @@ namespace XCharts.Editor
|
||||
DrawSplitterAndBackground(drawRect);
|
||||
if (showOrder)
|
||||
{
|
||||
var temp = INDENT_WIDTH + GAP_WIDTH + iconGap;
|
||||
var isSerie = "Serie".Equals(element.type);
|
||||
var elementRect = isSerie ?
|
||||
new Rect(drawRect.x, drawRect.y, drawRect.width + INDENT_WIDTH - 2 * iconGap, drawRect.height) :
|
||||
new Rect(drawRect.x, drawRect.y, drawRect.width - 4 * iconWidth, drawRect.height);
|
||||
new Rect(drawRect.x, drawRect.y, drawRect.width + INDENT_WIDTH - 2 * ICON_GAP, drawRect.height) :
|
||||
new Rect(drawRect.x, drawRect.y, drawRect.width - 4 * ICON_WIDHT, drawRect.height);
|
||||
EditorGUI.PropertyField(elementRect, element, new GUIContent("Element " + i));
|
||||
var iconRect = new Rect(drawRect.width - 4 * iconWidth + temp, drawRect.y, iconWidth, drawRect.height);
|
||||
var oldColor = GUI.contentColor;
|
||||
GUI.contentColor = Color.black;
|
||||
if (GUI.Button(iconRect, EditorCustomStyles.iconUp, EditorCustomStyles.invisibleButton))
|
||||
{
|
||||
if (i > 0) listProp.MoveArrayElement(i, i - 1);
|
||||
}
|
||||
iconRect = new Rect(drawRect.width - 3 * iconWidth + temp, drawRect.y, iconWidth, drawRect.height);
|
||||
if (GUI.Button(iconRect, EditorCustomStyles.iconDown, EditorCustomStyles.invisibleButton))
|
||||
{
|
||||
if (i < listProp.arraySize - 1) listProp.MoveArrayElement(i, i + 1);
|
||||
}
|
||||
iconRect = new Rect(drawRect.width - 2 * iconWidth + temp, drawRect.y, iconWidth, drawRect.height);
|
||||
if (GUI.Button(iconRect, EditorCustomStyles.iconAdd, EditorCustomStyles.invisibleButton))
|
||||
{
|
||||
if (i < listProp.arraySize && i >= 0) listProp.InsertArrayElementAtIndex(i);
|
||||
}
|
||||
iconRect = new Rect(drawRect.width - iconWidth + temp, drawRect.y, iconWidth, drawRect.height);
|
||||
if (GUI.Button(iconRect, EditorCustomStyles.iconRemove, EditorCustomStyles.invisibleButton))
|
||||
{
|
||||
if (i < listProp.arraySize && i >= 0) listProp.DeleteArrayElementAtIndex(i);
|
||||
}
|
||||
else
|
||||
{
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(element);
|
||||
height += EditorGUI.GetPropertyHeight(element);
|
||||
}
|
||||
GUI.contentColor = oldColor;
|
||||
UpDownAddDeleteButton(drawRect, listProp, i);
|
||||
drawRect.y += EditorGUI.GetPropertyHeight(element);
|
||||
height += EditorGUI.GetPropertyHeight(element);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -442,6 +433,34 @@ namespace XCharts.Editor
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
|
||||
public static void UpDownAddDeleteButton(Rect drawRect, SerializedProperty listProp, int i)
|
||||
{
|
||||
var temp = INDENT_WIDTH + GAP_WIDTH + ICON_GAP;
|
||||
var iconRect = new Rect(drawRect.width - 4 * ICON_WIDHT + temp, drawRect.y, ICON_WIDHT, drawRect.height);
|
||||
var oldColor = GUI.contentColor;
|
||||
GUI.contentColor = Color.black;
|
||||
if (GUI.Button(iconRect, EditorCustomStyles.iconUp, EditorCustomStyles.invisibleButton))
|
||||
{
|
||||
if (i > 0) listProp.MoveArrayElement(i, i - 1);
|
||||
}
|
||||
iconRect = new Rect(drawRect.width - 3 * ICON_WIDHT + temp, drawRect.y, ICON_WIDHT, drawRect.height);
|
||||
if (GUI.Button(iconRect, EditorCustomStyles.iconDown, EditorCustomStyles.invisibleButton))
|
||||
{
|
||||
if (i < listProp.arraySize - 1) listProp.MoveArrayElement(i, i + 1);
|
||||
}
|
||||
iconRect = new Rect(drawRect.width - 2 * ICON_WIDHT + temp, drawRect.y, ICON_WIDHT, drawRect.height);
|
||||
if (GUI.Button(iconRect, EditorCustomStyles.iconAdd, EditorCustomStyles.invisibleButton))
|
||||
{
|
||||
if (i < listProp.arraySize && i >= 0) listProp.InsertArrayElementAtIndex(i);
|
||||
}
|
||||
iconRect = new Rect(drawRect.width - ICON_WIDHT + temp, drawRect.y, ICON_WIDHT, drawRect.height);
|
||||
if (GUI.Button(iconRect, EditorCustomStyles.iconRemove, EditorCustomStyles.invisibleButton))
|
||||
{
|
||||
if (i < listProp.arraySize && i >= 0) listProp.DeleteArrayElementAtIndex(i);
|
||||
}
|
||||
GUI.contentColor = oldColor;
|
||||
}
|
||||
|
||||
public static bool PropertyField(ref Rect drawRect, Dictionary<string, float> heights, string key,
|
||||
SerializedProperty prop)
|
||||
{
|
||||
@@ -586,6 +605,31 @@ namespace XCharts.Editor
|
||||
return state;
|
||||
}
|
||||
|
||||
public static bool DrawSerieDataHeader(string title, bool state, bool drawBackground, SerializedProperty activeField,
|
||||
HeaderCallbackContext context, Action<Rect, HeaderCallbackContext> drawCallback, params HeaderMenuInfo[] menus)
|
||||
{
|
||||
var rect = GUILayoutUtility.GetRect(1f, HEADER_HEIGHT);
|
||||
var labelRect = DrawHeaderInternal(rect, title, ref state, drawBackground, activeField);
|
||||
DrawMenu(rect, menus);
|
||||
if (drawCallback != null)
|
||||
{
|
||||
drawCallback(rect, context);
|
||||
}
|
||||
var e = Event.current;
|
||||
if (e.type == EventType.MouseDown)
|
||||
{
|
||||
if (labelRect.Contains(e.mousePosition))
|
||||
{
|
||||
if (e.button == 0)
|
||||
{
|
||||
state = !state;
|
||||
e.Use();
|
||||
}
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
internal static bool DrawHeader(string title, bool state, bool drawBackground, SerializedProperty activeField,
|
||||
Action<Rect> drawCallback, List<HeaderMenuInfo> menus)
|
||||
{
|
||||
|
||||
@@ -8,6 +8,8 @@ namespace XCharts.Editor
|
||||
{
|
||||
public class PraseExternalDataEditor : UnityEditor.EditorWindow
|
||||
{
|
||||
[SerializeField] private int m_DataDimension = 1;
|
||||
[SerializeField] private double m_DefaultYValue = 0;
|
||||
private static BaseChart s_Chart;
|
||||
private static Serie s_Serie;
|
||||
private static Axis s_Axis;
|
||||
@@ -46,8 +48,13 @@ namespace XCharts.Editor
|
||||
return;
|
||||
}
|
||||
EditorGUILayout.LabelField("Input external data (echarts data):");
|
||||
m_DataDimension = EditorGUILayout.IntField("Data Dimension", m_DataDimension);
|
||||
if (m_DataDimension < 1)
|
||||
m_DataDimension = 1;
|
||||
else if (m_DataDimension == 2)
|
||||
m_DefaultYValue = EditorGUILayout.DoubleField("Default Y Value", m_DefaultYValue);
|
||||
inputJsonText = EditorGUILayout.TextArea(inputJsonText, GUILayout.Height(400));
|
||||
if (GUILayout.Button("Add"))
|
||||
if (GUILayout.Button("Try Add"))
|
||||
{
|
||||
if (s_Serie != null)
|
||||
{
|
||||
@@ -76,7 +83,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
}
|
||||
|
||||
private static bool ParseArrayData(Axis axis, string arrayData)
|
||||
private bool ParseArrayData(Axis axis, string arrayData)
|
||||
{
|
||||
arrayData = arrayData.Trim();
|
||||
if (!arrayData.StartsWith("data: Array")) return false;
|
||||
@@ -95,7 +102,7 @@ namespace XCharts.Editor
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool ParseArrayData(Serie serie, string arrayData)
|
||||
private bool ParseArrayData(Serie serie, string arrayData)
|
||||
{
|
||||
arrayData = arrayData.Trim();
|
||||
if (!arrayData.StartsWith("data: Array")) return false;
|
||||
@@ -120,7 +127,7 @@ namespace XCharts.Editor
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool ParseJsonData(Axis axis, string jsonData)
|
||||
private bool ParseJsonData(Axis axis, string jsonData)
|
||||
{
|
||||
if (!CheckJsonData(ref jsonData)) return false;
|
||||
axis.data.Clear();
|
||||
@@ -140,7 +147,7 @@ namespace XCharts.Editor
|
||||
/// 从json中导入数据
|
||||
/// </summary>
|
||||
/// <param name="jsonData"></param>
|
||||
private static bool ParseJsonData(Serie serie, string jsonData)
|
||||
private bool ParseJsonData(Serie serie, string jsonData)
|
||||
{
|
||||
if (!CheckJsonData(ref jsonData)) return false;
|
||||
if (s_LinksData) serie.ClearLinks();
|
||||
@@ -156,7 +163,10 @@ namespace XCharts.Editor
|
||||
if (data.Length == 2 && !double.TryParse(data[0], out value))
|
||||
{
|
||||
double.TryParse(data[1], out value);
|
||||
serieData.data = new List<double>() { i, value };
|
||||
if (m_DataDimension == 2)
|
||||
serieData.data = new List<double>() { i, m_DefaultYValue, value };
|
||||
else
|
||||
serieData.data = new List<double>() { i, value };
|
||||
serieData.name = data[0].Replace("\"", "").Trim();
|
||||
}
|
||||
else
|
||||
@@ -187,7 +197,10 @@ namespace XCharts.Editor
|
||||
if (a.StartsWith("value:"))
|
||||
{
|
||||
double value = double.Parse(a.Substring(6, a.Length - 6));
|
||||
serieData.data = new List<double>() { i, value };
|
||||
if (m_DataDimension == 2)
|
||||
serieData.data = new List<double>() { i, m_DefaultYValue, value };
|
||||
else
|
||||
serieData.data = new List<double>() { i, value };
|
||||
}
|
||||
else if (a.StartsWith("name:"))
|
||||
{
|
||||
@@ -213,7 +226,10 @@ namespace XCharts.Editor
|
||||
if (flag)
|
||||
{
|
||||
var serieData = new SerieData();
|
||||
serieData.data = new List<double>() { i, value };
|
||||
if (m_DataDimension == 2)
|
||||
serieData.data = new List<double>() { i, m_DefaultYValue, value };
|
||||
else
|
||||
serieData.data = new List<double>() { i, value };
|
||||
serie.AddSerieData(serieData);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,14 +14,14 @@ namespace XCharts.Editor
|
||||
public partial class XChartsEditor
|
||||
{
|
||||
[MenuItem("XCharts/BarChart/Baisc Column", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Baisc Column", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Baisc Column", priority = 45)]
|
||||
public static void AddBarChart()
|
||||
{
|
||||
AddChart<BarChart>("BarChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Zebra Column", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Zebra Column", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Zebra Column", priority = 45)]
|
||||
public static void AddBarChart_ZebraColumn()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Zebra Column");
|
||||
@@ -29,7 +29,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Capsule Column", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Capsule Column", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Capsule Column", priority = 45)]
|
||||
public static void AddBarChart_CapsuleColumn()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Capsule Column");
|
||||
@@ -37,7 +37,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Grouped Column", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Grouped Column", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Grouped Column", priority = 45)]
|
||||
public static void AddBarChart_GroupedColumn()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Grouped Column");
|
||||
@@ -45,7 +45,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Stacked Column", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Stacked Column", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Stacked Column", priority = 45)]
|
||||
public static void AddBarChart_StackedColumn()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Stacked Column");
|
||||
@@ -53,7 +53,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Percent Column", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Percent Column", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Percent Column", priority = 45)]
|
||||
public static void AddBarChart_PercentColumn()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Percent Column");
|
||||
@@ -61,7 +61,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Baisc Bar", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Baisc Bar", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Baisc Bar", priority = 45)]
|
||||
public static void AddBarChart_BasicBar()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart");
|
||||
@@ -69,7 +69,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Zebra Bar", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Zebra Bar", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Zebra Bar", priority = 45)]
|
||||
public static void AddBarChart_ZebraBar()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Zebra Bar");
|
||||
@@ -77,7 +77,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Capsule Bar", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Capsule Bar", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Capsule Bar", priority = 45)]
|
||||
public static void AddBarChart_CapsuleBar()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Capsule Bar");
|
||||
@@ -85,7 +85,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Grouped Bar", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Grouped Bar", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Grouped Bar", priority = 45)]
|
||||
public static void AddBarChart_GroupedBar()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Grouped Bar");
|
||||
@@ -93,7 +93,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Stacked Bar", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Stacked Bar", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Stacked Bar", priority = 45)]
|
||||
public static void AddBarChart_StackedBar()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Stacked Bar");
|
||||
@@ -101,7 +101,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/BarChart/Percent Bar", priority = 45)]
|
||||
[MenuItem("GameObject/XCharts/BarChart/Percent Bar", priority = 45)]
|
||||
[MenuItem("GameObject/UI/XCharts/BarChart/Percent Bar", priority = 45)]
|
||||
public static void AddBarChart_PercentBar()
|
||||
{
|
||||
var chart = AddChart<BarChart>("BarChart", "Percent Bar");
|
||||
|
||||
@@ -14,14 +14,14 @@ namespace XCharts.Editor
|
||||
public partial class XChartsEditor
|
||||
{
|
||||
[MenuItem("XCharts/LineChart/Basic Line", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Basic Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Basic Line", priority = 44)]
|
||||
public static void AddLineChart()
|
||||
{
|
||||
AddChart<LineChart>("LineChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/LineChart/Area Line", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Area Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Area Line", priority = 44)]
|
||||
public static void AddLineChart_Area()
|
||||
{
|
||||
var chart = AddChart<LineChart>("LineChart_Area", "Area Line");
|
||||
@@ -29,7 +29,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/LineChart/Smooth Line", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Smooth Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Smooth Line", priority = 44)]
|
||||
public static void AddLineChart_Smooth()
|
||||
{
|
||||
var chart = AddChart<LineChart>("LineChart_Smooth", "Smooth Line");
|
||||
@@ -37,7 +37,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/LineChart/Smooth Area", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Smooth Area Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Smooth Area Line", priority = 44)]
|
||||
public static void AddLineChart_SmoothArea()
|
||||
{
|
||||
var chart = AddChart<LineChart>("LineChart_SmoothArea", "Smooth Area Line");
|
||||
@@ -45,7 +45,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/LineChart/Stack Line", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Stack Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Stack Line", priority = 44)]
|
||||
public static void AddLineChart_Stack()
|
||||
{
|
||||
var chart = AddChart<LineChart>("LineChart_Stack", "Stack Line");
|
||||
@@ -53,7 +53,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/LineChart/Stack Area Line", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Stack Area Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Stack Area Line", priority = 44)]
|
||||
public static void AddLineChart_StackArea()
|
||||
{
|
||||
var chart = AddChart<LineChart>("LineChart_StackArea", "Stack Area Line");
|
||||
@@ -61,7 +61,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/LineChart/Step Line", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Step Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Step Line", priority = 44)]
|
||||
public static void AddLineChart_Step()
|
||||
{
|
||||
var chart = AddChart<LineChart>("LineChart_Step", "Step Line");
|
||||
@@ -69,7 +69,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/LineChart/Dashed Line", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Dashed Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Dashed Line", priority = 44)]
|
||||
public static void AddLineChart_Dash()
|
||||
{
|
||||
var chart = AddChart<LineChart>("LineChart_Dashed", "Dashed Line");
|
||||
@@ -77,7 +77,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/LineChart/Time Line", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Time Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Time Line", priority = 44)]
|
||||
public static void AddLineChart_Time()
|
||||
{
|
||||
var chart = AddChart<LineChart>("LineChart_Time", "Time Line");
|
||||
@@ -85,7 +85,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/LineChart/Log Line", priority = 44)]
|
||||
[MenuItem("GameObject/XCharts/LineChart/Log Line", priority = 44)]
|
||||
[MenuItem("GameObject/UI/XCharts/LineChart/Log Line", priority = 44)]
|
||||
public static void AddLineChart_Log()
|
||||
{
|
||||
var chart = AddChart<LineChart>("LineChart_Log", "Log Line");
|
||||
|
||||
@@ -14,14 +14,14 @@ namespace XCharts.Editor
|
||||
public partial class XChartsEditor
|
||||
{
|
||||
[MenuItem("XCharts/PieChart/Pie", priority = 46)]
|
||||
[MenuItem("GameObject/XCharts/PieChart/Pie", priority = 46)]
|
||||
[MenuItem("GameObject/UI/XCharts/PieChart/Pie", priority = 46)]
|
||||
public static void AddPieChart()
|
||||
{
|
||||
AddChart<PieChart>("PieChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/PieChart/Pie With Label", priority = 46)]
|
||||
[MenuItem("GameObject/XCharts/PieChart/Pie With Label", priority = 46)]
|
||||
[MenuItem("GameObject/UI/XCharts/PieChart/Pie With Label", priority = 46)]
|
||||
public static void AddPieChart_WithLabel()
|
||||
{
|
||||
var chart = AddChart<PieChart>("PieChart");
|
||||
@@ -29,7 +29,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/PieChart/Donut", priority = 46)]
|
||||
[MenuItem("GameObject/XCharts/PieChart/Donut", priority = 46)]
|
||||
[MenuItem("GameObject/UI/XCharts/PieChart/Donut", priority = 46)]
|
||||
public static void AddPieChart_Donut()
|
||||
{
|
||||
var chart = AddChart<PieChart>("PieChart");
|
||||
@@ -37,7 +37,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/PieChart/Donut With Label", priority = 46)]
|
||||
[MenuItem("GameObject/XCharts/PieChart/Donut With Label", priority = 46)]
|
||||
[MenuItem("GameObject/UI/XCharts/PieChart/Donut With Label", priority = 46)]
|
||||
public static void AddPieChart_DonutWithLabel()
|
||||
{
|
||||
var chart = AddChart<PieChart>("PieChart");
|
||||
@@ -45,7 +45,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/PieChart/Radius Rose", priority = 46)]
|
||||
[MenuItem("GameObject/XCharts/PieChart/Radius Rose", priority = 46)]
|
||||
[MenuItem("GameObject/UI/XCharts/PieChart/Radius Rose", priority = 46)]
|
||||
public static void AddPieChart_RadiusRose()
|
||||
{
|
||||
var chart = AddChart<PieChart>("PieChart");
|
||||
@@ -53,7 +53,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/PieChart/Area Rose", priority = 46)]
|
||||
[MenuItem("GameObject/XCharts/PieChart/Area Rose", priority = 46)]
|
||||
[MenuItem("GameObject/UI/XCharts/PieChart/Area Rose", priority = 46)]
|
||||
public static void AddPieChart_AreaRose()
|
||||
{
|
||||
var chart = AddChart<PieChart>("PieChart");
|
||||
|
||||
@@ -14,14 +14,14 @@ namespace XCharts.Editor
|
||||
public partial class XChartsEditor
|
||||
{
|
||||
[MenuItem("XCharts/PolarChart/Line", priority = 54)]
|
||||
[MenuItem("GameObject/XCharts/PolarChart/Line", priority = 54)]
|
||||
[MenuItem("GameObject/UI/XCharts/PolarChart/Line", priority = 54)]
|
||||
public static void PolarChart()
|
||||
{
|
||||
AddChart<PolarChart>("PolarChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/PolarChart/Radial Bar", priority = 54)]
|
||||
[MenuItem("GameObject/XCharts/PolarChart/Radial Bar", priority = 54)]
|
||||
[MenuItem("GameObject/UI/XCharts/PolarChart/Radial Bar", priority = 54)]
|
||||
public static void PolarChart_RadialBar()
|
||||
{
|
||||
var chart = AddChart<PolarChart>("PolarChart");
|
||||
@@ -29,7 +29,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/PolarChart/Tangential Bar", priority = 54)]
|
||||
[MenuItem("GameObject/XCharts/PolarChart/Tangential Bar", priority = 54)]
|
||||
[MenuItem("GameObject/UI/XCharts/PolarChart/Tangential Bar", priority = 54)]
|
||||
public static void PolarChart_TangentialBar()
|
||||
{
|
||||
var chart = AddChart<PolarChart>("PolarChart");
|
||||
@@ -37,7 +37,7 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/PolarChart/Heatmap", priority = 54)]
|
||||
[MenuItem("GameObject/XCharts/PolarChart/Heatmap", priority = 54)]
|
||||
[MenuItem("GameObject/UI/XCharts/PolarChart/Heatmap", priority = 54)]
|
||||
public static void PolarChart_Heatmap()
|
||||
{
|
||||
var chart = AddChart<PolarChart>("PolarChart");
|
||||
|
||||
@@ -19,7 +19,11 @@ namespace XCharts.Editor
|
||||
GameObject selectObj = Selection.activeGameObject;
|
||||
if (selectObj == null)
|
||||
{
|
||||
#if UNITY_2023_1_OR_NEWER
|
||||
var canvas = UnityEngine.Object.FindFirstObjectByType<Canvas>();
|
||||
#else
|
||||
var canvas = GameObject.FindObjectOfType<Canvas>();
|
||||
#endif
|
||||
if (canvas != null) return canvas.transform;
|
||||
else
|
||||
{
|
||||
@@ -96,21 +100,21 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/EmptyChart", priority = 43)]
|
||||
[MenuItem("GameObject/XCharts/EmptyChart", priority = 43)]
|
||||
[MenuItem("GameObject/UI/XCharts/EmptyChart", priority = 43)]
|
||||
public static void AddBaseChart()
|
||||
{
|
||||
AddChart<BaseChart>("EmptyChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/RadarChart/Polygon Radar", priority = 47)]
|
||||
[MenuItem("GameObject/XCharts/RadarChart/Polygon Radar", priority = 47)]
|
||||
[MenuItem("GameObject/UI/XCharts/RadarChart/Polygon Radar", priority = 47)]
|
||||
public static void AddRadarChart()
|
||||
{
|
||||
AddChart<RadarChart>("RadarChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/RadarChart/Cirle Radar", priority = 47)]
|
||||
[MenuItem("GameObject/XCharts/RadarChart/Cirle Radar", priority = 47)]
|
||||
[MenuItem("GameObject/UI/XCharts/RadarChart/Cirle Radar", priority = 47)]
|
||||
public static void AddRadarChart_CirleRadar()
|
||||
{
|
||||
var chart = AddChart<RadarChart>("RadarChart");
|
||||
@@ -118,14 +122,14 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/ScatterChart/Scatter", priority = 48)]
|
||||
[MenuItem("GameObject/XCharts/ScatterChart/Scatter", priority = 48)]
|
||||
[MenuItem("GameObject/UI/XCharts/ScatterChart/Scatter", priority = 48)]
|
||||
public static void AddScatterChart()
|
||||
{
|
||||
AddChart<ScatterChart>("ScatterChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/ScatterChart/Bubble", priority = 48)]
|
||||
[MenuItem("GameObject/XCharts/ScatterChart/Bubble", priority = 48)]
|
||||
[MenuItem("GameObject/UI/XCharts/ScatterChart/Bubble", priority = 48)]
|
||||
public static void AddScatterChart_Bubble()
|
||||
{
|
||||
var chart = AddChart<ScatterChart>("ScatterChart");
|
||||
@@ -133,14 +137,14 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/HeatmapChart/Heatmap", priority = 49)]
|
||||
[MenuItem("GameObject/XCharts/HeatmapChart/Heatmap", priority = 49)]
|
||||
[MenuItem("GameObject/UI/XCharts/HeatmapChart/Heatmap", priority = 49)]
|
||||
public static void AddHeatmapChart()
|
||||
{
|
||||
AddChart<HeatmapChart>("HeatmapChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/HeatmapChart/Count Heatmap", priority = 49)]
|
||||
[MenuItem("GameObject/XCharts/HeatmapChart/Count Heatmap", priority = 49)]
|
||||
[MenuItem("GameObject/UI/XCharts/HeatmapChart/Count Heatmap", priority = 49)]
|
||||
public static void AddHeatmapChart_Count()
|
||||
{
|
||||
var chart = AddChart<HeatmapChart>("HeatmapChart");
|
||||
@@ -148,14 +152,14 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/RingChart/Ring", priority = 51)]
|
||||
[MenuItem("GameObject/XCharts/RingChart/Ring", priority = 51)]
|
||||
[MenuItem("GameObject/UI/XCharts/RingChart/Ring", priority = 51)]
|
||||
public static void AddRingChart()
|
||||
{
|
||||
AddChart<RingChart>("RingChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/RingChart/Multiple Ring", priority = 51)]
|
||||
[MenuItem("GameObject/XCharts/RingChart/Multiple Ring", priority = 51)]
|
||||
[MenuItem("GameObject/UI/XCharts/RingChart/Multiple Ring", priority = 51)]
|
||||
public static void AddRingChart_MultiRing()
|
||||
{
|
||||
var chart = AddChart<RingChart>("RingChart");
|
||||
@@ -163,35 +167,35 @@ namespace XCharts.Editor
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/CandlestickChart/Candlestick", priority = 54)]
|
||||
[MenuItem("GameObject/XCharts/CandlestickChart/Candlestick", priority = 54)]
|
||||
[MenuItem("GameObject/UI/XCharts/CandlestickChart/Candlestick", priority = 54)]
|
||||
public static void CandlestickChart()
|
||||
{
|
||||
AddChart<CandlestickChart>("CandlestickChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/ParallelChart/Parallel", priority = 55)]
|
||||
[MenuItem("GameObject/XCharts/ParallelChart/Parallel", priority = 55)]
|
||||
[MenuItem("GameObject/UI/XCharts/ParallelChart/Parallel", priority = 55)]
|
||||
public static void ParallelChart()
|
||||
{
|
||||
AddChart<ParallelChart>("ParallelChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/SimplifiedChart/Line", priority = 56)]
|
||||
[MenuItem("GameObject/XCharts/SimplifiedChart/Line", priority = 56)]
|
||||
[MenuItem("GameObject/UI/XCharts/SimplifiedChart/Line", priority = 56)]
|
||||
public static void SimplifiedLineChart()
|
||||
{
|
||||
AddChart<SimplifiedLineChart>("SimplifiedLineChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/SimplifiedChart/Bar", priority = 57)]
|
||||
[MenuItem("GameObject/XCharts/SimplifiedChart/Bar", priority = 57)]
|
||||
[MenuItem("GameObject/UI/XCharts/SimplifiedChart/Bar", priority = 57)]
|
||||
public static void SimplifiedBarChart()
|
||||
{
|
||||
AddChart<SimplifiedBarChart>("SimplifiedBarChart");
|
||||
}
|
||||
|
||||
[MenuItem("XCharts/SimplifiedChart/Candlestick", priority = 58)]
|
||||
[MenuItem("GameObject/XCharts/SimplifiedChart/Candlestick", priority = 58)]
|
||||
[MenuItem("GameObject/UI/XCharts/SimplifiedChart/Candlestick", priority = 58)]
|
||||
public static void SimplifiedCandlestickChart()
|
||||
{
|
||||
AddChart<SimplifiedCandlestickChart>("SimplifiedCandlestickChart");
|
||||
|
||||
@@ -17,24 +17,52 @@ namespace XCharts.Example
|
||||
public bool loopUpdate = false;
|
||||
public float loopUpadteTime = 1f;
|
||||
public int maxCache = 0;
|
||||
public bool insertDataToHead = false;
|
||||
|
||||
BaseChart chart;
|
||||
float lastAddTime;
|
||||
float lastUpdateTime;
|
||||
int dataCount;
|
||||
|
||||
int lastMaxCache = 0;
|
||||
bool lastInsertDataToHead = false;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
chart = gameObject.GetComponent<BaseChart>();
|
||||
chart.onInit = () =>
|
||||
{
|
||||
dataCount = chart.GetSerie(0).dataCount;
|
||||
SetMaxCache(maxCache);
|
||||
SetInsertDataToHead(insertDataToHead);
|
||||
lastMaxCache = maxCache;
|
||||
lastInsertDataToHead = insertDataToHead;
|
||||
};
|
||||
}
|
||||
|
||||
void Start()
|
||||
void SetMaxCache(int maxCache)
|
||||
{
|
||||
if (maxCache > 0)
|
||||
chart.SetMaxCache(maxCache);
|
||||
}
|
||||
|
||||
void SetInsertDataToHead(bool insertDataToHead)
|
||||
{
|
||||
foreach (var serie in chart.series)
|
||||
serie.insertDataToHead = insertDataToHead;
|
||||
|
||||
var coms = chart.GetChartComponents<XAxis>();
|
||||
if (coms != null)
|
||||
{
|
||||
chart.SetMaxCache(maxCache);
|
||||
foreach (var com in coms)
|
||||
{
|
||||
var axis = com as XAxis;
|
||||
if (axis.type == Axis.AxisType.Category)
|
||||
{
|
||||
axis.insertDataToHead = insertDataToHead;
|
||||
Debug.LogError("axis:" + axis + "," + insertDataToHead);
|
||||
}
|
||||
}
|
||||
}
|
||||
dataCount = chart.GetSerie(0).dataCount;
|
||||
}
|
||||
|
||||
void Update()
|
||||
@@ -51,6 +79,16 @@ namespace XCharts.Example
|
||||
{
|
||||
chart.ClearData();
|
||||
}
|
||||
if (lastMaxCache != maxCache)
|
||||
{
|
||||
lastMaxCache = maxCache;
|
||||
SetMaxCache(maxCache);
|
||||
}
|
||||
if (lastInsertDataToHead != insertDataToHead)
|
||||
{
|
||||
lastInsertDataToHead = insertDataToHead;
|
||||
SetInsertDataToHead(insertDataToHead);
|
||||
}
|
||||
lastAddTime += Time.deltaTime;
|
||||
if (loopAdd && lastAddTime >= loopAddTime)
|
||||
{
|
||||
@@ -84,14 +122,8 @@ namespace XCharts.Example
|
||||
}
|
||||
else
|
||||
{
|
||||
AddXAxisData();
|
||||
var xAxis = chart.GetChartComponent<XAxis>();
|
||||
if (xAxis != null)
|
||||
{
|
||||
if (xAxis.type == Axis.AxisType.Category)
|
||||
{
|
||||
chart.AddXAxisData("x" + (xAxis.GetAddedDataCount() + 1));
|
||||
}
|
||||
}
|
||||
foreach (var serie in chart.series)
|
||||
{
|
||||
AddSerieRandomData(serie, xAxis);
|
||||
@@ -99,6 +131,19 @@ namespace XCharts.Example
|
||||
}
|
||||
}
|
||||
|
||||
void AddXAxisData()
|
||||
{
|
||||
var xAxes = chart.GetChartComponents<XAxis>();
|
||||
foreach (var com in xAxes)
|
||||
{
|
||||
var xAxis = com as XAxis;
|
||||
if (xAxis.type == Axis.AxisType.Category)
|
||||
{
|
||||
chart.AddXAxisData("x" + (xAxis.GetAddedDataCount() + 1), xAxis.index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateData()
|
||||
{
|
||||
foreach (var serie in chart.series)
|
||||
|
||||
@@ -21,9 +21,9 @@ namespace XCharts.Example
|
||||
}
|
||||
}
|
||||
|
||||
float SymbolSize(List<double> data)
|
||||
float SymbolSize(float defaultSize, SerieData serieData)
|
||||
{
|
||||
return (float) (Math.Sqrt(data[2]) / 6e2);
|
||||
return defaultSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,7 @@ namespace XCharts.Example
|
||||
void AddData()
|
||||
{
|
||||
chart.RemoveData();
|
||||
chart.GetChartComponent<Tooltip>().type = Tooltip.Type.Corss;
|
||||
chart.GetChartComponent<Tooltip>().type = Tooltip.Type.Cross;
|
||||
var angleAxis = chart.GetChartComponent<AngleAxis>();
|
||||
angleAxis.type = Axis.AxisType.Value;
|
||||
angleAxis.minMaxType = Axis.AxisMinMaxType.Custom;
|
||||
|
||||
145
README-en.md
@@ -1,82 +1,71 @@
|
||||
<h2 align="center">XCharts</h2>
|
||||
<p align="center">
|
||||
<a href="">
|
||||
<img src="" alt="" width="" height="">
|
||||
</a>
|
||||
</p>
|
||||
<h2 align="center">XCharts</h3>
|
||||
<p align="center">
|
||||
A powerful, easy-to-use, configurable charting and data visualization library for Unity.
|
||||
<br>
|
||||
Unity数据可视化图表插件。
|
||||
<br>
|
||||
<a href="https://github.com/XCharts-Team/XCharts">中文文档</a>
|
||||
A powerful, easy-to-use, configurable charting and data visualization library for Unity.<br/>Unity数据可视化图表插件。<br/>
|
||||
<a href="https://github.com/XCharts-Team/XCharts">中文文档</a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://github.com/XCharts-Team/XCharts/blob/master/LICENSE">
|
||||
<img src="https://img.shields.io/github/license/XCharts-Team/XCharts">
|
||||
<img src="https://img.shields.io/github/license/XCharts-Team/XCharts"></img>
|
||||
</a>
|
||||
<a href="https://github.com/XCharts-Team/XCharts/releases">
|
||||
<img src="https://img.shields.io/github/v/release/XCharts-Team/XCharts?include_prereleases">
|
||||
<img src="https://img.shields.io/github/v/release/XCharts-Team/XCharts?include_prereleases"></img>
|
||||
</a>
|
||||
<a href="">
|
||||
<img src="https://img.shields.io/github/repo-size/monitor1394/unity-ugui-xcharts">
|
||||
<img src="https://img.shields.io/github/repo-size/monitor1394/unity-ugui-xcharts"></img>
|
||||
</a>
|
||||
<a href="">
|
||||
<img src="https://img.shields.io/github/languages/code-size/monitor1394/unity-ugui-xcharts">
|
||||
<img src="https://img.shields.io/github/languages/code-size/monitor1394/unity-ugui-xcharts"></img>
|
||||
</a>
|
||||
<a href="">
|
||||
<img src="https://img.shields.io/badge/Unity-5.6+-green">
|
||||
<img src="https://img.shields.io/badge/Unity-5.6+-green"></img>
|
||||
</a>
|
||||
<a href="">
|
||||
<img src="https://img.shields.io/badge/TextMeshPro-YES-green">
|
||||
<img src="https://img.shields.io/badge/TextMeshPro-YES-green"></img>
|
||||
</a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="">
|
||||
<img src="https://img.shields.io/github/stars/XCharts-Team/XCharts?style=social">
|
||||
<img src="https://img.shields.io/github/stars/XCharts-Team/XCharts?style=social"></img>
|
||||
</a>
|
||||
<a href="">
|
||||
<img src="https://img.shields.io/github/forks/XCharts-Team/XCharts?style=social">
|
||||
<img src="https://img.shields.io/github/forks/XCharts-Team/XCharts?style=social"></img>
|
||||
</a>
|
||||
<a href="">
|
||||
<img src="https://img.shields.io/github/issues-closed/XCharts-Team/XCharts?color=green&label=%20%20%20%20issues&logoColor=green&style=social">
|
||||
<img src="https://img.shields.io/github/issues-closed/XCharts-Team/XCharts?color=green&label=%20%20%20%20issues&logoColor=green&style=social"></img>
|
||||
</a>
|
||||
</p>
|
||||
|
||||

|
||||
|
||||
A powerful and easy-to-use data visualization library for Unity. It supports more than ten built-in charts, including line, bar, pie, radar, scatter, heatmap, ring, candlestick, polar, parallel coordinates, as well as extended charts such as 3d pie, 3d bar, 3d pyramid, funnel, gauge, liquid, pictorialbar, gantt, and treemap.
|
||||
## Overview
|
||||
|
||||
[XCharts3.0 Homepage](https://xcharts-team.github.io)
|
||||
A powerful and easy-to-use data visualization library for Unity. It supports more than ten built-in charts, including line, bar, pie, radar, scatter, heatmap, ring, candlestick, polar, parallel coordinates, as well as extension charts such as 3d pie, 3d bar, 3d pyramid, funnel, gauge, liquid, pictorialbar, gantt, treemap, sankey, line3d and graph chart.
|
||||
|
||||
[XCharts3.0 Tutorial](Documentation~/en/tutorial01.md)
|
||||
[XCharts3.0 API](Documentation~/en/api.md)
|
||||
[XCharts3.0 FAQ](Documentation~/en/faq.md)
|
||||
[XCharts3.0 Configurate](Documentation~/en/configuration.md)
|
||||
[XCharts3.0 Changelog](Documentation~/en/changelog.md)
|
||||
[XCharts3.0 Support](Documentation~/en/support.md)
|
||||
## Key Features
|
||||
|
||||
## Features
|
||||
- __Pure Code Rendering__: Charts are rendered with pure code, eliminating the need for extra texture or shader resources.
|
||||
- __Visual Configuration__: Configure parameters visually with real-time preview and support for dynamic configuration and data adjustments at runtime.
|
||||
- __High Customizability__: Themes and configuration parameters can be adjusted as needed, with support for custom drawing and callbacks.
|
||||
- __Built-in and Extension Charts__: Supports a variety of chart types, including 3D charts and special chart types like gauges and treemaps.
|
||||
- __Multiple Chart Combinations__: Combine multiple charts of the same or different types within a single instance.
|
||||
- __Various Coordinate Systems__: Supports different coordinate systems such as Cartesian, polar, and single axes.
|
||||
- __Rich Components__: Includes titles, legends, tooltips, and more.
|
||||
- __Custom Drawing__: Utilize a powerful API for custom drawing of points, lines, and other graphics.
|
||||
- __Large Data Rendering__: Capable of rendering tens of thousands of data points with support for sampling rendering.
|
||||
- __Custom Themes__: Customize themes and use the included light and dark default themes.
|
||||
- __Animations and Interactions__: Supports various animations and interactions for a dynamic user experience.
|
||||
- __Third-Party Extensions__: Integrates with TextMeshPro and the New Input System.
|
||||
- __Version and Compatibility__: Compatible with all Unity versions above 5.6 and runs on all platforms.
|
||||
|
||||
* __Pure code rendering__: The chart is completely rendered with pure code, without the need for additional texture or shader resources.
|
||||
* __Visual configuration__: Visual configuration of parameters with real-time preview of the effect, and support for dynamic modification of configuration and data during runtime.
|
||||
* __High customizability__: Supports arbitrary adjustments from theme and configuration parameters; supports custom drawing, callback functions, and custom implementations of charts.
|
||||
* __Multiple built-in charts__: Supports various built-in charts such as line charts, bar charts, pie charts, radar charts, scatter plots, heat maps, polar charts, K-line charts, parallel coordinates, etc.
|
||||
* __Multiple extended charts__: Supports extended charts such as 3D column charts, 3D pie charts, funnel charts, pyramids, dashboards, water level charts, iconic bar charts, Gantt charts, and tree maps.
|
||||
* __Multiple extended features__: Supports extended UI components such as tables and statistical values.
|
||||
* __Multiple chart combinations__: Supports arbitrary combinations of built-in charts, with multiple same or different types of charts displayed simultaneously in the same chart.
|
||||
* __Various coordinate systems__: Supports coordinate systems such as Cartesian coordinates, polar coordinates, and single axes.
|
||||
* __Rich components__: Supports common components such as titles, legends, tooltips, markings, marking areas, data area zooming, and visual mapping.
|
||||
* __Rich line charts__: Supports various line charts such as straight line charts, curved line charts, dashed line charts, area charts, step line charts, etc.
|
||||
* __Rich bar charts__: Supports various bar charts such as stacked bar charts, stacked percentage bar charts, zebra bar charts, and capsule bar charts.
|
||||
* __Rich pie charts__: Supports various pie charts such as ring charts, rose charts, ring rose charts, etc.
|
||||
* __Rich lines__: Supports various lines such as solid lines, curves, step lines, dashed lines, dot lines, dotted lines, and double dot-dashed lines.
|
||||
* __Custom drawing__: Supports custom chart content drawing with powerful drawing APIs for drawing points, lines, and other graphics.
|
||||
* __Large data rendering__: Supports rendering of tens of thousands of data points; supports sampling rendering; special simplified charts support better performance.
|
||||
* __Custom themes__: Supports theme customization and import/export; includes both light and dark default themes.
|
||||
* __Animations and interactions__: Supports various animations such as fade-in animation, fade-out animation, change animation, addition animation, and * interactive animation; supports interactive operations such as data filtering, view zooming, and detailed display on multiple platforms.
|
||||
* __Third-party extensions__: Supports integration with TexMeshPro and New Input System.
|
||||
* __Version and compatibility__: Supports all Unity versions above 5.6 and runs on all platforms.
|
||||
## Documentation
|
||||
|
||||
- [XCharts3.0 Homepage](https://xcharts-team.github.io/en)
|
||||
- [XCharts3.0 Tutorial](Documentation~/en/tutorial01.md)
|
||||
- [XCharts3.0 API](Documentation~/en/api.md)
|
||||
- [XCharts3.0 FAQ](Documentation~/en/faq.md)
|
||||
- [XCharts3.0 Configurate](Documentation~/en/configuration.md)
|
||||
- [XCharts3.0 Changelog](Documentation~/en/changelog.md)
|
||||
- [XCharts3.0 Support](Documentation~/en/support.md)
|
||||
|
||||
## Screenshots
|
||||
|
||||
@@ -84,55 +73,43 @@ A powerful and easy-to-use data visualization library for Unity. It supports mo
|
||||
|
||||

|
||||
|
||||
## Attention
|
||||
## Important Notes
|
||||
|
||||
* `XCharts3.0` is not fully compatible with `XCharts2.0` version, upgrading `3.0` may require some code adjustments, and some chart configurations need to be readjusting. It is recommended that old projects can continue to use `XCharts2.0`, and new projects are recommended to use `XCharts3.0`.
|
||||
* `XCharts2.0` enters the maintenance phase, and only serious `bugs` will be fixed later, in principle, no more new features will be added.
|
||||
* `XCharts` theoretically supports `Unity 5.6` and above, but due to limited version testing, it is inevitable to slip up, and version compatibility issues can be raised.
|
||||
* This repository only contains `XCharts` source code, does not contain `Demo` sample section. Need to look at ` Demo ` please go to the sample source code [XCharts - Demo](https://github.com/XCharts-Team/XCharts-Demo) repo. You can also view the running effect of `WebGL` in your browser [Online Demo](https://xcharts-team.github.io/examples/).
|
||||
- `XCharts3.0` is not fully compatible with `XCharts2.0`. Upgrading to 3.0 may require code adjustments and reconfiguration of some charts.
|
||||
- `XCharts2.0` is in the maintenance phase with only critical bug fixes applied.
|
||||
- While XCharts supports Unity 5.6 and above, compatibility issues may arise due to limited testing.
|
||||
- This repository contains only the `XCharts` source code. For demos, visit the [XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo) repo or the [Online Demo](https://xcharts-team.github.io/en/examples/).
|
||||
|
||||
## Use
|
||||
## Getting Started
|
||||
|
||||
* Import `XCharts` unitypackage or source code into the project.
|
||||
* Right-click `Hierarchy` view and choose `XCharts->LineChart` to create a default LineChart.
|
||||
* You can adjust the parameters of each component in `Inspector` and see the real-time effects in `Game` view.
|
||||
* For more details, see [[XCharts Tutorial: 5-minute tutorial]](Documentation~/en/tutorial01.md)
|
||||
* For the first time, it is recommended to read the tutorial carefully.
|
||||
1. Import the `XCharts` unitypackage or source code into your Unity project.
|
||||
2. Create a chart by right-clicking in the `Hierarchy` view and selecting `UI->XCharts->LineChart`.
|
||||
3. Adjust component parameters in the `Inspector` to see real-time effects in the `Game` view.
|
||||
4. For more details, refer to the [5-minute tutorial](Documentation~/en/tutorial01.md).
|
||||
|
||||
## Branch
|
||||
## Branch Information
|
||||
|
||||
* `master` : indicates the development branch. The latest changes and new features are first committed to the `master` branch, and after some time from the `master` branch `merge` to the `3.0` branch, and the `release` version.
|
||||
* `3.0` : Stable branch of XCharts 3.0. It is generally updated once a month, with the latest changes from the `master` branch `merge`, and the `release` version is released.
|
||||
* `2.0` : A stable branch of XCharts 2.0. With Demo, currently no longer maintenance, only to modify serious bugs.
|
||||
* `2.0-upm` : Stable UMP branch of XCharts 2.0. Only the Package part is included without Demo. It is dedicated to the UMP and is not maintained.
|
||||
* `1.0` : Stable branch of XCharts 1.0. With Demo, no maintenance.
|
||||
* `1.0-upm` : stable UMP branch of XCharts 1.0. No Demo, no maintenance.
|
||||
- __master__ indicates the development branch. The latest changes and new features are first committed to the `master` branch, and after some time from the `master` branch `merge` to the `3.0` branch, and the `release` version.
|
||||
- __3.0__ Stable branch of XCharts 3.0. It is generally updated once a month, with the latest changes from the `master` branch `merge`, and the `release` version is released.
|
||||
- __2.0__ A stable branch of XCharts 2.0. With Demo, currently no longer maintenance, only to modify serious bugs.
|
||||
- __2.0-upm__ Stable UMP branch of XCharts 2.0. Only the Package part is included without Demo. It is dedicated to the UMP and is not maintained.
|
||||
- __1.0__ Stable branch of XCharts 1.0. With Demo, no maintenance.
|
||||
- __1.0-upm__ stable UMP branch of XCharts 1.0. No Demo, no maintenance.
|
||||
|
||||
## FAQ
|
||||
|
||||
* Is `XCharts` free to use?
|
||||
A: `XCharts` uses the `MIT` licence and is free to use. You can also subscribe to `VIP` to enjoy more value-added services.
|
||||
|
||||
* Does `XCharts` support code to dynamically add and modify data? Does it support getting data from `Excel` or a database?
|
||||
A: Support code to dynamically add and modify data, but data needs to be parsed or retrieved by itself, and then added to `XCharts` by calling the public interface of `XCharts`.
|
||||
|
||||
* Does this plugin work on other platforms (e.g. Winform or WPF) besides Unity?
|
||||
A: It is currently only supported on Unity. Theoretically any version of Unity that supports `UGUI` can run `XCharts`.
|
||||
|
||||
* What about the jags? What magnitude of data is supported?
|
||||
A: XCharts is based on UGUI implementation, so the problems encountered in UGUI will also exist in XCharts. For example, the sawtooth problem, such as the number of vertices in `Mesh` exceeds `65535`. Solutions to these two problems can be found in [Q&A 16](Documentation~/en/faq.md) and [Q&A 27](Documentation~/en/faq.md).
|
||||
Due to the `Mesh` of the `65535` vertex limit, the current `XCharts` single `Line` supports about `20,000` of data, of course, open sampling can support more data to draw, but at the same time it will consume more CPU.
|
||||
- __Is XCharts free to use?__ Yes, XCharts is free under the MIT license and includes value-added VIP services.
|
||||
- __Does XCharts support dynamic data addition and modification?__ Yes, but data must be parsed or retrieved by the user.
|
||||
- __Does this plugin work on platforms other than Unity?__ No, it is designed for Unity only.
|
||||
|
||||
## Changelog
|
||||
|
||||
* [Changelog](Documentation~/en/changelog.md)
|
||||
- [Changelog](Documentation~/en/changelog.md)
|
||||
|
||||
## Licenses
|
||||
|
||||
* [MIT License](https://github.com/XCharts-Team/XCharts/blob/master/LICENSE.md)
|
||||
* Free commercial, secondary development
|
||||
* The extended charts and advanced features sections require a separate purchase license
|
||||
- XCharts is released under the [MIT License](https://github.com/XCharts-Team/XCharts/blob/master/LICENSE.md).
|
||||
|
||||
## Other
|
||||
## Contact
|
||||
|
||||
email: `monitor1394@gmail.com`
|
||||
- For more information or support, contact us at `monitor1394@gmail.com`.
|
||||
|
||||
156
README.md
@@ -1,15 +1,8 @@
|
||||
<p align="center">
|
||||
<a href="">
|
||||
<img src="" alt="" width="" height=""></img>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<h2 align="center">XCharts</h2>
|
||||
<p align="center">
|
||||
A powerful, easy-to-use, configurable charting and data visualization library for Unity.
|
||||
<br/>
|
||||
Unity数据可视化图表插件。
|
||||
<br/>
|
||||
<a href="README-en.md">English README</a>
|
||||
A powerful, easy-to-use, configurable charting and data visualization library for Unity.<br/>Unity数据可视化图表插件。<br/>
|
||||
<a href="README-en.md">English README</a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://github.com/XCharts-Team/XCharts/blob/master/LICENSE">
|
||||
@@ -45,7 +38,7 @@
|
||||
|
||||

|
||||
|
||||
一款基于`UGUI`的功能强大、简单易用的数据可视化图表插件。支持`折线图`、`柱状图`、`饼图`、`雷达图`、`散点图`、`热力图`、`环形图`、`K线图`、`极坐标`、`平行坐标`等十多种内置图表,以及`3D饼图`、`3D柱图`、`3D金字塔`、`漏斗图`、`仪表盘`、`水位图`、`象形柱图`、`甘特图`、`矩形树图`、`桑基图`等多种扩展图表。
|
||||
XCharts 是一款基于 UGUI 的功能强大、简单易用的 Unity 数据可视化图表插件。它提供了丰富的图表类型和灵活的配置选项,帮助开发者快速实现专业级的数据可视化效果。支持折线图、柱状图、饼图、雷达图、散点图、热力图、环形图、K线图、极坐标、平行坐标等十多种常用的内置图表。提供3D饼图、3D柱图、3D金字塔、漏斗图、仪表盘、水位图、象形柱图、甘特图、矩形树图、桑基图、3D折线图、关系图等十多种高级扩展图表。
|
||||
|
||||
[XCharts 官方主页](https://xcharts-team.github.io)
|
||||
[XCharts 在线示例](https://xcharts-team.github.io/examples)
|
||||
@@ -59,25 +52,24 @@
|
||||
|
||||
## 特性
|
||||
|
||||
- __纯代码绘制__:图表纯代码绘制,无需额外的贴图和Shader资源。
|
||||
- __可视化配置__:参数可视化配置,效果实时预览,支持运行时代码动态修改配置和数据。
|
||||
- __高自由定制__:支持从主题和配置参数上任意调整;支持代码自定义绘制,自定义回调以及自定义实现图表。
|
||||
- __多内置图表__:支持线图、柱状图、饼图、雷达图、散点图、热力图、环形图、K线图、极坐标、平行坐标等多种内置图表。
|
||||
- __多扩展图表__:支持3D柱图、3D饼图、漏斗图、金字塔、仪表盘、水位图、象形柱图、甘特图、矩形树图、桑基图等多种扩展图表。
|
||||
- __多扩展组件__:支持表格、统计数值等多种扩展UI组件。
|
||||
- __多图表组合__:支持内置图表的任意组合,同一图中可同时显示多个相同或不同类型的图表。
|
||||
- __多种坐标系__:支持直角坐标系、极坐标系、单轴等多种坐标系。
|
||||
- __丰富的组件__:支持标题、图例、提示框、标线、标域、数据区域缩放、视觉映射等常用组件。
|
||||
- __多样式线图__:支持直线图、曲线图、虚线图、面积图、阶梯线图等多种线图。
|
||||
- __多样式柱图__:支持并列柱图、堆叠柱图、堆积百分比柱图、斑马柱图、胶囊柱图等多种柱状图。
|
||||
- __多样式饼图__:支持环形图、玫瑰图、环形玫瑰图等多种饼图。
|
||||
- __丰富的线条__:支持实线、曲线、阶梯线、虚线、点线、点划线、双点划线等线条。
|
||||
- __自定义绘制__:支持自定义图表内容绘制,提供绘制点、线、面等其他图形的强大的绘图API。
|
||||
- __大数据绘制__:支持万级大数据量绘制;支持采样绘制;特殊的简化图表支持更优的性能。
|
||||
- __自定义主题__:支持主题定制、导入和导出,内置明暗两种默认主题。
|
||||
- __动画和交互__:支持渐入动画、渐出动画、变更动画、新增动画、交互动画等多种动画;支持多平台的数据筛选、视图缩放、细节展示等交互操作。
|
||||
- __第三方扩展__:支持无缝接入`TexMeshPro`和`New Input System`。
|
||||
- __版本和兼容__:支持所有`5.6`以上的`Unity`版本;支持全平台运行。
|
||||
- __纯代码绘制__:图表完全通过代码生成,无需额外贴图或 Shader 资源,轻量高效。
|
||||
- __可视化配置__:提供直观的参数配置界面,支持实时预览效果,并可在运行时动态修改配置和数据。
|
||||
- __高度定制化__:支持从主题、组件到数据项的全面参数设置,同时允许通过代码自定义绘制逻辑、回调函数及图表实现。
|
||||
- __多内置图表__:支持线图、柱状图、饼图、雷达图、散点图、热力图、环形图、K线图、极坐标、平行坐标等多种常用的内置图表。
|
||||
- __多扩展图表__:支持3D柱图、3D饼图、漏斗图、金字塔、仪表盘、水位图、象形柱图、甘特图、矩形树图、桑基图、3D折线图、关系图等多种高级扩展图表,满足复杂数据可视化需求。
|
||||
- __多扩展组件__:支持多种实用 UI 组件,如表格、统计数值、滑动条、进度条等,增强图表交互性。
|
||||
- __多图表组合__:支持在同一图表中组合显示多个相同或不同类型的图表,满足复杂场景需求。
|
||||
- __多种坐标系__:支持直角坐标系、极坐标系、单轴等多种坐标系,适应不同数据展示需求。
|
||||
- __丰富的组件__:提供标题、图例、提示框、标线、标域、数据区域缩放、视觉映射等常用组件,提升图表可读性。
|
||||
- __多样式线图__:支持直线、曲线、虚线、面积图、阶梯线图等多种线图样式,满足不同数据趋势展示需求。
|
||||
- __多样式柱图__:支持并列柱图、堆叠柱图、堆积百分比柱图、斑马柱图、胶囊柱图等多种柱状图样式。
|
||||
- __多样式饼图__:支持环形图、玫瑰图、环形玫瑰图等多种饼图样式,直观展示数据占比。
|
||||
- __自定义绘制__:提供强大的绘图 API,支持自定义绘制点、线、面等图形,满足个性化需求。
|
||||
- __大数据绘制__:支持万级数据量绘制,优化性能表现;支持采样绘制,进一步提升大数据场景下的性能。
|
||||
- __自定义主题__:支持主题定制、导入和导出,内置明暗两种默认主题,轻松适配不同应用场景。
|
||||
- __动画和交互__:支持渐入、渐出、变更、新增等多种动画效果,以及数据筛选、视图缩放、细节展示等交互操作,提升用户体验。
|
||||
- __第三方扩展__:无缝集成TexMeshPro和New Input System,扩展功能兼容性。
|
||||
- __版本和兼容__:支持 Unity 5.6 及以上版本,兼容全平台运行。
|
||||
|
||||
## 截图
|
||||
|
||||
@@ -85,45 +77,6 @@
|
||||
|
||||

|
||||
|
||||
## 仓库
|
||||
|
||||
| 相关仓库 | 仓库介绍 |
|
||||
| -- | --|
|
||||
| [XCharts](https://github.com/XCharts-Team/XCharts) | XCharts核心功能,完全免费。 |
|
||||
| [XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon) | XCharts的守护程序,用于确保XCharts更新时的编译正常。非必须,但建议使用。 |
|
||||
| [XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo) | XCharts的官方示例,不包含扩展图表部分。订阅VIP的用户购买扩展图表后,可加入对应图表的示例。 |
|
||||
| [XCharts-Pro](https://github.com/XCharts-Team/XCharts-Pro) | XCharts完全版,包含所有扩展图表和扩展组件。订阅SVIP后可访问使用。 |
|
||||
| [XCharts-Pro-Demo](https://github.com/XCharts-Team/XCharts-Pro-Demo) | XCharts完全版官方示例,包含所有扩展图表和扩展组件的示例。订阅SVIP后可访问使用。 |
|
||||
| [XCharts-UI](https://github.com/XCharts-Team/XCharts-UI) | XCharts的扩展UI组件。订阅VIP后可访问使用。 |
|
||||
| [XCharts-Bar3DChart](https://github.com/XCharts-Team/XCharts-Bar3DChart) | XCharts扩展图表:3D柱图。订阅购买后可访问使用。 |
|
||||
| [XCharts-FunnelChart](https://github.com/XCharts-Team/XCharts-FunnelChart) | XCharts扩展图表:漏斗图。订阅购买后可访问使用。 |
|
||||
| [XCharts-GanttChart](https://github.com/XCharts-Team/XCharts-GanttChart) | XCharts扩展图表:甘特图。订阅购买后可访问使用。 |
|
||||
| [XCharts-GaugeChart](https://github.com/XCharts-Team/XCharts-GaugeChart) | XCharts扩展图表:仪表盘。订阅购买后可访问使用。 |
|
||||
| [XCharts-LiquidChart](https://github.com/XCharts-Team/XCharts-LiquidChart) | XCharts扩展图表:水位图。订阅购买后可访问使用。 |
|
||||
| [XCharts-PictorialBarChart](https://github.com/XCharts-Team/XCharts-PictorialBarChart) | XCharts扩展图表:象形住图。订阅购买后可访问使用。 |
|
||||
| [XCharts-Pie3DChart](https://github.com/XCharts-Team/XCharts-Pie3DChart) | XCharts扩展图表:3D饼图。订阅购买后可访问使用。 |
|
||||
| [XCharts-PyramidChart](https://github.com/XCharts-Team/XCharts-PyramidChart) | XCharts扩展图表:3D金字塔。订阅购买后可访问使用。 |
|
||||
| [XCharts-TreemapChart](https://github.com/XCharts-Team/XCharts-TreemapChart) | XCharts扩展图表:矩形树图。订阅购买后可访问使用。 |
|
||||
| [XCharts-SankeyChart](https://github.com/XCharts-Team/XCharts-SankeyChart) | XCharts扩展图表:桑基图。订阅购买后可访问使用。 |
|
||||
|
||||
## 分支
|
||||
|
||||
| 分支 | 分支介绍 |
|
||||
|--|--|
|
||||
| [master](https://github.com/XCharts-Team/XCharts/tree/master) | XCharts3.0的开发分支。最新的修改和功能都先提交到`master`分支,稳定后后再从`master`分支`merge`到`3.0`分支,并发布`release`版本。|
|
||||
| [3.0](https://github.com/XCharts-Team/XCharts/tree/3.0) | XCharts3.0的稳定分支。一般一个月一发布,`master`分支稳定后,`merge`到`3.0`分支,并发布`release`版本。|
|
||||
| [2.0](https://github.com/XCharts-Team/XCharts/tree/2.0) | XCharts2.0的稳定分支。带Demo,目前基本不再维护,仅修改严重bug。|
|
||||
| [2.0-upm](https://github.com/XCharts-Team/XCharts/tree/2.0-upm) | XCharts2.0的稳定UMP分支。不带Demo,只包含Package部分,不再维护。|
|
||||
| [1.0](https://github.com/XCharts-Team/XCharts/tree/1.0) | XCharts1.0的稳定分支。带Demo,不再维护。|
|
||||
| [1.0-upm](https://github.com/XCharts-Team/XCharts/tree/1.0-upm) | XCharts1.0的稳定UMP分支。不带Demo,不再维护。|
|
||||
|
||||
## 注意
|
||||
|
||||
- `XCharts3.0` 不完全兼容 `XCharts2.0` 版本,升级`3.0`时,部分代码和配置可能需要重新调整。建议旧项目可以继续使用`XCharts2.0`,新项目推荐使用`XCharts3.0`。
|
||||
- `XCharts2.0` 进入维护阶段,后续只修复严重`bug`,原则上不再加新功能。
|
||||
- `XCharts` 理论上支持`Unity 5.6`及以上版本,但由于版本测试有限难免疏漏,发现问题可提`Issue`。
|
||||
- 本仓库只包含`XCharts`源码,不包含`Demo`示例部分。需要查看`Demo`示例源码请到[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo)仓库。也可以在浏览器查看`WebGL`下的运行效果 [在线Demo](https://xcharts-team.github.io/examples/) 。
|
||||
|
||||
## 使用
|
||||
|
||||
- 导入`XCharts`的`unitypackage`或者源码到项目。建议也导入`XCharts`守护程序 [XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon)。
|
||||
@@ -133,40 +86,67 @@
|
||||
- 更多细节,请看[【XCharts教程:5分钟上手教程】](Documentation~/zh/tutorial01.md)。
|
||||
- 首次使用,建议先认真看一遍教程。
|
||||
|
||||
## FAQ
|
||||
## 常见问题 (FAQ)
|
||||
|
||||
- `XCharts`可以免费使用吗?
|
||||
答:`XCharts`使用`MIT`协议,可以免费使用。也可以订阅`VIP`享受更多增值服务。
|
||||
- __XCharts 可以免费使用吗?__
|
||||
XCharts 基于 MIT 协议,核心功能完全免费。您也可以订阅 VIP 服务,享受更多高级功能和专属技术支持。
|
||||
|
||||
- `XCharts`支持代码动态添加和修改数据吗?支持从`Excel`或数据库中获取数据吗?
|
||||
答:`XCharts`提供了各种数据操作的接口,支持代码动态修改配置,添加和修改数据,但数据来源需要自己解析和获取,再调用`XCharts`的接口添加到图表。
|
||||
- __XCharts 支持代码动态添加和修改数据吗?__
|
||||
是的,XCharts 提供了丰富的数据操作接口,支持代码动态修改配置和数据。但数据来源(如 Excel 或数据库)需要您自行解析后调用 XCharts 接口添加到图表中。
|
||||
|
||||
- `XCharts`除了用在`Unity`平台,还能用在`Winform`或`WPF`等平台吗?
|
||||
答:`XCharts`只支持在`Unity`平台使用。理论上任何支持`UGUI`的`Unity`版本都能运行`XCharts`。
|
||||
- __XCharts 支持哪些平台?__
|
||||
XCharts 专为 Unity 平台设计,支持 Unity 5.6 及以上版本。理论上,任何支持 UGUI 的 Unity 版本均可运行 XCharts。目前不支持 Winform 或 WPF 等其他平台。
|
||||
|
||||
- 锯齿怎么解决?支持多大量级的数据?
|
||||
答:`XCharts`是基于`UGUI`实现的,所以`UGUI`中碰到的问题,在`XCharts`中也会存在。比如锯齿问题,比如`Mesh`顶点数超`65535`的问题。这两个问题的解决可参考[问答16](Documentation~/zh/faq.md)和[问答27](Documentation~/zh/faq.md)。
|
||||
由于`Mesh`的`65535`顶点数的限制,目前`XCharts`的单条`Line`支持约`2万`的数据量,当然开启采样可以支持更多数据的绘制,但同时也会更消耗CPU。
|
||||
- __如何解决锯齿问题?XCharts 支持多大的数据量?__
|
||||
XCharts 基于 UGUI 实现,因此 UGUI 的常见问题(如锯齿、Mesh 顶点数限制)在 XCharts 中也会存在。
|
||||
- __锯齿问题__:可通过调整抗锯齿设置或使用更高分辨率解决。
|
||||
- __数据量限制__:单条折线图(Line)支持约 2 万数据点,开启采样后可支持更多数据,但会消耗更多 CPU 资源。
|
||||
更多解决方案请参考 [问答 16](Documentation~/zh/faq.md) 和 [问答 27](Documentation~/zh/faq.md)。
|
||||
|
||||
- __哪里可以查看 Demo?__
|
||||
本仓库仅包含 XCharts 源码,Demo 示例请访问 [XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo) 仓库。您也可以在浏览器中查看 [在线 Demo](https://xcharts-team.github.io/examples/)。
|
||||
|
||||
## 日志
|
||||
|
||||
- [更新日志](Documentation~/zh/changelog.md)
|
||||
- 各版本的详细更新日志请查看 [更新日志](Documentation~/zh/changelog.md)
|
||||
|
||||
## Licenses
|
||||
## 扩展
|
||||
|
||||
- [MIT License](https://github.com/XCharts-Team/XCharts/blob/master/LICENSE.md)
|
||||
- 可免费商用,可二次开发。
|
||||
- 扩展图表和高级功能部分需购买使用授权。
|
||||
- __[XCharts](https://github.com/XCharts-Team/XCharts)__ 核心功能,完全开源免费
|
||||
- __[XCharts-Daemon](https://github.com/XCharts-Team/XCharts-Daemon)__ 守护程序,确保XCharts更新时的编译正常
|
||||
- __[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo)__ 官方示例(不包含扩展图表的示例)
|
||||
- __[XCharts-Pro](https://github.com/XCharts-Team/XCharts-Pro)__ 专业版,包含所有扩展图表和扩展组件(需订阅 SVIP)
|
||||
- __[XCharts-Pro-Demo](https://github.com/XCharts-Team/XCharts-Pro-Demo)__ 专业版官方示例(需订阅 SVIP)
|
||||
- __[XCharts-UI](https://github.com/XCharts-Team/XCharts-UI)__ 扩展UI组件(需订阅 VIP)
|
||||
- __[XCharts-Bar3DChart](https://github.com/XCharts-Team/XCharts-Bar3DChart)__ 3D柱图(需订阅 VIP)
|
||||
- __[XCharts-FunnelChart](https://github.com/XCharts-Team/XCharts-FunnelChart)__ 漏斗图(需订阅 VIP)
|
||||
- __[XCharts-GanttChart](https://github.com/XCharts-Team/XCharts-GanttChart)__ 甘特图(需订阅 VIP)
|
||||
- __[XCharts-GaugeChart](https://github.com/XCharts-Team/XCharts-GaugeChart)__ 仪表盘(需订阅 VIP)
|
||||
- __[XCharts-LiquidChart](https://github.com/XCharts-Team/XCharts-LiquidChart)__ 水位图(需订阅 VIP)
|
||||
- __[XCharts-PictorialBarChart](https://github.com/XCharts-Team/XCharts-PictorialBarChart)__ 象形住图(需订阅 VIP)
|
||||
- __[XCharts-Pie3DChart](https://github.com/XCharts-Team/XCharts-Pie3DChart)__ 3D饼图(需订阅 VIP)
|
||||
- __[XCharts-PyramidChart](https://github.com/XCharts-Team/XCharts-PyramidChart)__ 3D金字塔(需订阅 VIP)
|
||||
- __[XCharts-TreemapChart](https://github.com/XCharts-Team/XCharts-TreemapChart)__ 矩形树图(需订阅 VIP)
|
||||
- __[XCharts-SankeyChart](https://github.com/XCharts-Team/XCharts-SankeyChart)__ 桑基图(需订阅 VIP)
|
||||
- __[XCharts-Line3DChart](https://github.com/XCharts-Team/XCharts-Line3DChart)__ 3D折线图(需订阅 VIP)
|
||||
- __[XCharts-GraphChart](https://github.com/XCharts-Team/XCharts-GraphChart)__ 关系图(需订阅 VIP)
|
||||
|
||||
## 许可
|
||||
|
||||
- __[MIT License](https://github.com/XCharts-Team/XCharts/blob/master/LICENSE.md)__:XCharts 核心库基于 MIT 协议,允许免费商用和二次开发。
|
||||
|
||||
- __扩展功能授权__:扩展图表和高级功能需订阅 VIP 或 SVIP 服务获得使用许可。
|
||||
|
||||
## 订阅
|
||||
|
||||
- `XCharts`核心库是开源的,可免费使用的。在此基础上,我们也提供多种订阅服务以满足不同用户的需求,订阅详情[☞ 请看这里](Documentation~/zh/support.md)。
|
||||
- 订阅不是必须的,不影响`XCharts`的核心功能使用。
|
||||
- 订阅是按年付费,订阅到期后,不要求必须续订,但中断订阅期间无法享受技术更新和支持等服务。
|
||||
- __核心功能免费__:XCharts 核心库基于 MIT 协议完全开源,可免费使用。
|
||||
- __增值服务__:为满足多样化需求,我们提供多种订阅服务,详情请查看 [订阅详情](Documentation~/zh/support.md)。
|
||||
- __灵活选择__:订阅非强制,不影响核心功能使用。
|
||||
- __按年付费__:订阅服务按年计费,到期后可选择续订。中断订阅后,将无法享受更新和技术支持服务。
|
||||
|
||||
## 其他
|
||||
|
||||
- 邮箱:`monitor1394@gmail.com`
|
||||
- QQ群:XCharts交流群(`202030963`)
|
||||
- VIP群:XCharts VIP群(`867291970`)
|
||||
- 捐助、合作、订阅和技术支持:[☞ 请看这里](Documentation~/zh/support.md)
|
||||
- 支持与合作:[订阅与支持](Documentation~/zh/support.md)
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace XCharts.Runtime
|
||||
radiusAxis.axisLabel.show = false;
|
||||
|
||||
var tooltip = EnsureChartComponent<Tooltip>();
|
||||
tooltip.type = Tooltip.Type.Corss;
|
||||
tooltip.type = Tooltip.Type.Cross;
|
||||
tooltip.trigger = Tooltip.Trigger.Axis;
|
||||
|
||||
RemoveData();
|
||||
|
||||
@@ -16,6 +16,7 @@ namespace XCharts.Runtime
|
||||
[SerializeField][Since("v3.8.0")] private bool m_Reverse = false;
|
||||
[SerializeField][Since("v3.8.0")] private float m_Delay = 0;
|
||||
[SerializeField][Since("v3.8.0")] private float m_Duration = 1000;
|
||||
[SerializeField][Since("v3.14.0")] private float m_Speed = 0;
|
||||
public AnimationInfoContext context = new AnimationInfoContext();
|
||||
|
||||
/// <summary>
|
||||
@@ -34,11 +35,15 @@ namespace XCharts.Runtime
|
||||
/// </summary>
|
||||
public float delay { get { return m_Delay; } set { m_Delay = value; } }
|
||||
/// <summary>
|
||||
/// the duration of animation.
|
||||
/// ||动画的时长。
|
||||
/// the duration of animation. Default is used to calculate the speed of animation. It can also be specified by speed.
|
||||
/// ||动画的时长。默认用于计算动画的速度。也可以通过speed指定速度。
|
||||
/// </summary>
|
||||
public float duration { get { return m_Duration; } set { m_Duration = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// the speed of animation. When speed is specified, duration will be invalid. Default is 0, which means no speed specified.
|
||||
/// ||动画的速度。当指定speed时,duration将失效。默认为0,表示不指定速度。
|
||||
/// </summary>
|
||||
public float speed { get { return m_Speed; } set { m_Speed = value; } }
|
||||
/// <summary>
|
||||
/// the callback function of animation start.
|
||||
/// ||动画开始的回调。
|
||||
@@ -147,6 +152,7 @@ namespace XCharts.Runtime
|
||||
{
|
||||
if (!enable) return;
|
||||
if (!context.start || context.end) return;
|
||||
context.init = false;
|
||||
context.start = false;
|
||||
context.end = true;
|
||||
context.currPointIndex = context.destPointIndex;
|
||||
@@ -168,20 +174,19 @@ namespace XCharts.Runtime
|
||||
public bool Init(float curr, float dest, int totalPointIndex)
|
||||
{
|
||||
if (!enable || !context.start) return false;
|
||||
if (context.init || context.end) return false;
|
||||
context.init = true;
|
||||
context.totalProgress = dest - curr;
|
||||
context.destPointIndex = totalPointIndex;
|
||||
if (reverse)
|
||||
{
|
||||
context.currProgress = dest;
|
||||
if (!context.init) context.currProgress = dest;
|
||||
context.destProgress = curr;
|
||||
}
|
||||
else
|
||||
{
|
||||
context.currProgress = curr;
|
||||
if (!context.init) context.currProgress = curr;
|
||||
context.destProgress = dest;
|
||||
}
|
||||
context.init = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -208,7 +213,7 @@ namespace XCharts.Runtime
|
||||
if (!context.start)
|
||||
return false;
|
||||
else
|
||||
return (m_Delay > 0 && Time.time - context.startTime < m_Delay / 1000);
|
||||
return m_Delay > 0 && Time.time - context.startTime < m_Delay / 1000;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -285,8 +290,7 @@ namespace XCharts.Runtime
|
||||
{
|
||||
if (!context.start || !context.init || context.pause) return;
|
||||
if (IsInDelay()) return;
|
||||
var duration = GetCurrAnimationDuration();
|
||||
var delta = (float)(total / duration * (m_UnscaledTime ? Time.unscaledDeltaTime : Time.deltaTime));
|
||||
var delta = GetDelta(total, m_UnscaledTime);
|
||||
if (reverse)
|
||||
{
|
||||
context.currProgress -= delta;
|
||||
@@ -330,8 +334,7 @@ namespace XCharts.Runtime
|
||||
}
|
||||
else
|
||||
{
|
||||
var duration = GetCurrAnimationDuration(dataIndex);
|
||||
var delta = (destProgress - startProgress) / duration * (m_UnscaledTime ? Time.unscaledDeltaTime : Time.deltaTime);
|
||||
var delta = GetDelta(destProgress - startProgress, m_UnscaledTime);
|
||||
currHig += delta;
|
||||
if (reverse)
|
||||
{
|
||||
@@ -362,8 +365,7 @@ namespace XCharts.Runtime
|
||||
if (IsInDelay())
|
||||
return;
|
||||
|
||||
var duration = GetCurrAnimationDuration();
|
||||
var delta = dest / duration * (m_UnscaledTime ? Time.unscaledDeltaTime : Time.deltaTime);
|
||||
var delta = GetDelta(dest, m_UnscaledTime);
|
||||
if (reverse)
|
||||
{
|
||||
context.sizeProgress -= delta;
|
||||
@@ -377,6 +379,20 @@ namespace XCharts.Runtime
|
||||
context.sizeProgress = dest;
|
||||
}
|
||||
}
|
||||
|
||||
private float GetDelta(double total, bool unscaledTime)
|
||||
{
|
||||
if (m_Speed > 0)
|
||||
{
|
||||
context.currDuration = (float)total / m_Speed;
|
||||
return (float)(m_Speed * (unscaledTime ? Time.unscaledDeltaTime : Time.deltaTime));
|
||||
}
|
||||
else
|
||||
{
|
||||
context.currDuration = 0;
|
||||
return (float)(total / GetCurrAnimationDuration() * (unscaledTime ? Time.unscaledDeltaTime : Time.deltaTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -477,4 +493,14 @@ namespace XCharts.Runtime
|
||||
return m_Offset.value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Data exchange animation. Generally used for animation of data sorting.
|
||||
/// ||数据交换动画。一般用于图表数据排序时顺序变化的动画。
|
||||
/// </summary>
|
||||
[Since("v3.15.0")]
|
||||
[System.Serializable]
|
||||
public class AnimationExchange : AnimationInfo
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ namespace XCharts.Runtime
|
||||
public float sizeProgress;
|
||||
public int currPointIndex;
|
||||
public int destPointIndex;
|
||||
public float currDuration;
|
||||
public Vector3 currPoint;
|
||||
public Vector3 destPoint;
|
||||
public Dictionary<int, float> dataCurrProgress = new Dictionary<int, float>();
|
||||
|
||||
@@ -44,8 +44,8 @@ namespace XCharts.Runtime
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// the animation of serie. support animation type: fadeIn, fadeOut, change, addition.
|
||||
/// ||动画组件,用于控制图表的动画播放。支持配置五种动画表现:FadeIn(渐入动画),FadeOut(渐出动画),Change(变更动画),Addition(新增动画),Interaction(交互动画)。
|
||||
/// the animation of serie. support animation type: fadeIn, fadeOut, change, addition, exchange.
|
||||
/// ||动画组件,用于控制图表的动画播放。支持配置五种动画表现:FadeIn(渐入动画),FadeOut(渐出动画),Change(变更动画),Addition(新增动画),Interaction(交互动画),Exchange(交换动画)。
|
||||
/// 按作用的对象可以分为两类:SerieAnimation(系列动画)和DataAnimation(数据动画)。
|
||||
/// </summary>
|
||||
[System.Serializable]
|
||||
@@ -62,6 +62,7 @@ namespace XCharts.Runtime
|
||||
[SerializeField][Since("v3.8.0")] private AnimationAddition m_Addition = new AnimationAddition() { duration = 500 };
|
||||
[SerializeField][Since("v3.8.0")] private AnimationHiding m_Hiding = new AnimationHiding() { duration = 500 };
|
||||
[SerializeField][Since("v3.8.0")] private AnimationInteraction m_Interaction = new AnimationInteraction() { duration = 250 };
|
||||
[SerializeField][Since("v3.15.0")] private AnimationExchange m_Exchange = new AnimationExchange() { duration = 250 };
|
||||
|
||||
[Obsolete("Use animation.fadeIn.delayFunction instead.", true)]
|
||||
public AnimationDelayFunction fadeInDelayFunction;
|
||||
@@ -138,6 +139,11 @@ namespace XCharts.Runtime
|
||||
/// ||交互动画配置。
|
||||
/// </summary>
|
||||
public AnimationInteraction interaction { get { return m_Interaction; } }
|
||||
/// <summary>
|
||||
/// Exchange animation configuration. Valid in sort bar chart.
|
||||
/// ||交换动画配置。如在排序柱图中有效。
|
||||
/// </summary>
|
||||
public AnimationExchange exchange { get { return m_Exchange; } }
|
||||
|
||||
private Vector3 m_LinePathLastPos;
|
||||
private List<AnimationInfo> m_Animations;
|
||||
@@ -147,12 +153,15 @@ namespace XCharts.Runtime
|
||||
{
|
||||
if (m_Animations == null)
|
||||
{
|
||||
m_Animations = new List<AnimationInfo>();
|
||||
m_Animations.Add(m_FadeIn);
|
||||
m_Animations.Add(m_FadeOut);
|
||||
m_Animations.Add(m_Change);
|
||||
m_Animations.Add(m_Addition);
|
||||
m_Animations.Add(m_Hiding);
|
||||
m_Animations = new List<AnimationInfo>
|
||||
{
|
||||
m_FadeIn,
|
||||
m_FadeOut,
|
||||
m_Change,
|
||||
m_Addition,
|
||||
m_Hiding,
|
||||
m_Exchange
|
||||
};
|
||||
}
|
||||
return m_Animations;
|
||||
}
|
||||
@@ -306,7 +315,7 @@ namespace XCharts.Runtime
|
||||
startIndex = anim.context.currPointIndex == paths.Count - 1 ?
|
||||
paths.Count - 2 :
|
||||
anim.context.currPointIndex;
|
||||
if (startIndex < 0 || startIndex > paths.Count - 2) startIndex = 0;
|
||||
if (startIndex < 0 || startIndex >= paths.Count - 1) return;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -336,9 +345,12 @@ namespace XCharts.Runtime
|
||||
{
|
||||
return;
|
||||
}
|
||||
anim.context.currPoint = sp;
|
||||
anim.context.destPoint = ep;
|
||||
anim.Init(currDetailProgress, totalDetailProgress, paths.Count - 1);
|
||||
|
||||
if (anim.Init(currDetailProgress, totalDetailProgress, paths.Count - 1))
|
||||
{
|
||||
anim.context.currPoint = sp;
|
||||
anim.context.destPoint = ep;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsEnd()
|
||||
@@ -362,12 +374,23 @@ namespace XCharts.Runtime
|
||||
return true;
|
||||
var animation = activedAnimation;
|
||||
if (animation != null && animation.context.end)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (IsSerieAnimation())
|
||||
{
|
||||
if (m_FadeOut.context.start) return m_FadeOut.context.currProgress <= m_FadeOut.context.destProgress;
|
||||
else if (m_Addition.context.start) return m_Addition.context.currProgress >= m_Addition.context.destProgress;
|
||||
else return m_FadeIn.context.currProgress >= m_FadeIn.context.destProgress;
|
||||
if (m_FadeOut.context.start)
|
||||
{
|
||||
return m_FadeOut.context.currProgress <= m_FadeOut.context.destProgress;
|
||||
}
|
||||
else if (m_Addition.context.start)
|
||||
{
|
||||
return m_Addition.context.currProgress >= m_Addition.context.destProgress;
|
||||
}
|
||||
else
|
||||
{
|
||||
return m_FadeIn.context.currProgress >= m_FadeIn.context.destProgress;
|
||||
}
|
||||
}
|
||||
else if (IsDataAnimation())
|
||||
{
|
||||
@@ -546,7 +569,15 @@ namespace XCharts.Runtime
|
||||
public float GetChangeDuration()
|
||||
{
|
||||
if (m_Enable && m_Change.enable)
|
||||
return m_Change.duration;
|
||||
return m_Change.context.currDuration > 0 ? m_Change.context.currDuration : m_Change.duration;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
public float GetExchangeDuration()
|
||||
{
|
||||
if (m_Enable && m_Exchange.enable)
|
||||
return m_Exchange.context.currDuration > 0 ? m_Exchange.context.currDuration : m_Exchange.duration;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
@@ -554,7 +585,7 @@ namespace XCharts.Runtime
|
||||
public float GetAdditionDuration()
|
||||
{
|
||||
if (m_Enable && m_Addition.enable)
|
||||
return m_Addition.duration;
|
||||
return m_Addition.context.currDuration > 0 ? m_Addition.context.currDuration : m_Addition.duration;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
@@ -562,7 +593,7 @@ namespace XCharts.Runtime
|
||||
public float GetInteractionDuration()
|
||||
{
|
||||
if (m_Enable && m_Interaction.enable)
|
||||
return m_Interaction.duration;
|
||||
return m_Interaction.context.currDuration > 0 ? m_Interaction.context.currDuration : m_Interaction.duration;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace XCharts.Runtime
|
||||
animationType = attribute.type;
|
||||
enableSerieDataAnimation = attribute.enableSerieDataAddedAnimation;
|
||||
}
|
||||
UpdateAnimationType(serie.animation, animationType,enableSerieDataAnimation);
|
||||
UpdateAnimationType(serie.animation, animationType, enableSerieDataAnimation);
|
||||
}
|
||||
|
||||
public static void UpdateAnimationType(AnimationStyle animation, AnimationType defaultType, bool enableSerieDataAnimation)
|
||||
@@ -48,12 +48,12 @@ namespace XCharts.Runtime
|
||||
animation.context.enableSerieDataAddedAnimation = enableSerieDataAnimation;
|
||||
}
|
||||
|
||||
public static bool GetAnimationPosition(AnimationStyle animation, bool isY, Vector3 lp, Vector3 cp, float progress, ref Vector3 ip)
|
||||
public static bool GetAnimationPosition(AnimationStyle animation, bool isY, Vector3 lp, Vector3 cp, float progress, ref Vector3 ip, ref float rate)
|
||||
{
|
||||
if (animation.context.type == AnimationType.AlongPath)
|
||||
{
|
||||
var dist = Vector3.Distance(lp, cp);
|
||||
var rate = (dist - animation.context.currentPathDistance + animation.GetCurrDetail()) / dist;
|
||||
rate = (dist - animation.context.currentPathDistance + animation.GetCurrDetail()) / dist;
|
||||
ip = Vector3.Lerp(lp, cp, rate);
|
||||
return true;
|
||||
}
|
||||
@@ -62,7 +62,15 @@ namespace XCharts.Runtime
|
||||
var startPos = isY ? new Vector3(-10000, progress) : new Vector3(progress, -10000);
|
||||
var endPos = isY ? new Vector3(10000, progress) : new Vector3(progress, 10000);
|
||||
|
||||
return UGLHelper.GetIntersection(lp, cp, startPos, endPos, ref ip);
|
||||
if (UGLHelper.GetIntersection(lp, cp, startPos, endPos, ref ip))
|
||||
{
|
||||
rate = Vector3.Distance(lp, ip) / Vector3.Distance(lp, cp);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace XCharts.Runtime
|
||||
if (axis.context.labelObjectList.Count <= 0)
|
||||
InitAngleAxis(axis);
|
||||
else
|
||||
axis.UpdateLabelText(runtimeWidth, null, false);
|
||||
UpdateLabelText(axis, runtimeWidth, null, false);
|
||||
}
|
||||
|
||||
private void InitAngleAxis(AngleAxis axis)
|
||||
@@ -67,7 +67,7 @@ namespace XCharts.Runtime
|
||||
|
||||
string objName = component.GetType().Name + axis.index;
|
||||
var axisObj = ChartHelper.AddObject(objName, chart.transform, chart.chartMinAnchor,
|
||||
chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
|
||||
chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta, -1, chart.childrenNodeNames);
|
||||
axisObj.transform.localPosition = Vector3.zero;
|
||||
axisObj.SetActive(axis.show);
|
||||
axisObj.hideFlags = chart.chartHideFlags;
|
||||
@@ -85,7 +85,7 @@ namespace XCharts.Runtime
|
||||
float scaleAngle = AxisHelper.GetScaleWidth(axis, total, i + 1, null);
|
||||
bool inside = axis.axisLabel.inside;
|
||||
var labelName = AxisHelper.GetLabelName(axis, total, i, axis.context.minValue, axis.context.maxValue,
|
||||
null, isPercentStack);
|
||||
null, isPercentStack, chart.useUtc);
|
||||
var label = ChartHelper.AddAxisLabelObject(splitNumber, i, objName + i, axisObj.transform,
|
||||
new Vector2(scaleAngle, txtHig), axis,
|
||||
chart.theme.axis, labelName, Color.clear);
|
||||
|
||||
@@ -75,7 +75,8 @@ namespace XCharts.Runtime
|
||||
Left,
|
||||
Right,
|
||||
Bottom,
|
||||
Top
|
||||
Top,
|
||||
Center
|
||||
}
|
||||
|
||||
[SerializeField] protected bool m_Show = true;
|
||||
@@ -98,6 +99,8 @@ namespace XCharts.Runtime
|
||||
[SerializeField] protected bool m_Inverse = false;
|
||||
[SerializeField] private bool m_Clockwise = true;
|
||||
[SerializeField] private bool m_InsertDataToHead;
|
||||
[SerializeField][Since("v3.11.0")] private float m_MinCategorySpacing = 0;
|
||||
[SerializeField][Since("v3.15.0")] private bool m_MainAxis = false;
|
||||
[SerializeField] protected List<Sprite> m_Icons = new List<Sprite>();
|
||||
[SerializeField] protected List<string> m_Data = new List<string>();
|
||||
[SerializeField] protected AxisLine m_AxisLine = AxisLine.defaultAxisLine;
|
||||
@@ -113,6 +116,13 @@ namespace XCharts.Runtime
|
||||
|
||||
public AxisContext context = new AxisContext();
|
||||
|
||||
private Action<int, string> m_OnLabelClick;
|
||||
/// <summary>
|
||||
/// Callback function when click on the label. Parameters: labelIndex, labelName.
|
||||
/// ||点击文本标签回调函数。参数:labelIndex, labelName。
|
||||
/// </summary>
|
||||
[Since("v3.15.0")]
|
||||
public Action<int, string> onLabelClick { internal get { return m_OnLabelClick; } set { m_OnLabelClick = value; } }
|
||||
/// <summary>
|
||||
/// Whether to show axis.
|
||||
/// ||是否显示坐标轴。
|
||||
@@ -290,6 +300,17 @@ namespace XCharts.Runtime
|
||||
set { if (PropertyUtil.SetStruct(ref m_Clockwise, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Whether it is the main axis. When both X and Y axes are of the same type, the axis set to main axis will determine the orientation,
|
||||
/// such as horizontal bar chart and vertical bar chart.
|
||||
/// ||是否为主轴。当XY轴类型都相同时,设置为主轴的轴会决定朝向,如横向柱图和纵向柱图。
|
||||
/// </summary>
|
||||
[Since("v3.15.0")]
|
||||
public bool mainAxis
|
||||
{
|
||||
get { return m_MainAxis; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_MainAxis, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Category data, available in type: 'Category' axis.
|
||||
/// ||类目数据,在类目轴(type: 'category')中有效。
|
||||
/// </summary>
|
||||
@@ -405,6 +426,15 @@ namespace XCharts.Runtime
|
||||
get { return m_InsertDataToHead; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_InsertDataToHead, value)) SetAllDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// The minimum spacing between categories.
|
||||
/// ||类目之间的最小间距。
|
||||
/// </summary>
|
||||
public float minCategorySpacing
|
||||
{
|
||||
get { return m_MinCategorySpacing; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_MinCategorySpacing, value)) SetAllDirty(); }
|
||||
}
|
||||
|
||||
public override bool vertsDirty
|
||||
{
|
||||
@@ -458,6 +488,18 @@ namespace XCharts.Runtime
|
||||
base.SetComponentDirty();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重置状态。
|
||||
/// </summary>
|
||||
public override void ResetStatus()
|
||||
{
|
||||
context.minValue = 0;
|
||||
context.maxValue = 0;
|
||||
context.destMinValue = 0;
|
||||
context.destMaxValue = 0;
|
||||
context.labelValueList.Clear();
|
||||
}
|
||||
|
||||
public Axis Clone()
|
||||
{
|
||||
var axis = new Axis();
|
||||
@@ -587,13 +629,13 @@ namespace XCharts.Runtime
|
||||
return m_Position == AxisPosition.Bottom;
|
||||
}
|
||||
|
||||
public bool IsNeedShowLabel(int index, int total = 0)
|
||||
public bool IsNeedShowLabel(int index, int total = 0, string content = null)
|
||||
{
|
||||
if (total == 0)
|
||||
{
|
||||
total = context.labelValueList.Count;
|
||||
}
|
||||
return axisLabel.IsNeedShowLabel(index, total);
|
||||
return axisLabel.IsNeedShowLabel(index, total, content);
|
||||
}
|
||||
|
||||
public void SetNeedUpdateFilterData()
|
||||
@@ -729,10 +771,14 @@ namespace XCharts.Runtime
|
||||
/// <param name="value"></param>
|
||||
/// <param name="axisLength"></param>
|
||||
/// <returns></returns>
|
||||
public float GetDistance(double value, float axisLength)
|
||||
public float GetDistance(double value, float axisLength = 0)
|
||||
{
|
||||
if (context.minMaxRange == 0)
|
||||
return 0;
|
||||
if (axisLength == 0)
|
||||
{
|
||||
axisLength = context.length;
|
||||
}
|
||||
|
||||
if (IsCategory() && boundaryGap)
|
||||
{
|
||||
@@ -810,22 +856,6 @@ namespace XCharts.Runtime
|
||||
return IsCategory() ? GetDataList(dataZoom).Count : 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新刻度标签文字
|
||||
/// </summary>
|
||||
/// <param name="dataZoom"></param>
|
||||
internal void UpdateLabelText(float coordinateWidth, DataZoom dataZoom, bool forcePercent)
|
||||
{
|
||||
for (int i = 0; i < context.labelObjectList.Count; i++)
|
||||
{
|
||||
if (context.labelObjectList[i] != null)
|
||||
{
|
||||
var text = AxisHelper.GetLabelName(this, coordinateWidth, i, context.destMinValue, context.destMaxValue, dataZoom, forcePercent);
|
||||
context.labelObjectList[i].SetText(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal Vector3 GetLabelObjectPosition(int index)
|
||||
{
|
||||
if (context.labelObjectList != null && index < context.labelObjectList.Count)
|
||||
@@ -919,5 +949,43 @@ namespace XCharts.Runtime
|
||||
(float)(Math.Abs(context.minValue) * (axisLength / (Math.Abs(context.minValue) + Math.Abs(context.maxValue))))
|
||||
);
|
||||
}
|
||||
|
||||
public Vector3 GetCategoryPosition(int categoryIndex, int dataCount = 0)
|
||||
{
|
||||
if (dataCount <= 0)
|
||||
{
|
||||
dataCount = data.Count;
|
||||
}
|
||||
if (IsCategory() && dataCount > 0)
|
||||
{
|
||||
Vector3 pos;
|
||||
if (boundaryGap)
|
||||
{
|
||||
var each = context.length / dataCount;
|
||||
pos = context.start + context.dire * (each * (categoryIndex + 0.5f));
|
||||
}
|
||||
else
|
||||
{
|
||||
var each = context.length / (dataCount - 1);
|
||||
pos = context.start + context.dire * (each * categoryIndex);
|
||||
}
|
||||
if (axisLabel.distance != 0)
|
||||
{
|
||||
if (this is YAxis)
|
||||
{
|
||||
pos.x = GetLabelObjectPosition(0).x;
|
||||
}
|
||||
else
|
||||
{
|
||||
pos.y = GetLabelObjectPosition(0).y;
|
||||
}
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Vector3.zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
160
Runtime/Component/Axis/Axis3DHelper.cs
Normal file
@@ -0,0 +1,160 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using XUGL;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
public static class Axis3DHelper
|
||||
{
|
||||
public static Vector3 Get3DGridPosition(GridCoord3D grid, XAxis3D xAxis, YAxis3D yAxis, ZAxis3D zAxis, double xValue, double yValue, double zValue)
|
||||
{
|
||||
var x = xAxis.GetDistance(xValue);
|
||||
var y = yAxis.GetDistance(yValue);
|
||||
var z = zAxis.GetDistance(zValue);
|
||||
|
||||
var dest = grid.context.pointA;
|
||||
dest += xAxis.context.dire * x;
|
||||
dest += yAxis.context.dire * y;
|
||||
dest += zAxis.context.dire * z;
|
||||
return dest;
|
||||
}
|
||||
|
||||
public static Vector3 Get3DGridPosition(GridCoord3D grid, XAxis3D xAxis, YAxis3D yAxis, double xValue, double yValue)
|
||||
{
|
||||
var x = xAxis.GetDistance(xValue);
|
||||
var y = yAxis.GetDistance(yValue);
|
||||
|
||||
var dest = grid.context.pointA;
|
||||
dest += xAxis.context.dire * x;
|
||||
dest += yAxis.context.dire * y;
|
||||
return dest;
|
||||
}
|
||||
|
||||
internal static void DrawAxisTick(VertexHelper vh, Axis axis, AxisTheme theme, DataZoom dataZoom,
|
||||
Vector3 start, Vector3 end, Vector3 relativedDire)
|
||||
{
|
||||
var tickLength = axis.axisTick.GetLength(theme.tickLength);
|
||||
var axisLength = Vector3.Distance(start, end);
|
||||
var axisDire = (end - start).normalized;
|
||||
|
||||
if (axis.position == Axis.AxisPosition.Right)
|
||||
{
|
||||
relativedDire = -relativedDire;
|
||||
}
|
||||
|
||||
if (AxisHelper.NeedShowSplit(axis))
|
||||
{
|
||||
var size = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom);
|
||||
if (axis.IsTime())
|
||||
{
|
||||
size += 1;
|
||||
if (!ChartHelper.IsEquals(axis.GetLastLabelValue(), axis.context.maxValue))
|
||||
size += 1;
|
||||
}
|
||||
var tickWidth = axis.axisTick.GetWidth(theme.tickWidth);
|
||||
var tickColor = axis.axisTick.GetColor(theme.tickColor);
|
||||
var current = start;
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
var scaleWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom);
|
||||
var hideTick = (i == 0 && (!axis.axisTick.showStartTick || axis.axisTick.alignWithLabel)) ||
|
||||
(i == size - 1 && !axis.axisTick.showEndTick);
|
||||
if (axis.axisTick.show && !hideTick)
|
||||
{
|
||||
UGL.DrawLine(vh, current, current + relativedDire * tickLength, tickWidth, tickColor);
|
||||
}
|
||||
current += axisDire * scaleWidth;
|
||||
}
|
||||
}
|
||||
if (axis.show && axis.axisLine.show && axis.axisLine.showArrow)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static void DrawAxisSplit(VertexHelper vh, Axis axis, AxisTheme theme, DataZoom dataZoom,
|
||||
Vector3 start, Vector3 end, Axis relativedAxis)
|
||||
{
|
||||
if (relativedAxis == null) return;
|
||||
var axisLength = Vector3.Distance(start, end);
|
||||
var axisDire = (end - start).normalized;
|
||||
var splitLength = relativedAxis.context.length;
|
||||
var relativeDire = relativedAxis.context.dire;
|
||||
var axisLineWidth = axis.axisLine.GetWidth(theme.lineWidth);
|
||||
splitLength -= axisLineWidth;
|
||||
var lineColor = axis.splitLine.GetColor(theme.splitLineColor);
|
||||
var lineWidth = axis.splitLine.GetWidth(theme.lineWidth);
|
||||
var lineType = axis.splitLine.GetType(theme.splitLineType);
|
||||
|
||||
var size = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom);
|
||||
if (axis.IsTime())
|
||||
{
|
||||
size += 1;
|
||||
if (!ChartHelper.IsEquals(axis.GetLastLabelValue(), axis.context.maxValue))
|
||||
size += 1;
|
||||
}
|
||||
|
||||
var current = start;
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
var scaleWidth = AxisHelper.GetScaleWidth(axis, axisLength, axis.IsTime() ? i : i + 1, dataZoom);
|
||||
if (axis.boundaryGap && axis.axisTick.alignWithLabel)
|
||||
current -= axisDire * scaleWidth / 2;
|
||||
|
||||
if (axis.splitArea.show && i <= size - 1)
|
||||
{
|
||||
var p1 = current;
|
||||
var p2 = current + relativeDire * splitLength;
|
||||
var p3 = p2 + axisDire * scaleWidth;
|
||||
var p4 = p1 + axisDire * scaleWidth;
|
||||
UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, axis.splitArea.GetColor(i, theme));
|
||||
}
|
||||
if (axis.splitLine.show)
|
||||
{
|
||||
if (axis.splitLine.NeedShow(i, size))
|
||||
{
|
||||
if (relativedAxis == null || !relativedAxis.axisLine.show
|
||||
|| (Vector3.Distance(current, relativedAxis.context.start) > 0.5f && Vector3.Distance(current, relativedAxis.context.end) > 0.5f))
|
||||
{
|
||||
ChartDrawer.DrawLineStyle(vh,
|
||||
lineType,
|
||||
lineWidth,
|
||||
current,
|
||||
current + relativeDire * splitLength,
|
||||
lineColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
current += axisDire * scaleWidth;
|
||||
}
|
||||
}
|
||||
|
||||
public static Vector3 GetLabelPosition(int i, Axis axis, Axis relativedAxis, AxisTheme theme, float scaleWid)
|
||||
{
|
||||
var axisStart = axis.context.start;
|
||||
var axisEnd = axis.context.end;
|
||||
var axisDire = axis.context.dire;
|
||||
var relativedDire = relativedAxis != null ? relativedAxis.context.dire : Vector3.zero;
|
||||
var axisLength = Vector3.Distance(axisStart, axisEnd);
|
||||
var inside = axis.axisLabel.inside;
|
||||
var fontSize = axis.axisLabel.textStyle.GetFontSize(theme);
|
||||
var current = axis.offset;
|
||||
|
||||
if (axis.position == Axis.AxisPosition.Right)
|
||||
{
|
||||
relativedDire = -relativedDire;
|
||||
}
|
||||
|
||||
if (axis.IsTime() || axis.IsValue())
|
||||
{
|
||||
scaleWid = axis.context.minMaxRange != 0 ?
|
||||
axis.GetDistance(axis.GetLabelValue(i), axisLength) :
|
||||
0;
|
||||
}
|
||||
|
||||
return axisStart + axisDire * scaleWid + axis.axisLabel.offset - relativedDire * (axis.axisLabel.distance + fontSize / 2);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
11
Runtime/Component/Axis/Axis3DHelper.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 52469636872044a81a291bb00b71a140
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -15,6 +15,9 @@ namespace XCharts.Runtime
|
||||
/// 坐标轴的起点Y
|
||||
/// </summary>
|
||||
public float y;
|
||||
public Vector3 start;
|
||||
public Vector3 end;
|
||||
public Vector3 dire;
|
||||
/// <summary>
|
||||
/// 坐标轴原点X
|
||||
/// </summary>
|
||||
@@ -25,6 +28,7 @@ namespace XCharts.Runtime
|
||||
public float zeroY;
|
||||
public float width;
|
||||
public float height;
|
||||
public float length;
|
||||
public Vector3 position;
|
||||
public float left;
|
||||
public float right;
|
||||
@@ -65,6 +69,7 @@ namespace XCharts.Runtime
|
||||
public List<string> runtimeData { get { return m_RuntimeData; } }
|
||||
public List<double> labelValueList { get { return m_LabelValueList; } }
|
||||
public List<ChartLabel> labelObjectList { get { return m_AxisLabelList; } }
|
||||
public List<int> sortedDataIndices { get { return m_SortedDataIndices; } }
|
||||
public int dataZoomStartIndex;
|
||||
/// <summary>
|
||||
/// 添加过的历史数据总数
|
||||
@@ -82,6 +87,7 @@ namespace XCharts.Runtime
|
||||
private List<ChartLabel> m_AxisLabelList = new List<ChartLabel>();
|
||||
private List<double> m_LabelValueList = new List<double>();
|
||||
private List<string> m_RuntimeData = new List<string>();
|
||||
private List<int> m_SortedDataIndices = new List<int>();
|
||||
|
||||
internal void Clear()
|
||||
{
|
||||
@@ -114,24 +120,25 @@ namespace XCharts.Runtime
|
||||
if (end > data.Count) end = data.Count;
|
||||
}
|
||||
|
||||
var minZoomRatio = (int)(data.Count * dataZoom.minZoomRatio);
|
||||
if (start != filterStart ||
|
||||
end != filterEnd ||
|
||||
dataZoom.minShowNum != filterMinShow ||
|
||||
minZoomRatio != filterMinShow ||
|
||||
isNeedUpdateFilterData)
|
||||
{
|
||||
filterStart = start;
|
||||
filterEnd = end;
|
||||
filterMinShow = dataZoom.minShowNum;
|
||||
filterMinShow = minZoomRatio;
|
||||
isNeedUpdateFilterData = false;
|
||||
|
||||
if (data.Count > 0)
|
||||
{
|
||||
if (range < dataZoom.minShowNum)
|
||||
if (range < minZoomRatio)
|
||||
{
|
||||
if (dataZoom.minShowNum > data.Count)
|
||||
if (dataZoom.minZoomRatio > data.Count)
|
||||
range = data.Count;
|
||||
else
|
||||
range = dataZoom.minShowNum;
|
||||
range = minZoomRatio;
|
||||
}
|
||||
if (range > data.Count - start)
|
||||
start = data.Count - range;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
using XCharts.Runtime;
|
||||
using XUGL;
|
||||
@@ -31,6 +33,33 @@ namespace XCharts
|
||||
|
||||
protected virtual Orient orient { get; set; }
|
||||
|
||||
public override void OnPointerClick(PointerEventData eventData)
|
||||
{
|
||||
if (component.onLabelClick == null) return;
|
||||
var labelObjects = component.context.labelObjectList;
|
||||
for (int i = 0; i < labelObjects.Count; i++)
|
||||
{
|
||||
var label = labelObjects[i];
|
||||
if (label == null) continue;
|
||||
if (label.InRect(chart.pointerPos))
|
||||
{
|
||||
component.onLabelClick.Invoke(i, label.text.GetText());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// public override void DrawTop(VertexHelper vh)
|
||||
// {
|
||||
// var color = Color.red;
|
||||
// color.a = 0.5f;
|
||||
// foreach (var label in component.context.labelObjectList)
|
||||
// {
|
||||
// if (label == null) continue;
|
||||
// UGL.DrawRectangle(vh, label.rect, color);
|
||||
// }
|
||||
// }
|
||||
|
||||
protected virtual void UpdatePointerValue(Axis axis)
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord>(axis.gridIndex);
|
||||
@@ -58,7 +87,7 @@ namespace XCharts
|
||||
(!axis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2)))
|
||||
{
|
||||
axis.context.pointerValue = j;
|
||||
axis.context.pointerLabelPosition = axis.GetLabelObjectPosition(j);
|
||||
axis.context.pointerLabelPosition = axis.GetCategoryPosition(j, dataCount);
|
||||
if (j != lastPointerValue)
|
||||
{
|
||||
if (chart.onAxisPointerValueChanged != null)
|
||||
@@ -78,7 +107,7 @@ namespace XCharts
|
||||
(!axis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2)))
|
||||
{
|
||||
axis.context.pointerValue = j;
|
||||
axis.context.pointerLabelPosition = axis.GetLabelObjectPosition(j);
|
||||
axis.context.pointerLabelPosition = axis.GetCategoryPosition(j, dataCount);
|
||||
if (j != lastPointerValue)
|
||||
{
|
||||
if (chart.onAxisPointerValueChanged != null)
|
||||
@@ -139,7 +168,7 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
internal void UpdateAxisMinMaxValue(int axisIndex, Axis axis, bool updateChart = true)
|
||||
internal void UpdateAxisMinMaxValue(int axisIndex, Axis axis, bool cancelAnimation = false)
|
||||
{
|
||||
if (!axis.show)
|
||||
return;
|
||||
@@ -147,8 +176,12 @@ namespace XCharts
|
||||
if (axis.IsCategory())
|
||||
{
|
||||
axis.context.minValue = 0;
|
||||
axis.context.maxValue = SeriesHelper.GetMaxSerieDataCount(chart.series) - 1;
|
||||
axis.context.maxValue = axis.data.Count > 0 ? axis.data.Count - 1 : SeriesHelper.GetMaxSerieDataCount(chart.series) - 1;
|
||||
axis.context.minMaxRange = axis.context.maxValue;
|
||||
if (chart.HasRealtimeSortSerie(axis.gridIndex))
|
||||
{
|
||||
UpdateAxisLabelText(axis);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -173,7 +206,7 @@ namespace XCharts
|
||||
{
|
||||
m_LastSplitNumber = axis.splitNumber;
|
||||
m_LastInterval = axis.interval;
|
||||
axis.UpdateMinMaxValue(tempMinValue, tempMaxValue, axis.context.needAnimation);
|
||||
axis.UpdateMinMaxValue(tempMinValue, tempMaxValue, !cancelAnimation && axis.context.needAnimation);
|
||||
axis.context.offset = 0;
|
||||
axis.context.lastCheckInverse = axis.inverse;
|
||||
UpdateAxisTickValueList(axis);
|
||||
@@ -191,14 +224,11 @@ namespace XCharts
|
||||
}
|
||||
}
|
||||
|
||||
if (updateChart)
|
||||
{
|
||||
UpdateAxisLabelText(axis);
|
||||
chart.RefreshChart();
|
||||
}
|
||||
UpdateAxisLabelText(axis);
|
||||
chart.RefreshChart();
|
||||
}
|
||||
|
||||
if (axis.context.needAnimation && (axis.context.minValue != axis.context.destMinValue || axis.context.maxValue != axis.context.destMaxValue))
|
||||
if (!cancelAnimation && axis.context.needAnimation && (axis.context.minValue != axis.context.destMinValue || axis.context.maxValue != axis.context.destMaxValue))
|
||||
{
|
||||
var duration = axis.animation.duration == 0
|
||||
? SeriesHelper.GetMinAnimationDuration(chart.series) / 1000f
|
||||
@@ -239,7 +269,93 @@ namespace XCharts
|
||||
var isPercentStack = SeriesHelper.IsPercentStack<Bar>(chart.series);
|
||||
var dataZoom = chart.GetDataZoomOfAxis(axis);
|
||||
|
||||
axis.UpdateLabelText(runtimeWidth, dataZoom, isPercentStack);
|
||||
UpdateLabelText(axis, runtimeWidth, dataZoom, isPercentStack);
|
||||
}
|
||||
|
||||
internal void UpdateLabelText(Axis axis, float coordinateWidth, DataZoom dataZoom, bool forcePercent)
|
||||
{
|
||||
var context = axis.context;
|
||||
var destMaxValue = context.destMaxValue;
|
||||
var destMinValue = context.destMinValue;
|
||||
var isCategory = axis.IsCategory();
|
||||
var serie = chart.GetSerie(0);
|
||||
if (isCategory && serie != null && serie.useSortData)
|
||||
{
|
||||
var isY = axis is YAxis;
|
||||
var showData = serie.GetDataList(dataZoom, true);
|
||||
if (CheckSortedDataChanged(axis, showData))
|
||||
{
|
||||
for (int i = 0; i < context.labelObjectList.Count; i++)
|
||||
{
|
||||
if (context.labelObjectList[i] != null)
|
||||
{
|
||||
var index = i < showData.Count ? showData[i].index : i;
|
||||
var text = AxisHelper.GetLabelName(axis, coordinateWidth, index, destMinValue, destMaxValue, dataZoom, forcePercent, chart.useUtc, i);
|
||||
context.labelObjectList[i].SetText(text);
|
||||
}
|
||||
}
|
||||
SaveSortedDataIndex(axis, showData);
|
||||
}
|
||||
if (CheckSortedDataAnimation(axis, showData))
|
||||
{
|
||||
float diff = axis.context.scaleWidth / 2;
|
||||
for (int i = 0; i < context.labelObjectList.Count; i++)
|
||||
{
|
||||
var labelObject = context.labelObjectList[i];
|
||||
if (labelObject != null)
|
||||
{
|
||||
if (i < showData.Count)
|
||||
{
|
||||
var serieData = showData[i];
|
||||
var pos = serieData.context.exchangePosition;
|
||||
if (ChartHelper.IsZeroVector(pos)) continue;
|
||||
var sourPos = labelObject.GetPosition();
|
||||
labelObject.SetPosition(isY ? new Vector3(sourPos.x, pos.y + diff) : new Vector3(pos.x + diff, sourPos.y));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < context.labelObjectList.Count; i++)
|
||||
{
|
||||
if (context.labelObjectList[i] != null)
|
||||
{
|
||||
var text = AxisHelper.GetLabelName(axis, coordinateWidth, i, destMinValue, destMaxValue, dataZoom, forcePercent, chart.useUtc);
|
||||
context.labelObjectList[i].SetText(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static bool CheckSortedDataChanged(Axis axis, List<SerieData> dataList)
|
||||
{
|
||||
if (dataList.Count != axis.context.sortedDataIndices.Count) return true;
|
||||
for (int i = 0; i < dataList.Count; i++)
|
||||
{
|
||||
if (dataList[i].index != axis.context.sortedDataIndices[i]) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool CheckSortedDataAnimation(Axis axis, List<SerieData> dataList)
|
||||
{
|
||||
if (!axis.IsCategory()) return false;
|
||||
foreach (var data in dataList)
|
||||
{
|
||||
if (!data.context.exchangeEnd) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void SaveSortedDataIndex(Axis axis, List<SerieData> dataList)
|
||||
{
|
||||
axis.context.sortedDataIndices.Clear();
|
||||
for (int i = 0; i < dataList.Count; i++)
|
||||
{
|
||||
axis.context.sortedDataIndices.Add(dataList[i].index);
|
||||
}
|
||||
}
|
||||
|
||||
internal void UpdateAxisTickValueList(Axis axis)
|
||||
@@ -248,7 +364,7 @@ namespace XCharts
|
||||
{
|
||||
var lastCount = axis.context.labelValueList.Count;
|
||||
axis.context.tickValue = DateTimeUtil.UpdateTimeAxisDateTimeList(axis.context.labelValueList,
|
||||
(int)axis.context.minValue, (int)axis.context.maxValue, axis.splitNumber);
|
||||
axis.context.minValue, axis.context.maxValue, axis.splitNumber, axis.ceilRate, !chart.useUtc);
|
||||
|
||||
if (axis.context.labelValueList.Count != lastCount)
|
||||
axis.SetAllDirty();
|
||||
@@ -331,13 +447,17 @@ namespace XCharts
|
||||
return Math.Pow(10, n);
|
||||
}
|
||||
|
||||
internal void CheckValueLabelActive(Axis axis, int i, ChartLabel label, Vector3 pos)
|
||||
internal void CheckValueLabelActive(Axis axis, int i, ChartLabel label, Vector3 pos, string content = null)
|
||||
{
|
||||
if (!axis.show || !axis.axisLabel.show)
|
||||
{
|
||||
label.SetTextActive(false);
|
||||
return;
|
||||
}
|
||||
if (content == null)
|
||||
{
|
||||
content = label.text.GetText();
|
||||
}
|
||||
if (axis.IsValue())
|
||||
{
|
||||
if (orient == Orient.Horizonal)
|
||||
@@ -345,12 +465,12 @@ namespace XCharts
|
||||
if (i == 0)
|
||||
{
|
||||
var dist = GetLabelPosition(0, 1).x - pos.x;
|
||||
label.SetTextActive(axis.IsNeedShowLabel(i) && dist > label.text.GetPreferredWidth());
|
||||
label.SetTextActive(axis.IsNeedShowLabel(i, 0, content) && dist > label.text.GetPreferredWidth());
|
||||
}
|
||||
else if (i == axis.context.labelValueList.Count - 1)
|
||||
{
|
||||
var dist = pos.x - GetLabelPosition(0, i - 1).x;
|
||||
label.SetTextActive(axis.IsNeedShowLabel(i) && dist > label.text.GetPreferredWidth());
|
||||
label.SetTextActive(axis.IsNeedShowLabel(i, 0, content) && dist > label.text.GetPreferredWidth());
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -358,22 +478,140 @@ namespace XCharts
|
||||
if (i == 0)
|
||||
{
|
||||
var dist = GetLabelPosition(0, 1).y - pos.y;
|
||||
label.SetTextActive(axis.IsNeedShowLabel(i) && dist > label.text.GetPreferredHeight());
|
||||
label.SetTextActive(axis.IsNeedShowLabel(i, 0, content) && dist > label.text.GetPreferredHeight());
|
||||
}
|
||||
else if (i == axis.context.labelValueList.Count - 1)
|
||||
{
|
||||
var dist = pos.y - GetLabelPosition(0, i - 1).y;
|
||||
label.SetTextActive(axis.IsNeedShowLabel(i) && dist > label.text.GetPreferredHeight());
|
||||
label.SetTextActive(axis.IsNeedShowLabel(i, 0, content) && dist > label.text.GetPreferredHeight());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void InitAxis3D(Axis relativedAxis, Orient orient)
|
||||
{
|
||||
Axis axis = component;
|
||||
var axisLength = (axis.context.end - axis.context.start).magnitude;
|
||||
if (axisLength == 0) return;
|
||||
chart.InitAxisRuntimeData(axis);
|
||||
UpdateAxisMinMaxValue(axis.index, axis, true);
|
||||
|
||||
var objName = ChartCached.GetComponentObjectName(axis);
|
||||
var axisObj = ChartHelper.AddObject(objName,
|
||||
chart.transform,
|
||||
chart.chartMinAnchor,
|
||||
chart.chartMaxAnchor,
|
||||
chart.chartPivot,
|
||||
chart.chartSizeDelta, -1, chart.childrenNodeNames);
|
||||
|
||||
axisObj.SetActive(axis.show);
|
||||
axisObj.hideFlags = chart.chartHideFlags;
|
||||
ChartHelper.HideAllObject(axisObj);
|
||||
|
||||
axis.gameObject = axisObj;
|
||||
axis.context.labelObjectList.Clear();
|
||||
|
||||
if (!axis.show)
|
||||
return;
|
||||
|
||||
var axisLabelTextStyle = axis.axisLabel.textStyle;
|
||||
var dataZoom = chart.GetDataZoomOfAxis(axis);
|
||||
var splitNumber = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom);
|
||||
var totalWidth = 0f;
|
||||
var eachWidth = AxisHelper.GetEachWidth(axis, axisLength, dataZoom);
|
||||
var gapWidth = axis.boundaryGap ? eachWidth / 2 : 0;
|
||||
|
||||
var textWidth = axis.axisLabel.width > 0 ?
|
||||
axis.axisLabel.width :
|
||||
AxisHelper.GetScaleWidth(axis, axisLength, 0, dataZoom);
|
||||
|
||||
var textHeight = axis.axisLabel.height > 0 ?
|
||||
axis.axisLabel.height :
|
||||
20f;
|
||||
|
||||
var isPercentStack = SeriesHelper.IsPercentStack<Bar>(chart.series);
|
||||
var inside = axis.axisLabel.inside;
|
||||
var defaultAlignment = orient == Orient.Horizonal ? TextAnchor.MiddleCenter :
|
||||
((inside && axis.IsLeft()) || (!inside && axis.IsRight()) ?
|
||||
TextAnchor.MiddleLeft :
|
||||
TextAnchor.MiddleRight);
|
||||
if (axis.IsCategory() && axis.boundaryGap)
|
||||
splitNumber -= 1;
|
||||
axis.context.aligment = defaultAlignment;
|
||||
var sortSerie = chart.GetRealtimeSortSerie(axis.gridIndex);
|
||||
if (sortSerie != null)
|
||||
{
|
||||
SerieHelper.UpdateSerieRuntimeFilterData(sortSerie);
|
||||
}
|
||||
var showData = sortSerie != null ? sortSerie.GetDataList(dataZoom, true) : null;
|
||||
for (int i = 0; i < splitNumber; i++)
|
||||
{
|
||||
var labelWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom);
|
||||
var sortIndex = sortSerie != null ? (i < showData.Count ? showData[i].index : i) : i;
|
||||
var labelName = AxisHelper.GetLabelName(axis, axisLength, sortIndex,
|
||||
axis.context.destMinValue,
|
||||
axis.context.destMaxValue,
|
||||
dataZoom, isPercentStack, chart.useUtc, i);
|
||||
|
||||
var label = ChartHelper.AddAxisLabelObject(splitNumber, i,
|
||||
ChartCached.GetAxisLabelName(i),
|
||||
axisObj.transform,
|
||||
new Vector2(textWidth, textHeight),
|
||||
axis, chart.theme.axis, labelName,
|
||||
Color.clear,
|
||||
defaultAlignment,
|
||||
chart.theme.GetColor(i));
|
||||
|
||||
if (i == 0)
|
||||
axis.axisLabel.SetRelatedText(label.text, labelWidth);
|
||||
|
||||
var pos = GetLabelPosition(totalWidth + gapWidth, i);
|
||||
label.SetPosition(pos);
|
||||
axis.context.labelObjectList.Add(label);
|
||||
|
||||
totalWidth += labelWidth;
|
||||
}
|
||||
if (axis.axisName.show)
|
||||
{
|
||||
ChartLabel label = null;
|
||||
var offset = axis.axisName.labelStyle.offset;
|
||||
var autoColor = axis.axisLine.GetColor(chart.theme.axis.lineColor);
|
||||
switch (axis.axisName.labelStyle.position)
|
||||
{
|
||||
case LabelStyle.Position.Start:
|
||||
|
||||
label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
|
||||
chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
|
||||
label.SetActive(axis.axisName.labelStyle.show, true);
|
||||
label.SetPosition(axis.context.start + offset);
|
||||
break;
|
||||
|
||||
case LabelStyle.Position.Middle:
|
||||
|
||||
label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
|
||||
chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
|
||||
label.SetActive(axis.axisName.labelStyle.show, true);
|
||||
label.SetPosition((axis.context.start + axis.context.end) / 2 + offset);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
|
||||
chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
|
||||
label.SetActive(axis.axisName.labelStyle.show, true);
|
||||
label.SetPosition(axis.context.end + offset);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void InitAxis(Axis relativedAxis, Orient orient,
|
||||
float axisStartX, float axisStartY, float axisLength, float relativedLength)
|
||||
{
|
||||
Axis axis = component;
|
||||
chart.InitAxisRuntimeData(axis);
|
||||
UpdateAxisMinMaxValue(axis.index, axis, true);
|
||||
|
||||
var objName = ChartCached.GetComponentObjectName(axis);
|
||||
var axisObj = ChartHelper.AddObject(objName,
|
||||
@@ -381,7 +619,7 @@ namespace XCharts
|
||||
chart.chartMinAnchor,
|
||||
chart.chartMaxAnchor,
|
||||
chart.chartPivot,
|
||||
chart.chartSizeDelta);
|
||||
chart.chartSizeDelta, -1, chart.childrenNodeNames);
|
||||
|
||||
axisObj.SetActive(axis.show);
|
||||
axisObj.hideFlags = chart.chartHideFlags;
|
||||
@@ -420,13 +658,20 @@ namespace XCharts
|
||||
if (axis.IsCategory() && axis.boundaryGap)
|
||||
splitNumber -= 1;
|
||||
axis.context.aligment = defaultAlignment;
|
||||
var sortSerie = chart.GetRealtimeSortSerie(axis.gridIndex);
|
||||
if (sortSerie != null)
|
||||
{
|
||||
SerieHelper.UpdateSerieRuntimeFilterData(sortSerie);
|
||||
}
|
||||
var showData = sortSerie != null ? sortSerie.GetDataList(dataZoom, true) : null;
|
||||
for (int i = 0; i < splitNumber; i++)
|
||||
{
|
||||
var labelWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom);
|
||||
var labelName = AxisHelper.GetLabelName(axis, axisLength, i,
|
||||
var sortIndex = sortSerie != null ? (i < showData.Count ? showData[i].index : i) : i;
|
||||
var labelName = AxisHelper.GetLabelName(axis, axisLength, sortIndex,
|
||||
axis.context.destMinValue,
|
||||
axis.context.destMaxValue,
|
||||
dataZoom, isPercentStack);
|
||||
dataZoom, isPercentStack, chart.useUtc, i);
|
||||
|
||||
var label = ChartHelper.AddAxisLabelObject(splitNumber, i,
|
||||
ChartCached.GetAxisLabelName(i),
|
||||
@@ -442,7 +687,7 @@ namespace XCharts
|
||||
|
||||
var pos = GetLabelPosition(totalWidth + gapWidth, i);
|
||||
label.SetPosition(pos);
|
||||
CheckValueLabelActive(axis, i, label, pos);
|
||||
CheckValueLabelActive(axis, i, label, pos, labelName);
|
||||
|
||||
axis.context.labelObjectList.Add(label);
|
||||
|
||||
@@ -450,8 +695,8 @@ namespace XCharts
|
||||
}
|
||||
if (axis.axisName.show)
|
||||
{
|
||||
ChartLabel label = null;
|
||||
var relativedDist = (relativedAxis == null ? 0 : relativedAxis.context.offset);
|
||||
ChartLabel label;
|
||||
var relativedDist = relativedAxis == null ? 0 : relativedAxis.context.offset;
|
||||
var zeroPos = new Vector3(axisStartX, axisStartY + relativedDist);
|
||||
var offset = axis.axisName.labelStyle.offset;
|
||||
var autoColor = axis.axisLine.GetColor(chart.theme.axis.lineColor);
|
||||
@@ -465,7 +710,7 @@ namespace XCharts
|
||||
|
||||
label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
|
||||
chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleRight);
|
||||
label.SetActive(axis.axisName.labelStyle.show);
|
||||
label.SetActive(axis.axisName.labelStyle.show, true);
|
||||
label.SetPosition(axis.position == Axis.AxisPosition.Top ?
|
||||
new Vector2(zeroPos.x - offset.x, axisStartY + relativedLength + offset.y + axis.offset) :
|
||||
new Vector2(zeroPos.x - offset.x, posY + offset.y));
|
||||
@@ -475,7 +720,7 @@ namespace XCharts
|
||||
|
||||
label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
|
||||
chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
|
||||
label.SetActive(axis.axisName.labelStyle.show);
|
||||
label.SetActive(axis.axisName.labelStyle.show, true);
|
||||
label.SetPosition(axis.position == Axis.AxisPosition.Top ?
|
||||
new Vector2(axisStartX + axisLength / 2 + offset.x, axisStartY + relativedLength - offset.y + axis.offset) :
|
||||
new Vector2(axisStartX + axisLength / 2 + offset.x, posY + offset.y));
|
||||
@@ -485,7 +730,7 @@ namespace XCharts
|
||||
|
||||
label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
|
||||
chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleLeft);
|
||||
label.SetActive(axis.axisName.labelStyle.show);
|
||||
label.SetActive(axis.axisName.labelStyle.show, true);
|
||||
label.SetPosition(axis.position == Axis.AxisPosition.Top ?
|
||||
new Vector2(axisStartX + axisLength + offset.x, axisStartY + relativedLength + offset.y + axis.offset) :
|
||||
new Vector2(axisStartX + axisLength + offset.x, posY + offset.y));
|
||||
@@ -502,7 +747,7 @@ namespace XCharts
|
||||
|
||||
label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
|
||||
chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
|
||||
label.SetActive(axis.axisName.labelStyle.show);
|
||||
label.SetActive(axis.axisName.labelStyle.show, true);
|
||||
label.SetPosition(axis.position == Axis.AxisPosition.Right ?
|
||||
new Vector2(axisStartX + relativedLength + offset.x + axis.offset, axisStartY - offset.y) :
|
||||
new Vector2(posX + offset.x, axisStartY - offset.y));
|
||||
@@ -512,7 +757,7 @@ namespace XCharts
|
||||
|
||||
label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
|
||||
chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
|
||||
label.SetActive(axis.axisName.labelStyle.show);
|
||||
label.SetActive(axis.axisName.labelStyle.show, true);
|
||||
label.SetPosition(axis.position == Axis.AxisPosition.Right ?
|
||||
new Vector2(axisStartX + relativedLength - offset.x + axis.offset, axisStartY + axisLength / 2 + offset.y) :
|
||||
new Vector2(posX + offset.x, axisStartY + axisLength / 2 + offset.y));
|
||||
@@ -522,7 +767,7 @@ namespace XCharts
|
||||
//LabelStyle.Position
|
||||
label = ChartHelper.AddChartLabel(s_DefaultAxisName, axisObj.transform, axis.axisName.labelStyle,
|
||||
chart.theme.axis, axis.axisName.name, autoColor, TextAnchor.MiddleCenter);
|
||||
label.SetActive(axis.axisName.labelStyle.show);
|
||||
label.SetActive(axis.axisName.labelStyle.show, true);
|
||||
label.SetPosition(axis.position == Axis.AxisPosition.Right ?
|
||||
new Vector2(axisStartX + relativedLength + offset.x + axis.offset, axisStartY + axisLength + offset.y) :
|
||||
new Vector2(posX + offset.x, axisStartY + axisLength + offset.y));
|
||||
@@ -587,17 +832,19 @@ namespace XCharts
|
||||
var lineWidth = axis.axisLine.GetWidth(theme.lineWidth);
|
||||
var lineType = axis.axisLine.GetType(theme.lineType);
|
||||
var lineColor = axis.axisLine.GetColor(theme.lineColor);
|
||||
var sExtendLength = axis.axisLine.startExtendLength;
|
||||
var eExtendLength = axis.axisLine.endExtendLength;
|
||||
|
||||
if (orient == Orient.Horizonal)
|
||||
{
|
||||
var left = new Vector3(startX - lineWidth - (inverse ? offset : 0), startY);
|
||||
var right = new Vector3(startX + axisLength + lineWidth + (!inverse ? offset : 0), startY);
|
||||
var left = new Vector3(startX - lineWidth - (inverse ? offset : 0) - sExtendLength, startY);
|
||||
var right = new Vector3(startX + axisLength + lineWidth + (!inverse ? offset : 0) + eExtendLength, startY);
|
||||
ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, left, right, lineColor);
|
||||
}
|
||||
else
|
||||
{
|
||||
var bottom = new Vector3(startX, startY - lineWidth - (inverse ? offset : 0));
|
||||
var top = new Vector3(startX, startY + axisLength + lineWidth + (!inverse ? offset : 0));
|
||||
var bottom = new Vector3(startX, startY - lineWidth - (inverse ? offset : 0) - sExtendLength);
|
||||
var top = new Vector3(startX, startY + axisLength + lineWidth + (!inverse ? offset : 0) + eExtendLength);
|
||||
ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, bottom, top, lineColor);
|
||||
}
|
||||
}
|
||||
@@ -611,12 +858,6 @@ namespace XCharts
|
||||
if (AxisHelper.NeedShowSplit(axis))
|
||||
{
|
||||
var size = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom);
|
||||
if (axis.IsTime())
|
||||
{
|
||||
size += 1;
|
||||
if (!ChartHelper.IsEquals(axis.GetLastLabelValue(), axis.context.maxValue))
|
||||
size += 1;
|
||||
}
|
||||
var tickWidth = axis.axisTick.GetWidth(theme.tickWidth);
|
||||
var tickColor = axis.axisTick.GetColor(theme.tickColor);
|
||||
var current = orient == Orient.Horizonal ? startX : startY;
|
||||
|
||||
@@ -65,7 +65,10 @@ namespace XCharts.Runtime
|
||||
if (axis.splitNumber <= 0)
|
||||
{
|
||||
var eachWid = coordinateWid / dataCount;
|
||||
var min = axis is YAxis ? 20 : 80;
|
||||
|
||||
var min = axis.minCategorySpacing > 0
|
||||
? axis.minCategorySpacing
|
||||
: (Mathf.Abs(axis.context.dire.y) < 0.01 ? 80 : 20);
|
||||
if (eachWid > min) return dataCount;
|
||||
var tick = Mathf.CeilToInt(min / eachWid);
|
||||
return tick <= 1 ? dataCount : (int)(dataCount / tick);
|
||||
@@ -113,9 +116,10 @@ namespace XCharts.Runtime
|
||||
/// <param name="dataZoom"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetLabelName(Axis axis, float coordinateWidth, int index, double minValue, double maxValue,
|
||||
DataZoom dataZoom, bool forcePercent)
|
||||
DataZoom dataZoom, bool forcePercent, bool useUtc, int sortIndex = -1)
|
||||
{
|
||||
int split = GetSplitNumber(axis, coordinateWidth, dataZoom);
|
||||
if (sortIndex == -1) sortIndex = index;
|
||||
if (axis.type == Axis.AxisType.Value)
|
||||
{
|
||||
if (minValue == 0 && maxValue == 0)
|
||||
@@ -134,7 +138,7 @@ namespace XCharts.Runtime
|
||||
if (forcePercent)
|
||||
return string.Format("{0}%", (int)value);
|
||||
else
|
||||
return axis.axisLabel.GetFormatterContent(index, value, minValue, maxValue);
|
||||
return axis.axisLabel.GetFormatterContent(sortIndex, axis.context.labelValueList.Count, value, minValue, maxValue);
|
||||
}
|
||||
else if (axis.type == Axis.AxisType.Log)
|
||||
{
|
||||
@@ -147,7 +151,7 @@ namespace XCharts.Runtime
|
||||
minValue = -minValue;
|
||||
maxValue = -maxValue;
|
||||
}
|
||||
return axis.axisLabel.GetFormatterContent(index, value, minValue, maxValue, true);
|
||||
return axis.axisLabel.GetFormatterContent(sortIndex, 0, value, minValue, maxValue, true);
|
||||
}
|
||||
else if (axis.type == Axis.AxisType.Time)
|
||||
{
|
||||
@@ -157,7 +161,7 @@ namespace XCharts.Runtime
|
||||
return string.Empty;
|
||||
|
||||
var value = axis.GetLabelValue(index);
|
||||
return axis.axisLabel.GetFormatterDateTime(index, value, minValue, maxValue);
|
||||
return axis.axisLabel.GetFormatterDateTime(sortIndex, axis.context.labelValueList.Count, value, minValue, maxValue, !useUtc);
|
||||
}
|
||||
var showData = axis.GetDataList(dataZoom);
|
||||
int dataCount = showData.Count;
|
||||
@@ -169,18 +173,18 @@ namespace XCharts.Runtime
|
||||
{
|
||||
if (index > 0)
|
||||
{
|
||||
var residue = (dataCount - 1) - split * rate;
|
||||
var residue = dataCount - 1 - split * rate;
|
||||
var newIndex = residue + (index - 1) * rate;
|
||||
if (newIndex < 0)
|
||||
newIndex = 0;
|
||||
return axis.axisLabel.GetFormatterContent(newIndex, showData[newIndex]);
|
||||
return axis.axisLabel.GetFormatterContent(sortIndex, dataCount, showData[newIndex]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (axis.boundaryGap && coordinateWidth / dataCount > 5)
|
||||
return string.Empty;
|
||||
else
|
||||
return axis.axisLabel.GetFormatterContent(0, showData[0]);
|
||||
return axis.axisLabel.GetFormatterContent(sortIndex, dataCount, showData[0]);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -188,7 +192,7 @@ namespace XCharts.Runtime
|
||||
int newIndex = index * rate;
|
||||
if (newIndex < dataCount)
|
||||
{
|
||||
return axis.axisLabel.GetFormatterContent(newIndex, showData[newIndex]);
|
||||
return axis.axisLabel.GetFormatterContent(sortIndex, dataCount, showData[newIndex]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -196,7 +200,7 @@ namespace XCharts.Runtime
|
||||
if (axis.boundaryGap && ((diff > 0 && diff / rate < 0.4f) || dataCount >= axis.data.Count))
|
||||
return string.Empty;
|
||||
else
|
||||
return axis.axisLabel.GetFormatterContent(dataCount - 1, showData[dataCount - 1]);
|
||||
return axis.axisLabel.GetFormatterContent(sortIndex, dataCount, showData[dataCount - 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -350,8 +354,8 @@ namespace XCharts.Runtime
|
||||
axis.splitNumber = splitNumber;
|
||||
return;
|
||||
}
|
||||
if (axis.type == Axis.AxisType.Time) { }
|
||||
else if (axis.minMaxType == Axis.AxisMinMaxType.Custom)
|
||||
if (ceilRate == 0) ceilRate = axis.ceilRate;
|
||||
if (axis.minMaxType == Axis.AxisMinMaxType.Custom)
|
||||
{
|
||||
if (axis.min != 0 || axis.max != 0)
|
||||
{
|
||||
@@ -367,13 +371,19 @@ namespace XCharts.Runtime
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (axis.type == Axis.AxisType.Time)
|
||||
{
|
||||
if (ceilRate != 0)
|
||||
{
|
||||
minValue = ChartHelper.GetMinCeilRate(minValue, ceilRate);
|
||||
maxValue = ChartHelper.GetMaxCeilRate(maxValue, ceilRate);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ceilRate == 0) ceilRate = axis.ceilRate;
|
||||
switch (axis.minMaxType)
|
||||
{
|
||||
case Axis.AxisMinMaxType.Default:
|
||||
|
||||
if (minValue == 0 && maxValue == 0) { }
|
||||
else if (minValue > 0 && maxValue > 0)
|
||||
{
|
||||
@@ -532,9 +542,9 @@ namespace XCharts.Runtime
|
||||
/// <param name="scaleWidth"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value)
|
||||
public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value, float gap = 0)
|
||||
{
|
||||
return GetAxisPositionInternal(grid, axis, scaleWidth, value, false, true);
|
||||
return GetAxisPositionInternal(grid, axis, scaleWidth, value, false, true, gap);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -568,10 +578,11 @@ namespace XCharts.Runtime
|
||||
}
|
||||
}
|
||||
|
||||
private static float GetAxisPositionInternal(GridCoord grid, Axis axis, float scaleWidth, double value, bool includeGridXY, bool realLength)
|
||||
private static float GetAxisPositionInternal(GridCoord grid, Axis axis, float scaleWidth, double value, bool includeGridXY, bool realLength, float gap = 0)
|
||||
{
|
||||
var isY = axis is YAxis;
|
||||
var gridHeight = isY ? grid.context.height : grid.context.width;
|
||||
gridHeight -= gap;
|
||||
var gridXY = isY ? grid.context.y : grid.context.x;
|
||||
|
||||
if (axis.IsLog())
|
||||
|
||||
@@ -17,6 +17,7 @@ namespace XCharts.Runtime
|
||||
[SerializeField] private bool m_OnZero = false;
|
||||
[SerializeField] private bool m_ShowStartLabel = true;
|
||||
[SerializeField] private bool m_ShowEndLabel = true;
|
||||
[SerializeField][Since("v3.15.0")] private bool m_ShowZeroLabel = true;
|
||||
[SerializeField] private TextLimit m_TextLimit = new TextLimit();
|
||||
|
||||
/// <summary>
|
||||
@@ -74,6 +75,15 @@ namespace XCharts.Runtime
|
||||
set { if (PropertyUtil.SetStruct(ref m_ShowEndLabel, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Whether to display the zero label.
|
||||
/// ||是否显示0刻度文本。
|
||||
/// </summary>
|
||||
public bool showZeroLabel
|
||||
{
|
||||
get { return m_ShowZeroLabel; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_ShowZeroLabel, value)) SetComponentDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// 文本限制。
|
||||
/// </summary>
|
||||
public TextLimit textLimit
|
||||
@@ -118,6 +128,7 @@ namespace XCharts.Runtime
|
||||
height = height,
|
||||
showStartLabel = showStartLabel,
|
||||
showEndLabel = showEndLabel,
|
||||
showZeroLabel = showZeroLabel,
|
||||
textLimit = textLimit.Clone()
|
||||
};
|
||||
axisLabel.textStyle.Copy(textStyle);
|
||||
@@ -136,6 +147,7 @@ namespace XCharts.Runtime
|
||||
height = axisLabel.height;
|
||||
showStartLabel = axisLabel.showStartLabel;
|
||||
showEndLabel = axisLabel.showEndLabel;
|
||||
showZeroLabel = axisLabel.showZeroLabel;
|
||||
textLimit.Copy(axisLabel.textLimit);
|
||||
textStyle.Copy(axisLabel.textStyle);
|
||||
}
|
||||
@@ -145,7 +157,7 @@ namespace XCharts.Runtime
|
||||
m_TextLimit.SetRelatedText(txt, labelWidth);
|
||||
}
|
||||
|
||||
public override string GetFormatterContent(int labelIndex, string category)
|
||||
public override string GetFormatterContent(int labelIndex, int totalIndex, string category)
|
||||
{
|
||||
if (string.IsNullOrEmpty(category))
|
||||
return GetFormatterFunctionContent(labelIndex, category, category);
|
||||
@@ -157,27 +169,28 @@ namespace XCharts.Runtime
|
||||
else
|
||||
{
|
||||
var content = m_Formatter;
|
||||
FormatterHelper.ReplaceAxisLabelContent(ref content, category);
|
||||
FormatterHelper.ReplaceAxisLabelContent(ref content, category, labelIndex, totalIndex);
|
||||
return GetFormatterFunctionContent(labelIndex, category, m_TextLimit.GetLimitContent(content));
|
||||
}
|
||||
}
|
||||
|
||||
public override string GetFormatterContent(int labelIndex, double value, double minValue, double maxValue, bool isLog = false)
|
||||
public override string GetFormatterContent(int labelIndex, int totalIndex, double value, double minValue, double maxValue, bool isLog = false)
|
||||
{
|
||||
if (showAsPositiveNumber && value < 0)
|
||||
{
|
||||
value = Math.Abs(value);
|
||||
}
|
||||
return base.GetFormatterContent(labelIndex, value, minValue, maxValue, isLog);
|
||||
return base.GetFormatterContent(labelIndex, totalIndex, value, minValue, maxValue, isLog);
|
||||
}
|
||||
|
||||
public bool IsNeedShowLabel(int index, int total)
|
||||
public bool IsNeedShowLabel(int index, int total, string content = null)
|
||||
{
|
||||
var labelShow = show && (interval == 0 || index % (interval + 1) == 0);
|
||||
if (labelShow)
|
||||
{
|
||||
if (!showStartLabel && index == 0) labelShow = false;
|
||||
else if (!showEndLabel && index == total - 1) labelShow = false;
|
||||
if (labelShow && content == "0") labelShow = showZeroLabel;
|
||||
}
|
||||
return labelShow;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ namespace XCharts.Runtime
|
||||
public class AxisLine : BaseLine
|
||||
{
|
||||
[SerializeField] private bool m_OnZero;
|
||||
[SerializeField] private float m_StartExtendLength;
|
||||
[SerializeField] private float m_EndExtendLength;
|
||||
[SerializeField] private bool m_ShowArrow;
|
||||
[SerializeField] private ArrowStyle m_Arrow = new ArrowStyle();
|
||||
|
||||
@@ -23,6 +25,24 @@ namespace XCharts.Runtime
|
||||
set { if (PropertyUtil.SetStruct(ref m_OnZero, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Extend length of the axis line at the start.
|
||||
/// ||轴线起点延长线长度。
|
||||
/// </summary>
|
||||
public float startExtendLength
|
||||
{
|
||||
get { return m_StartExtendLength; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_StartExtendLength, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Extend length of the axis line at the end.
|
||||
/// ||轴线终点延长线长度。
|
||||
/// </summary>
|
||||
public float endExtendLength
|
||||
{
|
||||
get { return m_EndExtendLength; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_EndExtendLength, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Whether to show the arrow symbol of axis.
|
||||
/// ||是否显示箭头。
|
||||
/// </summary>
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace XCharts.Runtime
|
||||
[SerializeField] private bool m_AutoColor;
|
||||
[SerializeField][Since("v3.3.0")] private bool m_ShowStartLine = true;
|
||||
[SerializeField][Since("v3.3.0")] private bool m_ShowEndLine = true;
|
||||
[SerializeField][Since("v3.11.0")] private bool m_ShowZLine = true;
|
||||
|
||||
/// <summary>
|
||||
/// The distance between the split line and axis line.
|
||||
@@ -53,6 +54,15 @@ namespace XCharts.Runtime
|
||||
get { return m_ShowEndLine; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_ShowEndLine, value)) SetVerticesDirty(); }
|
||||
}
|
||||
/// <summary>
|
||||
/// Whether to show the Z axis part of the split line. Generally used for 3D coordinate systems.
|
||||
/// ||是否显示Z轴部分分割线。一般用于3D坐标系。
|
||||
/// </summary>
|
||||
public bool showZLine
|
||||
{
|
||||
get { return m_ShowZLine; }
|
||||
set { if (PropertyUtil.SetStruct(ref m_ShowZLine, value)) SetVerticesDirty(); }
|
||||
}
|
||||
|
||||
public override bool vertsDirty { get { return m_VertsDirty || m_LineStyle.anyDirty; } }
|
||||
public override void ClearVerticesDirty()
|
||||
|
||||
@@ -45,6 +45,7 @@ namespace XCharts.Runtime
|
||||
axis.context.x = parallel.context.x;
|
||||
axis.context.y = parallel.context.y + (axis.index) * each;
|
||||
axis.context.width = parallel.context.width;
|
||||
axis.context.length = parallel.context.width;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -52,6 +53,7 @@ namespace XCharts.Runtime
|
||||
axis.context.x = parallel.context.x + (axis.index) * each;
|
||||
axis.context.y = parallel.context.y;
|
||||
axis.context.width = parallel.context.height;
|
||||
axis.context.length = parallel.context.height;
|
||||
}
|
||||
axis.context.orient = m_Orient;
|
||||
axis.context.height = 0;
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace XCharts.Runtime
|
||||
InitRadiusAxis(axis);
|
||||
else
|
||||
{
|
||||
axis.UpdateLabelText(polar.context.radius, null, false);
|
||||
UpdateLabelText(axis, polar.context.radius, null, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@ namespace XCharts.Runtime
|
||||
var radius = polar.context.outsideRadius - polar.context.insideRadius;
|
||||
var objName = component.GetType().Name + axis.index;
|
||||
var axisObj = ChartHelper.AddObject(objName, chart.transform, chart.chartMinAnchor,
|
||||
chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
|
||||
chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta, -1, chart.childrenNodeNames);
|
||||
axisObj.transform.localPosition = Vector3.zero;
|
||||
axisObj.SetActive(axis.show && axis.axisLabel.show);
|
||||
axisObj.hideFlags = chart.chartHideFlags;
|
||||
@@ -114,7 +114,7 @@ namespace XCharts.Runtime
|
||||
var inside = axis.axisLabel.inside;
|
||||
var isPercentStack = SeriesHelper.IsPercentStack<Bar>(chart.series);
|
||||
var labelName = AxisHelper.GetLabelName(axis, radius, i, axis.context.minValue, axis.context.maxValue,
|
||||
null, isPercentStack);
|
||||
null, isPercentStack, chart.useUtc);
|
||||
var label = ChartHelper.AddAxisLabelObject(splitNumber, i, objName + i, axisObj.transform,
|
||||
new Vector2(labelWidth, txtHig), axis, chart.theme.axis, labelName, Color.clear);
|
||||
|
||||
@@ -124,7 +124,7 @@ namespace XCharts.Runtime
|
||||
label.text.SetAlignment(textStyle.GetAlignment(TextAnchor.MiddleCenter));
|
||||
label.SetText(labelName);
|
||||
label.SetPosition(GetLabelPosition(polar, axis, angleAxis.context.startAngle, totalWidth));
|
||||
label.SetActive(true);
|
||||
label.SetActive(true, true);
|
||||
label.SetTextActive(true);
|
||||
|
||||
axis.context.labelObjectList.Add(label);
|
||||
|
||||
@@ -123,6 +123,12 @@ namespace XCharts.Runtime
|
||||
else
|
||||
context.y = chartY + context.bottom;
|
||||
|
||||
context.start = new Vector3(context.x, context.y);
|
||||
if (m_Orient == Orient.Horizonal)
|
||||
context.end = new Vector3(context.x + context.width, context.y);
|
||||
else
|
||||
context.end = new Vector3(context.x, context.y + context.height);
|
||||
context.length = (context.end - context.start).magnitude;
|
||||
context.position = new Vector3(context.x, context.y);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ namespace XCharts.Runtime
|
||||
splitLine.show = false;
|
||||
splitLine.lineStyle.type = LineStyle.Type.None;
|
||||
axisLabel.textLimit.enable = true;
|
||||
axisName.labelStyle.offset = new Vector3(5, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
@@ -16,7 +17,28 @@ namespace XCharts.Runtime
|
||||
public override void Update()
|
||||
{
|
||||
UpdateAxisMinMaxValue(component.index, component);
|
||||
UpdatePointerValue(component);
|
||||
if (!chart.isTriggerOnClick)
|
||||
{
|
||||
UpdatePointerValue(component);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnPointerClick(PointerEventData eventData)
|
||||
{
|
||||
base.OnPointerClick(eventData);
|
||||
if (chart.isTriggerOnClick)
|
||||
{
|
||||
UpdatePointerValue(component);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnPointerExit(PointerEventData eventData)
|
||||
{
|
||||
base.OnPointerExit(eventData);
|
||||
if (chart.isTriggerOnClick)
|
||||
{
|
||||
component.context.pointerValue = double.PositiveInfinity;
|
||||
}
|
||||
}
|
||||
|
||||
public override void DrawBase(VertexHelper vh)
|
||||
@@ -35,6 +57,11 @@ namespace XCharts.Runtime
|
||||
var relativedAxis = chart.GetChartComponent<YAxis>(axis.gridIndex);
|
||||
axis.context.x = grid.context.x;
|
||||
axis.context.y = AxisHelper.GetXAxisXOrY(grid, axis, relativedAxis);
|
||||
axis.context.start = new Vector3(grid.context.x, axis.context.y);
|
||||
axis.context.end = new Vector3(grid.context.x + grid.context.width, axis.context.y);
|
||||
var vec = axis.context.end - axis.context.start;
|
||||
axis.context.dire = vec.normalized;
|
||||
axis.context.length = vec.magnitude;
|
||||
axis.context.zeroY = grid.context.y;
|
||||
axis.context.zeroX = grid.context.x + axis.context.offset;
|
||||
}
|
||||
|
||||
8
Runtime/Component/Axis/XAxis3D.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6350e9983955e49c5b48704d3866cbfe
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
36
Runtime/Component/Axis/XAxis3D/XAxis3D.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
/// <summary>
|
||||
/// The x axis in cartesian(rectangular) coordinate.
|
||||
/// ||直角坐标系 grid 中的 x 轴。
|
||||
/// </summary>
|
||||
[Since("v3.11.0")]
|
||||
[System.Serializable]
|
||||
[RequireChartComponent(typeof(GridCoord3D))]
|
||||
[ComponentHandler(typeof(XAxis3DHander), true)]
|
||||
public class XAxis3D : Axis
|
||||
{
|
||||
public override void SetDefaultValue()
|
||||
{
|
||||
m_Show = true;
|
||||
m_Type = AxisType.Category;
|
||||
m_Min = 0;
|
||||
m_Max = 0;
|
||||
m_SplitNumber = 0;
|
||||
m_BoundaryGap = true;
|
||||
m_Position = AxisPosition.Bottom;
|
||||
m_Offset = 0;
|
||||
m_Data = new List<string>() { "x1", "x2", "x3", "x4", "x5" };
|
||||
m_Icons = new List<Sprite>(5);
|
||||
splitLine.show = false;
|
||||
splitLine.lineStyle.type = LineStyle.Type.None;
|
||||
axisLabel.textLimit.enable = true;
|
||||
axisName.name = "X";
|
||||
axisName.labelStyle.position = LabelStyle.Position.Middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Runtime/Component/Axis/XAxis3D/XAxis3D.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9129bca9c2a864e1ea337d7eb74d1024
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
190
Runtime/Component/Axis/XAxis3D/XAxis3DHander.cs
Normal file
@@ -0,0 +1,190 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
internal sealed class XAxis3DHander : AxisHandler<XAxis3D>
|
||||
{
|
||||
protected override Orient orient { get { return Orient.Horizonal; } }
|
||||
|
||||
public override void InitComponent()
|
||||
{
|
||||
InitXAxis(component);
|
||||
}
|
||||
|
||||
public override void Update()
|
||||
{
|
||||
UpdateAxisMinMaxValue(component.index, component);
|
||||
if (!chart.isTriggerOnClick)
|
||||
{
|
||||
UpdatePointerValue(component);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnPointerClick(PointerEventData eventData)
|
||||
{
|
||||
base.OnPointerClick(eventData);
|
||||
if (chart.isTriggerOnClick)
|
||||
{
|
||||
UpdatePointerValue(component);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnPointerExit(PointerEventData eventData)
|
||||
{
|
||||
base.OnPointerExit(eventData);
|
||||
if (chart.isTriggerOnClick)
|
||||
{
|
||||
component.context.pointerValue = double.PositiveInfinity;
|
||||
}
|
||||
}
|
||||
|
||||
public override void DrawBase(VertexHelper vh)
|
||||
{
|
||||
UpdatePosition(component);
|
||||
DrawXAxisSplit(vh, component);
|
||||
DrawXAxisLine(vh, component);
|
||||
DrawXAxisTick(vh, component);
|
||||
}
|
||||
|
||||
private void UpdatePosition(XAxis3D axis)
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(axis.gridIndex);
|
||||
if (grid != null)
|
||||
{
|
||||
if (axis.position == Axis.AxisPosition.Right || axis.position == Axis.AxisPosition.Top)
|
||||
{
|
||||
axis.context.start = grid.xyExchanged ? grid.context.pointD : grid.context.pointB;
|
||||
axis.context.end = grid.context.pointC;
|
||||
}
|
||||
else
|
||||
{
|
||||
axis.context.start = grid.context.pointA;
|
||||
axis.context.end = grid.xyExchanged ? grid.context.pointB : grid.context.pointD;
|
||||
}
|
||||
var vect = axis.context.end - axis.context.start;
|
||||
axis.context.x = axis.context.start.x;
|
||||
axis.context.y = axis.context.start.y;
|
||||
axis.context.dire = vect.normalized;
|
||||
axis.context.length = vect.magnitude;
|
||||
}
|
||||
}
|
||||
|
||||
private void InitXAxis(XAxis3D xAxis)
|
||||
{
|
||||
var theme = chart.theme;
|
||||
var xAxisIndex = xAxis.index;
|
||||
xAxis.painter = chart.painter;
|
||||
xAxis.refreshComponent = delegate ()
|
||||
{
|
||||
var yAxis = chart.GetChartComponent<YAxis3D>(xAxis.index);
|
||||
InitAxis3D(yAxis, orient);
|
||||
};
|
||||
xAxis.refreshComponent();
|
||||
}
|
||||
|
||||
internal override void UpdateAxisLabelText(Axis axis)
|
||||
{
|
||||
base.UpdateAxisLabelText(axis);
|
||||
if (axis.IsTime() || axis.IsValue())
|
||||
{
|
||||
for (int i = 0; i < axis.context.labelObjectList.Count; i++)
|
||||
{
|
||||
var label = axis.context.labelObjectList[i];
|
||||
if (label != null)
|
||||
{
|
||||
var pos = GetLabelPosition(0, i);
|
||||
label.SetPosition(pos);
|
||||
CheckValueLabelActive(component, i, label, pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override Vector3 GetLabelPosition(float scaleWid, int i)
|
||||
{
|
||||
var yAxis = chart.GetChartComponent<YAxis3D>(component.index);
|
||||
return Axis3DHelper.GetLabelPosition(i, component, yAxis, chart.theme.axis, scaleWid);
|
||||
}
|
||||
|
||||
private void DrawXAxisSplit(VertexHelper vh, XAxis3D xAxis)
|
||||
{
|
||||
if (AxisHelper.NeedShowSplit(xAxis))
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(xAxis.gridIndex);
|
||||
var relativedAxis = chart.GetChartComponent<YAxis3D>(xAxis.gridIndex);
|
||||
var dataZoom = chart.GetDataZoomOfAxis(xAxis);
|
||||
var isLeft = grid.IsLeft();
|
||||
if (grid.xyExchanged)
|
||||
{
|
||||
Axis3DHelper.DrawAxisSplit(vh, xAxis, chart.theme.axis, dataZoom,
|
||||
grid.context.pointA,
|
||||
grid.context.pointB,
|
||||
relativedAxis);
|
||||
if (xAxis.splitLine.showZLine)
|
||||
{
|
||||
var relativedAxis2 = chart.GetChartComponent<ZAxis3D>(xAxis.gridIndex);
|
||||
Axis3DHelper.DrawAxisSplit(vh, xAxis, chart.theme.axis, dataZoom,
|
||||
isLeft ? grid.context.pointD : grid.context.pointA,
|
||||
isLeft ? grid.context.pointC : grid.context.pointB,
|
||||
relativedAxis2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Axis3DHelper.DrawAxisSplit(vh, xAxis, chart.theme.axis, dataZoom,
|
||||
grid.context.pointA,
|
||||
grid.context.pointD,
|
||||
relativedAxis);
|
||||
if (xAxis.splitLine.showZLine)
|
||||
{
|
||||
var relativedAxis2 = chart.GetChartComponent<ZAxis3D>(xAxis.gridIndex);
|
||||
Axis3DHelper.DrawAxisSplit(vh, xAxis, chart.theme.axis, dataZoom,
|
||||
grid.context.pointB,
|
||||
grid.context.pointC,
|
||||
relativedAxis2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawXAxisTick(VertexHelper vh, XAxis3D xAxis)
|
||||
{
|
||||
if (AxisHelper.NeedShowSplit(xAxis))
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(xAxis.gridIndex);
|
||||
if (grid == null)
|
||||
return;
|
||||
|
||||
var dataZoom = chart.GetDataZoomOfAxis(xAxis);
|
||||
var relativedAxis = chart.GetChartComponent<YAxis3D>(xAxis.gridIndex);
|
||||
Axis3DHelper.DrawAxisTick(vh, xAxis, chart.theme.axis, dataZoom,
|
||||
xAxis.context.start,
|
||||
xAxis.context.end,
|
||||
-relativedAxis.context.dire);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawXAxisLine(VertexHelper vh, XAxis3D axis)
|
||||
{
|
||||
if (axis.show && axis.axisLine.show)
|
||||
{
|
||||
var theme = chart.theme.axis;
|
||||
var lineWidth = axis.axisLine.GetWidth(theme.lineWidth);
|
||||
var lineType = axis.axisLine.GetType(theme.lineType);
|
||||
var lineColor = axis.axisLine.GetColor(theme.lineColor);
|
||||
|
||||
var start = axis.context.start;
|
||||
var end = axis.context.end;
|
||||
ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, start, end, lineColor);
|
||||
}
|
||||
}
|
||||
|
||||
internal override float GetAxisLineXOrY()
|
||||
{
|
||||
return component.context.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Runtime/Component/Axis/XAxis3D/XAxis3DHander.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fc1147481a423494d963df29b423f3a0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
@@ -25,6 +26,7 @@ namespace XCharts.Runtime
|
||||
splitLine.lineStyle.type = LineStyle.Type.None;
|
||||
axisLabel.textLimit.enable = false;
|
||||
axisTick.showStartTick = true;
|
||||
axisName.labelStyle.offset = new Vector3(0, 22, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,6 +35,11 @@ namespace XCharts.Runtime
|
||||
var relativedAxis = chart.GetChartComponent<XAxis>(axis.gridIndex);
|
||||
axis.context.x = AxisHelper.GetYAxisXOrY(grid, axis, relativedAxis);
|
||||
axis.context.y = grid.context.y;
|
||||
axis.context.start = new Vector3(axis.context.x, grid.context.y);
|
||||
axis.context.end = new Vector3(axis.context.x, grid.context.y + grid.context.height);
|
||||
var vect = axis.context.end - axis.context.start;
|
||||
axis.context.dire = vect.normalized;
|
||||
axis.context.length = vect.magnitude;
|
||||
axis.context.zeroX = axis.context.x;
|
||||
axis.context.zeroY = axis.context.y + axis.context.offset;
|
||||
}
|
||||
|
||||
8
Runtime/Component/Axis/YAxis3D.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: aa26616789b6b4903aae479a4c552b89
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
33
Runtime/Component/Axis/YAxis3D/YAxis3D.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
/// <summary>
|
||||
/// The x axis in cartesian(rectangular) coordinate.
|
||||
/// ||直角坐标系 grid 中的 y 轴。
|
||||
/// </summary>
|
||||
[Since("v3.11.0")]
|
||||
[System.Serializable]
|
||||
[RequireChartComponent(typeof(GridCoord3D), typeof(XAxis3D))]
|
||||
[ComponentHandler(typeof(YAxis3DHander), true)]
|
||||
public class YAxis3D : Axis
|
||||
{
|
||||
public override void SetDefaultValue()
|
||||
{
|
||||
m_Show = true;
|
||||
m_Type = AxisType.Value;
|
||||
m_Min = 0;
|
||||
m_Max = 0;
|
||||
m_SplitNumber = 0;
|
||||
m_BoundaryGap = false;
|
||||
m_Position = AxisPosition.Left;
|
||||
m_Data = new List<string>(5);
|
||||
splitLine.show = true;
|
||||
splitLine.lineStyle.type = LineStyle.Type.None;
|
||||
axisLabel.textLimit.enable = false;
|
||||
axisTick.showStartTick = true;
|
||||
axisName.name = "Y";
|
||||
axisName.labelStyle.position = LabelStyle.Position.Middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Runtime/Component/Axis/YAxis3D/YAxis3D.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a3cb4a6657aaf473bbae7162eb189cc0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
176
Runtime/Component/Axis/YAxis3D/YAxis3DHander.cs
Normal file
@@ -0,0 +1,176 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
internal sealed class YAxis3DHander : AxisHandler<YAxis3D>
|
||||
{
|
||||
protected override Orient orient { get { return Orient.Vertical; } }
|
||||
|
||||
public override void InitComponent()
|
||||
{
|
||||
InitYAxis(component);
|
||||
}
|
||||
|
||||
public override void Update()
|
||||
{
|
||||
UpdateAxisMinMaxValue(component.index, component);
|
||||
UpdatePointerValue(component);
|
||||
}
|
||||
|
||||
public override void DrawBase(VertexHelper vh)
|
||||
{
|
||||
UpdatePosition(component);
|
||||
DrawYAxisSplit(vh, component.index, component);
|
||||
DrawYAxisLine(vh, component.index, component);
|
||||
DrawYAxisTick(vh, component.index, component);
|
||||
}
|
||||
|
||||
private void UpdatePosition(YAxis3D axis)
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(axis.gridIndex);
|
||||
if (grid != null)
|
||||
{
|
||||
if (axis.position == Axis.AxisPosition.Right)
|
||||
{
|
||||
axis.context.start = grid.xyExchanged ? grid.context.pointB : grid.context.pointD;
|
||||
axis.context.end = grid.context.pointC;
|
||||
}
|
||||
else
|
||||
{
|
||||
axis.context.start = grid.context.pointA;
|
||||
axis.context.end = grid.xyExchanged ? grid.context.pointD : grid.context.pointB;
|
||||
}
|
||||
axis.context.x = axis.context.start.x;
|
||||
axis.context.y = axis.context.start.y;
|
||||
var vect = axis.context.end - axis.context.start;
|
||||
axis.context.dire = vect.normalized;
|
||||
axis.context.length = vect.magnitude;
|
||||
}
|
||||
}
|
||||
|
||||
private void InitYAxis(YAxis3D yAxis)
|
||||
{
|
||||
var theme = chart.theme;
|
||||
var yAxisIndex = yAxis.index;
|
||||
yAxis.painter = chart.painter;
|
||||
yAxis.refreshComponent = delegate ()
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(yAxis.gridIndex);
|
||||
if (grid != null)
|
||||
{
|
||||
var xAxis = chart.GetChartComponent<YAxis3D>(yAxis.index);
|
||||
InitAxis3D(xAxis, orient);
|
||||
}
|
||||
};
|
||||
yAxis.refreshComponent();
|
||||
}
|
||||
|
||||
internal override void UpdateAxisLabelText(Axis axis)
|
||||
{
|
||||
base.UpdateAxisLabelText(axis);
|
||||
if (axis.IsTime() || axis.IsValue())
|
||||
{
|
||||
for (int i = 0; i < axis.context.labelObjectList.Count; i++)
|
||||
{
|
||||
var label = axis.context.labelObjectList[i];
|
||||
if (label != null)
|
||||
{
|
||||
var pos = GetLabelPosition(0, i);
|
||||
label.SetPosition(pos);
|
||||
CheckValueLabelActive(axis, i, label, pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override Vector3 GetLabelPosition(float scaleWid, int i)
|
||||
{
|
||||
var xAxis = chart.GetChartComponent<XAxis3D>(component.index);
|
||||
return Axis3DHelper.GetLabelPosition(i, component, xAxis, chart.theme.axis, scaleWid);
|
||||
}
|
||||
|
||||
private void DrawYAxisSplit(VertexHelper vh, int yAxisIndex, YAxis3D yAxis)
|
||||
{
|
||||
if (AxisHelper.NeedShowSplit(yAxis))
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(yAxis.gridIndex);
|
||||
var relativedAxis = chart.GetChartComponent<XAxis3D>(yAxis.gridIndex);
|
||||
var dataZoom = chart.GetDataZoomOfAxis(yAxis);
|
||||
var isLeft = grid.IsLeft();
|
||||
if (grid.xyExchanged)
|
||||
{
|
||||
Axis3DHelper.DrawAxisSplit(vh, yAxis, chart.theme.axis, dataZoom,
|
||||
grid.context.pointA,
|
||||
grid.context.pointD,
|
||||
relativedAxis);
|
||||
if (yAxis.splitLine.showZLine)
|
||||
{
|
||||
var relativedAxis2 = chart.GetChartComponent<ZAxis3D>(yAxis.gridIndex);
|
||||
Axis3DHelper.DrawAxisSplit(vh, yAxis, chart.theme.axis, dataZoom,
|
||||
grid.context.pointB, grid.context.pointC, relativedAxis2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Axis3DHelper.DrawAxisSplit(vh, yAxis, chart.theme.axis, dataZoom,
|
||||
grid.context.pointA,
|
||||
grid.context.pointB,
|
||||
relativedAxis);
|
||||
if (yAxis.splitLine.showZLine)
|
||||
{
|
||||
var relativedAxis2 = chart.GetChartComponent<ZAxis3D>(yAxis.gridIndex);
|
||||
Axis3DHelper.DrawAxisSplit(vh, yAxis, chart.theme.axis, dataZoom,
|
||||
isLeft ? grid.context.pointD : grid.context.pointA,
|
||||
isLeft ? grid.context.pointC : grid.context.pointB,
|
||||
relativedAxis2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawYAxisTick(VertexHelper vh, int yAxisIndex, YAxis3D yAxis)
|
||||
{
|
||||
if (AxisHelper.NeedShowSplit(yAxis))
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(yAxis.gridIndex);
|
||||
if (grid == null)
|
||||
return;
|
||||
|
||||
var dataZoom = chart.GetDataZoomOfAxis(yAxis);
|
||||
var relativedAxis = chart.GetChartComponent<XAxis3D>(yAxis.gridIndex);
|
||||
|
||||
Axis3DHelper.DrawAxisTick(vh, yAxis, chart.theme.axis, dataZoom,
|
||||
yAxis.context.start,
|
||||
yAxis.context.end,
|
||||
-relativedAxis.context.dire);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawYAxisLine(VertexHelper vh, int axisIndex, YAxis3D axis)
|
||||
{
|
||||
if (axis.show && axis.axisLine.show)
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(axis.gridIndex);
|
||||
if (grid == null)
|
||||
return;
|
||||
|
||||
var theme = chart.theme.axis;
|
||||
|
||||
var lineWidth = axis.axisLine.GetWidth(theme.lineWidth);
|
||||
var lineType = axis.axisLine.GetType(theme.lineType);
|
||||
var lineColor = axis.axisLine.GetColor(theme.lineColor);
|
||||
|
||||
var start = axis.context.start;
|
||||
var end = axis.context.end;
|
||||
ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, start, end, lineColor);
|
||||
}
|
||||
}
|
||||
|
||||
internal override float GetAxisLineXOrY()
|
||||
{
|
||||
return component.context.x;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Runtime/Component/Axis/YAxis3D/YAxis3DHander.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 56b4be734c61645e1bf91c22a6e3da6c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Runtime/Component/Axis/ZAxis3D.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 378448672ed084b0798c7ad343314693
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
33
Runtime/Component/Axis/ZAxis3D/ZAxis3D.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
/// <summary>
|
||||
/// The x axis in cartesian(rectangular) coordinate.
|
||||
/// ||直角坐标系 grid 中的 y 轴。
|
||||
/// </summary>
|
||||
[Since("v3.11.0")]
|
||||
[System.Serializable]
|
||||
[RequireChartComponent(typeof(GridCoord3D), typeof(XAxis3D))]
|
||||
[ComponentHandler(typeof(ZAxis3DHander), true)]
|
||||
public class ZAxis3D : Axis
|
||||
{
|
||||
public override void SetDefaultValue()
|
||||
{
|
||||
m_Show = true;
|
||||
m_Type = AxisType.Value;
|
||||
m_Min = 0;
|
||||
m_Max = 0;
|
||||
m_SplitNumber = 0;
|
||||
m_BoundaryGap = false;
|
||||
m_Position = AxisPosition.Left;
|
||||
m_Data = new List<string>(5);
|
||||
splitLine.show = true;
|
||||
splitLine.lineStyle.type = LineStyle.Type.None;
|
||||
axisLabel.textLimit.enable = false;
|
||||
axisTick.showStartTick = true;
|
||||
axisName.name = "Z";
|
||||
axisName.labelStyle.position = LabelStyle.Position.Middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Runtime/Component/Axis/ZAxis3D/ZAxis3D.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 65aa8ae88610c431ebdab86935af2379
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
198
Runtime/Component/Axis/ZAxis3D/ZAxis3DHander.cs
Normal file
@@ -0,0 +1,198 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace XCharts.Runtime
|
||||
{
|
||||
[UnityEngine.Scripting.Preserve]
|
||||
internal sealed class ZAxis3DHander : AxisHandler<ZAxis3D>
|
||||
{
|
||||
protected override Orient orient { get { return Orient.Vertical; } }
|
||||
|
||||
public override void InitComponent()
|
||||
{
|
||||
InitYAxis(component);
|
||||
}
|
||||
|
||||
public override void Update()
|
||||
{
|
||||
UpdateAxisMinMaxValue(component.index, component);
|
||||
UpdatePointerValue(component);
|
||||
}
|
||||
|
||||
public override void DrawBase(VertexHelper vh)
|
||||
{
|
||||
UpdatePosition(component);
|
||||
DrawZAxisSplit(vh, component.index, component);
|
||||
DrawZAxisLine(vh, component.index, component);
|
||||
DrawZAxisTick(vh, component.index, component);
|
||||
}
|
||||
|
||||
private void UpdatePosition(ZAxis3D axis)
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(axis.gridIndex);
|
||||
if (grid != null)
|
||||
{
|
||||
if (grid.context.pointB.x < grid.context.pointA.x)
|
||||
{
|
||||
axis.context.start = grid.context.pointD;
|
||||
axis.context.end = grid.context.pointH;
|
||||
}
|
||||
else if (axis.position == Axis.AxisPosition.Center)
|
||||
{
|
||||
axis.context.start = grid.context.pointB;
|
||||
axis.context.end = grid.context.pointF;
|
||||
}
|
||||
else if (axis.position == Axis.AxisPosition.Right)
|
||||
{
|
||||
axis.context.start = grid.context.pointC;
|
||||
axis.context.end = grid.context.pointG;
|
||||
}
|
||||
else
|
||||
{
|
||||
axis.context.start = grid.context.pointA;
|
||||
axis.context.end = grid.context.pointE;
|
||||
}
|
||||
axis.context.x = axis.context.start.x;
|
||||
axis.context.y = axis.context.start.y;
|
||||
var vect = axis.context.end - axis.context.start;
|
||||
axis.context.dire = vect.normalized;
|
||||
axis.context.length = vect.magnitude;
|
||||
}
|
||||
}
|
||||
|
||||
private void InitYAxis(ZAxis3D yAxis)
|
||||
{
|
||||
var theme = chart.theme;
|
||||
var yAxisIndex = yAxis.index;
|
||||
yAxis.painter = chart.painter;
|
||||
yAxis.refreshComponent = delegate ()
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(yAxis.gridIndex);
|
||||
if (grid != null)
|
||||
{
|
||||
var relativedAxis = chart.GetChartComponent<ZAxis3D>(yAxis.index);
|
||||
InitAxis3D(relativedAxis, orient);
|
||||
}
|
||||
};
|
||||
yAxis.refreshComponent();
|
||||
}
|
||||
|
||||
internal override void UpdateAxisLabelText(Axis axis)
|
||||
{
|
||||
base.UpdateAxisLabelText(axis);
|
||||
if (axis.IsTime() || axis.IsValue())
|
||||
{
|
||||
for (int i = 0; i < axis.context.labelObjectList.Count; i++)
|
||||
{
|
||||
var label = axis.context.labelObjectList[i];
|
||||
if (label != null)
|
||||
{
|
||||
var pos = GetLabelPosition(0, i);
|
||||
label.SetPosition(pos);
|
||||
CheckValueLabelActive(axis, i, label, pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override Vector3 GetLabelPosition(float scaleWid, int i)
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(component.gridIndex);
|
||||
if (grid == null)
|
||||
return Vector3.zero;
|
||||
|
||||
var yAxis = chart.GetChartComponent<XAxis3D>(component.index);
|
||||
return Axis3DHelper.GetLabelPosition(i, component, yAxis,
|
||||
chart.theme.axis,
|
||||
scaleWid);
|
||||
}
|
||||
|
||||
private void DrawZAxisSplit(VertexHelper vh, int yAxisIndex, ZAxis3D yAxis)
|
||||
{
|
||||
if (AxisHelper.NeedShowSplit(yAxis))
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(yAxis.gridIndex);
|
||||
if (grid == null)
|
||||
return;
|
||||
|
||||
var isLeft = grid.IsLeft();
|
||||
if (grid.xyExchanged)
|
||||
{
|
||||
var relativedAxis = chart.GetChartComponent<XAxis3D>(yAxis.gridIndex);
|
||||
var dataZoom = chart.GetDataZoomOfAxis(yAxis);
|
||||
Axis3DHelper.DrawAxisSplit(vh, yAxis, chart.theme.axis, dataZoom,
|
||||
isLeft ? grid.context.pointD : grid.context.pointA,
|
||||
isLeft ? grid.context.pointH : grid.context.pointE,
|
||||
relativedAxis);
|
||||
if (yAxis.splitLine.showZLine)
|
||||
{
|
||||
var relativedAxis2 = chart.GetChartComponent<YAxis3D>(yAxis.gridIndex);
|
||||
Axis3DHelper.DrawAxisSplit(vh, yAxis, chart.theme.axis, dataZoom,
|
||||
grid.context.pointB,
|
||||
grid.context.pointF,
|
||||
relativedAxis2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var relativedAxis = chart.GetChartComponent<YAxis3D>(yAxis.gridIndex);
|
||||
var dataZoom = chart.GetDataZoomOfAxis(yAxis);
|
||||
Axis3DHelper.DrawAxisSplit(vh, yAxis, chart.theme.axis, dataZoom,
|
||||
isLeft ? grid.context.pointD : grid.context.pointA,
|
||||
isLeft ? grid.context.pointH : grid.context.pointE,
|
||||
relativedAxis);
|
||||
if (yAxis.splitLine.showZLine)
|
||||
{
|
||||
var relativedAxis2 = chart.GetChartComponent<XAxis3D>(yAxis.gridIndex);
|
||||
Axis3DHelper.DrawAxisSplit(vh, yAxis, chart.theme.axis, dataZoom,
|
||||
grid.context.pointB,
|
||||
grid.context.pointF,
|
||||
relativedAxis2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawZAxisTick(VertexHelper vh, int yAxisIndex, ZAxis3D zAxis)
|
||||
{
|
||||
if (AxisHelper.NeedShowSplit(zAxis))
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(zAxis.gridIndex);
|
||||
if (grid == null)
|
||||
return;
|
||||
|
||||
var dataZoom = chart.GetDataZoomOfAxis(zAxis);
|
||||
var relativedDire = grid.context.pointA - grid.context.pointB;
|
||||
Axis3DHelper.DrawAxisTick(vh, zAxis, chart.theme.axis, dataZoom,
|
||||
zAxis.context.start,
|
||||
zAxis.context.end,
|
||||
relativedDire.normalized);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawZAxisLine(VertexHelper vh, int axisIndex, ZAxis3D axis)
|
||||
{
|
||||
if (axis.show && axis.axisLine.show)
|
||||
{
|
||||
var grid = chart.GetChartComponent<GridCoord3D>(axis.gridIndex);
|
||||
if (grid == null)
|
||||
return;
|
||||
|
||||
var theme = chart.theme.axis;
|
||||
|
||||
var lineWidth = axis.axisLine.GetWidth(theme.lineWidth);
|
||||
var lineType = axis.axisLine.GetType(theme.lineType);
|
||||
var lineColor = axis.axisLine.GetColor(theme.lineColor);
|
||||
|
||||
var start = axis.context.start;
|
||||
var end = axis.context.end;
|
||||
ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, start, end, lineColor);
|
||||
}
|
||||
}
|
||||
|
||||
internal override float GetAxisLineXOrY()
|
||||
{
|
||||
return component.context.x;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Runtime/Component/Axis/ZAxis3D/ZAxis3DHander.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 67fb4be32885d4915979719c676aac5a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -100,6 +100,12 @@ namespace XCharts.Runtime
|
||||
set { if (PropertyUtil.SetClass(ref m_BorderStyle, value)) SetComponentDirty(); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// the rect of background.
|
||||
/// ||背景的矩形区域。
|
||||
/// </summary>
|
||||
public Rect rect { get; set; }
|
||||
|
||||
public override void SetDefaultValue()
|
||||
{
|
||||
m_Show = true;
|
||||
|
||||