From d44bf55a875d11d96f4635f669dedecb2471020b Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Wed, 13 Apr 2022 22:03:23 +0800 Subject: [PATCH] [add][VisualMap] add workOnLine and workOnArea (#191) --- CHANGELOG.md | 2 ++ Editor/MainComponents/VisualMapEditor.cs | 2 ++ Runtime/Component/VisualMap/VisualMap.cs | 21 ++++++++++++ .../Component/VisualMap/VisualMapHelper.cs | 24 +++++++++++-- Runtime/Serie/Line/LineHandler.GridCoord.cs | 2 +- Runtime/Serie/Line/LineHelper.cs | 34 ++++++++++++++----- Runtime/Serie/Line/SimplifiedLineHandler.cs | 2 +- 7 files changed, 73 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 178f324d..51abe90f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,8 @@ ## master +* (2022.04.13) 增加`VisualMap`的`workOnLine`和`workOnArea`以支持是对折线还是区域映射的功能 #191 +* (2022.04.12) 优化`Radar`支持`Area`区域触发`Tooltip` * (2022.04.09) 优化`VisualMap` * (2022.04.09) 优化`Tooltip` diff --git a/Editor/MainComponents/VisualMapEditor.cs b/Editor/MainComponents/VisualMapEditor.cs index 3b40e751..16354f68 100644 --- a/Editor/MainComponents/VisualMapEditor.cs +++ b/Editor/MainComponents/VisualMapEditor.cs @@ -20,6 +20,8 @@ namespace XCharts.Editor PropertyField("m_Max"); PropertyField("m_SplitNumber"); PropertyField("m_Dimension"); + PropertyField("m_WorkOnLine"); + PropertyField("m_WorkOnArea"); PropertyField("m_ShowUI"); if (baseProperty.FindPropertyRelative("m_ShowUI").boolValue) { diff --git a/Runtime/Component/VisualMap/VisualMap.cs b/Runtime/Component/VisualMap/VisualMap.cs index a8a47312..6b374386 100644 --- a/Runtime/Component/VisualMap/VisualMap.cs +++ b/Runtime/Component/VisualMap/VisualMap.cs @@ -98,6 +98,9 @@ namespace XCharts.Runtime [SerializeField] private bool m_AutoMinMax = true; [SerializeField] private Orient m_Orient = Orient.Horizonal; [SerializeField] private Location m_Location = Location.defaultLeft; + [SerializeField] private bool m_WorkOnLine = true; + [SerializeField] private bool m_WorkOnArea = false; + [SerializeField] private List m_InRange = new List(); [SerializeField] private List m_OutOfRange = new List() { Color.gray }; [SerializeField] private List m_Pieces = new List(); @@ -310,6 +313,24 @@ namespace XCharts.Runtime set { if (PropertyUtil.SetClass(ref m_Location, value)) SetVerticesDirty(); } } /// + /// Whether the visualmap is work on linestyle of linechart. + /// |组件是否对LineChart的LineStyle有效。 + /// + public bool workOnLine + { + get { return m_WorkOnLine; } + set { if (PropertyUtil.SetStruct(ref m_WorkOnLine, value)) SetVerticesDirty(); } + } + /// + /// Whether the visualmap is work on areaStyle of linechart. + /// |组件是否对LineChart的AreaStyle有效。 + /// + public bool workOnArea + { + get { return m_WorkOnArea; } + set { if (PropertyUtil.SetStruct(ref m_WorkOnArea, value)) SetVerticesDirty(); } + } + /// /// Defines the visual color in the selected range. /// |定义 在选中范围中 的视觉颜色。 /// diff --git a/Runtime/Component/VisualMap/VisualMapHelper.cs b/Runtime/Component/VisualMap/VisualMapHelper.cs index 4e5ab75a..e0b6c65f 100644 --- a/Runtime/Component/VisualMap/VisualMapHelper.cs +++ b/Runtime/Component/VisualMap/VisualMapHelper.cs @@ -147,12 +147,30 @@ namespace XCharts.Runtime { if (visualMap == null) return false; - if (!visualMap.show) + if (!visualMap.show || (!visualMap.workOnLine && !visualMap.workOnArea)) + return false; + if (visualMap.inRange.Count <= 0 && visualMap.pieces.Count <= 0) + return false; + return true; + } + public static bool IsNeedLineGradient(VisualMap visualMap) + { + if (visualMap == null) + return false; + if (!visualMap.show || !visualMap.workOnLine) + return false; + if (visualMap.inRange.Count <= 0 && visualMap.pieces.Count <= 0) + return false; + return true; + } + public static bool IsNeedAreaGradient(VisualMap visualMap) + { + if (visualMap == null) + return false; + if (!visualMap.show || !visualMap.workOnArea) return false; - if (visualMap.inRange.Count <= 0 && visualMap.pieces.Count <= 0) return false; - return true; } diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index b8b3e333..9e92026e 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -349,7 +349,7 @@ namespace XCharts.Runtime VisualMapHelper.AutoSetLineMinMax(visualMap, serie, isY, axis, relativedAxis); LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, visualMap, lineWidth, isY); - LineHelper.DrawSerieLineArea(vh, serie, lastSerie, chart.theme, isY, axis, relativedAxis, m_SerieGrid); + LineHelper.DrawSerieLineArea(vh, serie, lastSerie, chart.theme, visualMap, isY, axis, relativedAxis, m_SerieGrid); LineHelper.DrawSerieLine(vh, chart.theme, serie, visualMap, m_SerieGrid, axis, relativedAxis, lineWidth); serie.context.vertCount = vh.currentVertCount; diff --git a/Runtime/Serie/Line/LineHelper.cs b/Runtime/Serie/Line/LineHelper.cs index b3f83f43..d35da898 100644 --- a/Runtime/Serie/Line/LineHelper.cs +++ b/Runtime/Serie/Line/LineHelper.cs @@ -23,7 +23,7 @@ namespace XCharts.Runtime } public static void DrawSerieLineArea(VertexHelper vh, Serie serie, Serie lastStackSerie, - ThemeStyle theme, bool isY, Axis axis, Axis relativedAxis, GridCoord grid) + ThemeStyle theme, VisualMap visualMap, bool isY, Axis axis, Axis relativedAxis, GridCoord grid) { if (serie.areaStyle == null || !serie.areaStyle.show) return; @@ -33,26 +33,32 @@ namespace XCharts.Runtime var gridXY = (isY ? grid.context.x : grid.context.y); if (lastStackSerie == null) { - LineHelper.DrawSerieLineNormalArea(vh, serie, isY, + DrawSerieLineNormalArea(vh, serie, isY, gridXY + relativedAxis.context.offset, gridXY, gridXY + (isY ? grid.context.width : grid.context.height), srcAreaColor, - srcAreaToColor); + srcAreaToColor, + visualMap, + axis, + relativedAxis, + grid); } else { - LineHelper.DrawSerieLineStackArea(vh, serie, lastStackSerie, isY, + DrawSerieLineStackArea(vh, serie, lastStackSerie, isY, gridXY + relativedAxis.context.offset, gridXY, gridXY + (isY ? grid.context.width : grid.context.height), srcAreaColor, - srcAreaToColor); + srcAreaToColor, + visualMap); } } private static void DrawSerieLineNormalArea(VertexHelper vh, Serie serie, bool isY, - float zero, float min, float max, Color32 color, Color32 toColor) + float zero, float min, float max, Color32 areaColor, Color32 areaToColor, + VisualMap visualMap, Axis axis, Axis relativedAxis, GridCoord grid) { var points = serie.context.drawPoints; var count = points.Count; @@ -61,7 +67,8 @@ namespace XCharts.Runtime var isBreak = false; var lp = Vector3.zero; - var lerp = !ChartHelper.IsValueEqualsColor(color, toColor); + var isVisualMapGradient = VisualMapHelper.IsNeedAreaGradient(visualMap); + var areaLerp = !ChartHelper.IsValueEqualsColor(areaColor, areaToColor); var zsp = isY ? new Vector3(zero, points[0].position.y) : new Vector3(points[0].position.x, zero); @@ -74,6 +81,9 @@ namespace XCharts.Runtime { var tp = points[i].position; var isIgnore = points[i].isIgnoreBreak; + var color = areaColor; + var toColor = areaToColor; + var lerp = areaLerp; if (serie.animation.CheckDetailBreak(tp, isY)) { @@ -87,6 +97,12 @@ namespace XCharts.Runtime if (UGLHelper.GetIntersection(lp, tp, axisStartPos, axisEndPos, ref ip)) tp = ip; } + if (isVisualMapGradient) + { + color = VisualMapHelper.GetLineGradientColor(visualMap, tp, grid, axis, relativedAxis, areaColor); + toColor = color; + lerp = false; + } var zp = isY ? new Vector3(zero, tp.y) : new Vector3(tp.x, zero); @@ -133,7 +149,7 @@ namespace XCharts.Runtime } private static void DrawSerieLineStackArea(VertexHelper vh, Serie serie, Serie lastStackSerie, bool isY, - float zero, float min, float max, Color32 color, Color32 toColor) + float zero, float min, float max, Color32 color, Color32 toColor, VisualMap visualMap) { if (lastStackSerie == null) return; @@ -243,7 +259,7 @@ namespace XCharts.Runtime var isBreak = false; var isY = axis is YAxis; - var isVisualMapGradient = VisualMapHelper.IsNeedGradient(visualMap); + var isVisualMapGradient = VisualMapHelper.IsNeedLineGradient(visualMap); var isLineStyleGradient = serie.lineStyle.IsNeedGradient(); //var highlight = serie.highlight || serie.context.pointerEnter; diff --git a/Runtime/Serie/Line/SimplifiedLineHandler.cs b/Runtime/Serie/Line/SimplifiedLineHandler.cs index 90b81ba7..105f1c95 100644 --- a/Runtime/Serie/Line/SimplifiedLineHandler.cs +++ b/Runtime/Serie/Line/SimplifiedLineHandler.cs @@ -239,7 +239,7 @@ namespace XCharts.Runtime serie.animation.InitProgress(serie.context.dataPoints, isY); LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, null, lineWidth, isY); - LineHelper.DrawSerieLineArea(vh, serie, null, chart.theme, isY, axis, relativedAxis, m_SerieGrid); + LineHelper.DrawSerieLineArea(vh, serie, null, chart.theme, null, isY, axis, relativedAxis, m_SerieGrid); LineHelper.DrawSerieLine(vh, chart.theme, serie, null, m_SerieGrid, axis, relativedAxis, lineWidth); serie.context.vertCount = vh.currentVertCount;