From a53a06e738f540acd1ebf8f32f422750e7c9d1e1 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sat, 30 May 2020 09:41:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96`RadarChart`=E5=9C=A8?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE`max`=E4=B8=BA`0`=E6=97=B6=E5=8F=AF=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=B7=E6=96=B0=E6=9C=80=E5=A4=A7=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + Examples/Runtime/Example41_RadarUpdate.cs | 80 +++++++++++++++++++ .../Runtime/Example41_RadarUpdate.cs.meta | 11 +++ Runtime/Component/Main/Radar.cs | 10 +-- Runtime/Component/Main/Serie.cs | 33 ++------ Runtime/Internal/Helper/SerieHelper.cs | 48 +++++++++++ Runtime/PieChart.cs | 4 +- Runtime/RadarChart.cs | 10 +-- 8 files changed, 157 insertions(+), 40 deletions(-) create mode 100644 Examples/Runtime/Example41_RadarUpdate.cs create mode 100644 Examples/Runtime/Example41_RadarUpdate.cs.meta diff --git a/CHANGELOG.md b/CHANGELOG.md index a69a4c94..d7eca9e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # 更新日志 +* (2020.05.30) 优化`RadarChart`在设置`max`为`0`时可自动刷新最大值 * (2020.05.29) 修复`PieChart`设置`space`时只有一个数据时绘制异常的问题 * (2020.05.27) 修复调用`UpdateDataName()`接口时不会自动刷新的问题 * (2020.05.27) 优化`柱状图`的渐变色效果 diff --git a/Examples/Runtime/Example41_RadarUpdate.cs b/Examples/Runtime/Example41_RadarUpdate.cs new file mode 100644 index 00000000..5d86ade1 --- /dev/null +++ b/Examples/Runtime/Example41_RadarUpdate.cs @@ -0,0 +1,80 @@ +/******************************************/ +/* */ +/* Copyright (c) 2018 monitor1394 */ +/* https://github.com/monitor1394 */ +/* */ +/******************************************/ + +using UnityEngine; +using UnityEngine.UI; + +namespace XCharts.Examples +{ + [DisallowMultipleComponent] + [ExecuteInEditMode] + public class Example41_RadarUpdate : MonoBehaviour + { + RadarChart chart; + int count = 0; + float max = 0; + + void Awake() + { + chart = gameObject.GetComponent(); + if (chart == null) + { + chart = gameObject.AddComponent(); + } + } + + void Update() + { + if (Input.GetKeyDown(KeyCode.Space)) + { + UpdateData(); + count++; + } + UpdateMax(); + } + + void UpdateData() + { + var serieIndex = 0; + var serie = chart.series.GetSerie(serieIndex); + if (serie == null) return; + if (serie.radarType == RadarType.Multiple) + { + for (int i = 0; i < serie.dataCount; i++) + { + var serieData = serie.GetSerieData(i); + for (int j = 0; j < serieData.data.Count; j++) + { + var value = Random.Range(10, 100); + chart.UpdateData(serieIndex, i, j, value); + } + } + } + else + { + for (int i = 0; i < serie.dataCount; i++) + { + var value = Random.Range(10, 100); + chart.UpdateData(serieIndex, i, value); + } + } + chart.title.subText = "max:" + serie.runtimeDataMax; + } + + void UpdateMax() + { + var serieIndex = 0; + var serie = chart.series.GetSerie(serieIndex); + if (serie == null) return; + if (serie.runtimeDataMax != max) + { + chart.title.subText = "max:" + serie.runtimeDataMax; + max = serie.runtimeDataMax; + } + } + } +} \ No newline at end of file diff --git a/Examples/Runtime/Example41_RadarUpdate.cs.meta b/Examples/Runtime/Example41_RadarUpdate.cs.meta new file mode 100644 index 00000000..b0a750e2 --- /dev/null +++ b/Examples/Runtime/Example41_RadarUpdate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a2ad6907bd5045ec920b4f0e359535e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Component/Main/Radar.cs b/Runtime/Component/Main/Radar.cs index cda5aea7..68c83d14 100644 --- a/Runtime/Component/Main/Radar.cs +++ b/Runtime/Component/Main/Radar.cs @@ -205,11 +205,11 @@ namespace XCharts m_SplitNumber = 5, m_Indicator = true, m_IndicatorList = new List(5){ - new Indicator(){name="indicator1",max = 100}, - new Indicator(){name="indicator2",max = 100}, - new Indicator(){name="indicator3",max = 100}, - new Indicator(){name="indicator4",max = 100}, - new Indicator(){name="indicator5",max = 100}, + new Indicator(){name="indicator1",max = 0}, + new Indicator(){name="indicator2",max = 0}, + new Indicator(){name="indicator3",max = 0}, + new Indicator(){name="indicator4",max = 0}, + new Indicator(){name="indicator5",max = 0}, } }; radar.center[0] = 0.5f; diff --git a/Runtime/Component/Main/Serie.cs b/Runtime/Component/Main/Serie.cs index 00dcb40f..dc823939 100644 --- a/Runtime/Component/Main/Serie.cs +++ b/Runtime/Component/Main/Serie.cs @@ -871,9 +871,13 @@ namespace XCharts /// public float runtimeOutsideRadius { get; internal set; } /// - /// 饼图的数据项最大值 + /// 运行时的最大数据值 /// - public float runtimePieDataMax { get; internal set; } + public float runtimeDataMax { get; internal set; } + /// + /// 运行时的最小数据值 + /// + public float runtimeDataMin { get; internal set; } /// /// 饼图的数据项之和 /// @@ -1314,31 +1318,6 @@ namespace XCharts } } - /// - /// 获得指定维数的最大最小值 - /// - /// - /// - /// - public void GetMinMaxData(int dimension, out float minValue, out float maxValue, DataZoom dataZoom = null) - { - var dataList = GetDataList(dataZoom); - float max = float.MinValue; - float min = float.MaxValue; - for (int i = 0; i < dataList.Count; i++) - { - var serieData = dataList[i]; - if (serieData.data.Count > dimension) - { - var value = serieData.data[dimension]; - if (value > max) max = value; - if (value < min) min = value; - } - } - maxValue = max; - minValue = min; - } - private List emptyFilter = new List(); /// /// 根据dataZoom更新数据列表缓存 diff --git a/Runtime/Internal/Helper/SerieHelper.cs b/Runtime/Internal/Helper/SerieHelper.cs index 544d27c7..c5698961 100644 --- a/Runtime/Internal/Helper/SerieHelper.cs +++ b/Runtime/Internal/Helper/SerieHelper.cs @@ -258,5 +258,53 @@ namespace XCharts serie.runtimeInsideRadius = serie.radius[0] <= 1 ? minWidth * serie.radius[0] : serie.radius[0]; serie.runtimeOutsideRadius = serie.radius[1] <= 1 ? minWidth * serie.radius[1] : serie.radius[1]; } + + /// + /// 获得指定维数的最大最小值 + /// + /// + /// + /// + public static void GetDimensionMinMaxData(Serie serie, int dimension, int ceilRate = 0, DataZoom dataZoom = null) + { + var dataList = serie.GetDataList(dataZoom); + float max = float.MinValue; + float min = float.MaxValue; + for (int i = 0; i < dataList.Count; i++) + { + var serieData = dataList[i]; + if (serieData.show && serieData.data.Count > dimension) + { + var value = serieData.data[dimension]; + if (value > max) max = value; + if (value < min) min = value; + } + } + serie.runtimeDataMin = ChartHelper.GetMinDivisibleValue(min, ceilRate); + serie.runtimeDataMax = ChartHelper.GetMaxDivisibleValue(max, ceilRate); + } + + public static void GetAllMinMaxData(Serie serie, int ceilRate = 0, DataZoom dataZoom = null) + { + var dataList = serie.GetDataList(dataZoom); + float max = float.MinValue; + float min = float.MaxValue; + for (int i = 0; i < dataList.Count; i++) + { + var serieData = dataList[i]; + if (serieData.show) + { + var count = serie.showDataDimension > serieData.data.Count ? serieData.data.Count : serie.showDataDimension; + for (int j = 0; j < count; j++) + { + var value = serieData.data[j]; + if (value > max) max = value; + if (value < min) min = value; + } + } + } + serie.runtimeDataMin = ChartHelper.GetMinDivisibleValue(min, ceilRate); + serie.runtimeDataMax = ChartHelper.GetMaxDivisibleValue(max, ceilRate); + } } } \ No newline at end of file diff --git a/Runtime/PieChart.cs b/Runtime/PieChart.cs index 94fdabda..37622450 100644 --- a/Runtime/PieChart.cs +++ b/Runtime/PieChart.cs @@ -65,7 +65,7 @@ namespace XCharts } bool isFinish = true; if (serie.pieClickOffset) isClickOffset = true; - serie.runtimePieDataMax = serie.yMax; + serie.runtimeDataMax = serie.yMax; serie.runtimePieDataTotal = serie.yTotal; SerieHelper.UpdateCenter(serie, chartPosition, chartWidth, chartHeight); @@ -105,7 +105,7 @@ namespace XCharts serieData.runtimePieToAngle = startDegree + degree; serieData.runtimePieOutsideRadius = serie.pieRoseType > 0 ? - serie.runtimeInsideRadius + (serie.runtimeOutsideRadius - serie.runtimeInsideRadius) * value / serie.runtimePieDataMax : + serie.runtimeInsideRadius + (serie.runtimeOutsideRadius - serie.runtimeInsideRadius) * value / serie.runtimeDataMax : serie.runtimeOutsideRadius; if (serieData.highlighted) { diff --git a/Runtime/RadarChart.cs b/Runtime/RadarChart.cs index 8af77d58..05adde95 100644 --- a/Runtime/RadarChart.cs +++ b/Runtime/RadarChart.cs @@ -249,6 +249,7 @@ namespace XCharts var rate = serie.animation.GetCurrRate(); var dataChanging = false; var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + SerieHelper.GetAllMinMaxData(serie); for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; @@ -292,14 +293,12 @@ namespace XCharts for (int n = 0; n < dataCount; n++) { if (n >= serieData.data.Count) break; - float min = radar.GetIndicatorMin(n); float max = radar.GetIndicatorMax(n); float value = serieData.GetCurrData(n, dataChangeDuration); if (serieData.IsDataChanged()) dataChanging = true; if (max == 0) { - serie.GetMinMaxData(n, out min, out max); - min = radar.GetIndicatorMin(n); + max = serie.runtimeDataMax; } var radius = max < 0 ? radar.runtimeDataRadius - radar.runtimeDataRadius * value / max : radar.runtimeDataRadius * value / max; @@ -391,6 +390,7 @@ namespace XCharts var pointList = radar.runtimeDataPosList[key]; var startIndex = GetStartShowIndex(serie); var endIndex = GetEndShowIndex(serie); + SerieHelper.GetDimensionMinMaxData(serie, 1); for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; @@ -425,14 +425,12 @@ namespace XCharts int dataCount = radar.indicatorList.Count; var index = serieData.index; var p = radar.runtimeCenterPos; - var min = radar.GetIndicatorMin(index); var max = radar.GetIndicatorMax(index); var value = serieData.GetCurrData(1, dataChangeDuration); if (serieData.IsDataChanged()) dataChanging = true; if (max == 0) { - serie.GetMinMaxData(index, out min, out max); - min = radar.GetIndicatorMin(index); + max = serie.runtimeDataMax; } var radius = max < 0 ? radar.runtimeDataRadius - radar.runtimeDataRadius * value / max : radar.runtimeDataRadius * value / max;