From 49ed5ac1531a43a3c160af8a0fbd046fc960abb5 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sat, 8 Feb 2020 14:13:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`SerieSymbol`=E7=9A=84`gap`?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=8E=A7=E5=88=B6=E5=9B=BE=E5=BD=A2=E6=A0=87?= =?UTF-8?q?=E8=AE=B0=E7=9A=84=E5=A4=96=E7=95=99=E7=99=BD=E8=B7=9D=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/XCharts/CHANGELOG.md | 1 + .../Documentation/XCharts配置项手册.md | 1 + .../PropertyDrawers/SerieSymbolDrawer.cs | 11 ++-- .../Runtime/Component/Sub/SerieSymbol.cs | 6 ++ Assets/XCharts/Runtime/Internal/BaseChart.cs | 62 ++++++++++++++----- .../Internal/CoordinateChart_DrawLine.cs | 4 +- .../Internal/CoordinateChart_DrawScatter.cs | 4 +- Assets/XCharts/Runtime/RadarChart.cs | 3 +- Assets/XCharts/Runtime/Utility/ChartDrawer.cs | 19 ++++++ 9 files changed, 87 insertions(+), 24 deletions(-) diff --git a/Assets/XCharts/CHANGELOG.md b/Assets/XCharts/CHANGELOG.md index 05b152b5..925f1306 100644 --- a/Assets/XCharts/CHANGELOG.md +++ b/Assets/XCharts/CHANGELOG.md @@ -1,6 +1,7 @@ # 更新日志 +* (2020.02.08) 增加`SerieSymbol`的`gap`参数控制图形标记的外留白距离 * (2020.01.26) 增加`TextLimit`组件可以设置`AxisLabel`的文本自适应 * (2020.01.20) 优化`Tooltip`设置`itemFormatter`时显示系列颜色 * (2020.01.20) 增加`Radar`雷达图在`inspector`配置`areaStyle`的支持 diff --git a/Assets/XCharts/Documentation/XCharts配置项手册.md b/Assets/XCharts/Documentation/XCharts配置项手册.md index 5e938355..03753490 100644 --- a/Assets/XCharts/Documentation/XCharts配置项手册.md +++ b/Assets/XCharts/Documentation/XCharts配置项手册.md @@ -791,6 +791,7 @@ * `Triangle`:三角形。 * `Diamond`:菱形。 * `None`:不显示标记。 +* `gap`:图形标记的外留白距离。 * `sizeType`:标记图形的大小获取方式。支持以下三种类型: * `Custom`:自定义大小。 * `FromData`:通过 `dataIndex` 从数据中获取,再乘以一个比例系数 `dataScale` 。 diff --git a/Assets/XCharts/Editor/PropertyDrawers/SerieSymbolDrawer.cs b/Assets/XCharts/Editor/PropertyDrawers/SerieSymbolDrawer.cs index 889fc8dd..916ad8d5 100644 --- a/Assets/XCharts/Editor/PropertyDrawers/SerieSymbolDrawer.cs +++ b/Assets/XCharts/Editor/PropertyDrawers/SerieSymbolDrawer.cs @@ -32,6 +32,7 @@ namespace XCharts SerializedProperty m_StartIndex = prop.FindPropertyRelative("m_StartIndex"); SerializedProperty m_Interval = prop.FindPropertyRelative("m_Interval"); SerializedProperty m_ForceShowLast = prop.FindPropertyRelative("m_ForceShowLast"); + SerializedProperty m_Gap = prop.FindPropertyRelative("m_Gap"); ChartEditorHelper.MakeFoldout(ref drawRect, ref m_SerieSymbolToggle, prop, null, m_Type, false); drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; @@ -39,6 +40,8 @@ namespace XCharts { ++EditorGUI.indentLevel; + EditorGUI.PropertyField(drawRect, m_Gap); + drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; EditorGUI.PropertyField(drawRect, m_SizeType); drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; SerieSymbolSizeType sizeType = (SerieSymbolSizeType)m_SizeType.enumValueIndex; @@ -84,13 +87,13 @@ namespace XCharts switch (sizeType) { case SerieSymbolSizeType.Custom: - return 9 * EditorGUIUtility.singleLineHeight + 9 * EditorGUIUtility.standardVerticalSpacing; - case SerieSymbolSizeType.FromData: return 10 * EditorGUIUtility.singleLineHeight + 10 * EditorGUIUtility.standardVerticalSpacing; + case SerieSymbolSizeType.FromData: + return 11 * EditorGUIUtility.singleLineHeight + 11 * EditorGUIUtility.standardVerticalSpacing; case SerieSymbolSizeType.Callback: - return 9 * EditorGUIUtility.singleLineHeight + 9 * EditorGUIUtility.standardVerticalSpacing; + return 10 * EditorGUIUtility.singleLineHeight + 10 * EditorGUIUtility.standardVerticalSpacing; } - return 9 * EditorGUIUtility.singleLineHeight + 9 * EditorGUIUtility.standardVerticalSpacing; + return 10 * EditorGUIUtility.singleLineHeight + 10 * EditorGUIUtility.standardVerticalSpacing; } else { diff --git a/Assets/XCharts/Runtime/Component/Sub/SerieSymbol.cs b/Assets/XCharts/Runtime/Component/Sub/SerieSymbol.cs index fcc17d49..a624f575 100644 --- a/Assets/XCharts/Runtime/Component/Sub/SerieSymbol.cs +++ b/Assets/XCharts/Runtime/Component/Sub/SerieSymbol.cs @@ -92,6 +92,7 @@ namespace XCharts [SerializeField] private int m_StartIndex; [SerializeField] private int m_Interval; [SerializeField] private bool m_ForceShowLast = false; + [SerializeField] private float m_Gap = 0; /// /// the type of symbol. @@ -163,6 +164,11 @@ namespace XCharts /// 是否强制显示最后一个图形标记。 /// public bool forceShowLast { get { return m_ForceShowLast; } set { m_ForceShowLast = value; } } + /// + /// the gap of symbol and line segment. + /// 图形标记和线条的间隙距离。 + /// + public float gap { get { return m_Gap; } set { m_Gap = value; } } private List m_AnimationSize = new List() { 0, 5, 10 }; /// /// the setting for effect scatter. diff --git a/Assets/XCharts/Runtime/Internal/BaseChart.cs b/Assets/XCharts/Runtime/Internal/BaseChart.cs index 362e15af..603082c4 100644 --- a/Assets/XCharts/Runtime/Internal/BaseChart.cs +++ b/Assets/XCharts/Runtime/Internal/BaseChart.cs @@ -723,35 +723,67 @@ namespace XCharts } protected void DrawSymbol(VertexHelper vh, SerieSymbolType type, float symbolSize, - float tickness, Vector3 pos, Color color) + float tickness, Vector3 pos, Color color, float gap) { + var backgroundColor = m_ThemeInfo.backgroundColor; + var smoothness = m_Settings.cicleSmoothness; switch (type) { case SerieSymbolType.None: break; case SerieSymbolType.Circle: - ChartDrawer.DrawCricle(vh, pos, symbolSize, color, m_Settings.cicleSmoothness); + if (gap > 0) + { + ChartDrawer.DrawDoughnut(vh, pos, symbolSize, symbolSize + gap, backgroundColor, color, smoothness); + } + else + { + ChartDrawer.DrawCricle(vh, pos, symbolSize, color, smoothness); + } break; case SerieSymbolType.EmptyCircle: - ChartDrawer.DrawEmptyCricle(vh, pos, symbolSize, tickness, color, m_ThemeInfo.backgroundColor, m_Settings.cicleSmoothness); + if (gap > 0) + { + ChartDrawer.DrawCricle(vh, pos, symbolSize + gap, backgroundColor, smoothness); + ChartDrawer.DrawEmptyCricle(vh, pos, symbolSize, tickness, color, backgroundColor, smoothness); + } + else + { + ChartDrawer.DrawEmptyCricle(vh, pos, symbolSize, tickness, color, backgroundColor, smoothness); + } break; case SerieSymbolType.Rect: - ChartDrawer.DrawPolygon(vh, pos, symbolSize, color); + if (gap > 0) + { + ChartDrawer.DrawPolygon(vh, pos, symbolSize + gap, backgroundColor); + ChartDrawer.DrawPolygon(vh, pos, symbolSize, color); + } + else + { + ChartDrawer.DrawPolygon(vh, pos, symbolSize, color); + } break; case SerieSymbolType.Triangle: - var x = symbolSize * Mathf.Cos(30 * Mathf.PI / 180); - var y = symbolSize * Mathf.Sin(30 * Mathf.PI / 180); - var p1 = new Vector2(pos.x - x, pos.y - y); - var p2 = new Vector2(pos.x, pos.y + symbolSize); - var p3 = new Vector2(pos.x + x, pos.y - y); - ChartDrawer.DrawTriangle(vh, p1, p2, p3, color); + if (gap > 0) + { + ChartDrawer.DrawTriangle(vh, pos, symbolSize + gap, backgroundColor); + ChartDrawer.DrawTriangle(vh, pos, symbolSize, color); + } + else + { + ChartDrawer.DrawTriangle(vh, pos, symbolSize, color); + } break; case SerieSymbolType.Diamond: - p1 = new Vector2(pos.x - symbolSize, pos.y); - p2 = new Vector2(pos.x, pos.y + symbolSize); - p3 = new Vector2(pos.x + symbolSize, pos.y); - var p4 = new Vector2(pos.x, pos.y - symbolSize); - ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, color); + if (gap > 0) + { + ChartDrawer.DrawDiamond(vh, pos, symbolSize + gap, backgroundColor); + ChartDrawer.DrawDiamond(vh, pos, symbolSize, color); + } + else + { + ChartDrawer.DrawDiamond(vh, pos, symbolSize, color); + } break; } } diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs index fc6701f2..0a4cf136 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawLine.cs @@ -37,7 +37,7 @@ namespace XCharts float symbolSize = highlight ? serie.symbol.selectedSize : serie.symbol.size; var symbolColor = serie.GetSymbolColor(m_ThemeInfo, n, highlight); symbolSize = serie.animation.GetSysmbolSize(symbolSize); - DrawSymbol(vh, serie.symbol.type, symbolSize, serie.lineStyle.width, p, symbolColor); + DrawSymbol(vh, serie.symbol.type, symbolSize, serie.lineStyle.width, p, symbolColor, serie.symbol.gap); } } } @@ -355,7 +355,7 @@ namespace XCharts else yDataHig = (yValue - yMinValue) / (yMaxValue - yMinValue) * coordinateHeight; } np = new Vector3(pX, pY + yDataHig); - + } return yDataHig; } diff --git a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawScatter.cs b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawScatter.cs index 5f0f355b..6682ebde 100644 --- a/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawScatter.cs +++ b/Assets/XCharts/Runtime/Internal/CoordinateChart_DrawScatter.cs @@ -55,13 +55,13 @@ namespace XCharts { var nowSize = serie.symbol.animationSize[count]; color.a = (symbolSize - nowSize) / symbolSize; - DrawSymbol(vh, serie.symbol.type, nowSize, 3, pos, color); + DrawSymbol(vh, serie.symbol.type, nowSize, 3, pos, color, serie.symbol.gap); } RefreshChart(); } else { - DrawSymbol(vh, serie.symbol.type, symbolSize, 3, pos, color); + DrawSymbol(vh, serie.symbol.type, symbolSize, 3, pos, color, serie.symbol.gap); } } if (!serie.animation.IsFinish()) diff --git a/Assets/XCharts/Runtime/RadarChart.cs b/Assets/XCharts/Runtime/RadarChart.cs index 6c49234c..91916f67 100644 --- a/Assets/XCharts/Runtime/RadarChart.cs +++ b/Assets/XCharts/Runtime/RadarChart.cs @@ -297,7 +297,8 @@ namespace XCharts symbolColor.a *= serie.symbol.opacity; foreach (var point in pointList) { - DrawSymbol(vh, serie.symbol.type, symbolSize, serie.lineStyle.width, point, symbolColor); + DrawSymbol(vh, serie.symbol.type, symbolSize, serie.lineStyle.width, point, symbolColor, + serie.symbol.gap); } } } diff --git a/Assets/XCharts/Runtime/Utility/ChartDrawer.cs b/Assets/XCharts/Runtime/Utility/ChartDrawer.cs index 7265b1fb..2b94a4bc 100644 --- a/Assets/XCharts/Runtime/Utility/ChartDrawer.cs +++ b/Assets/XCharts/Runtime/Utility/ChartDrawer.cs @@ -152,6 +152,15 @@ namespace XCharts DrawDotLine(vh, p1, p2, size, color, zebraWidth, zebraGap); } + public static void DrawDiamond(VertexHelper vh, Vector3 pos, float size, Color32 color) + { + var p1 = new Vector2(pos.x - size, pos.y); + var p2 = new Vector2(pos.x, pos.y + size); + var p3 = new Vector2(pos.x + size, pos.y); + var p4 = new Vector2(pos.x, pos.y - size); + ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, color); + } + public static void DrawPolygon(VertexHelper vh, Vector3 p, float radius, Color32 color, bool vertical = true) { @@ -266,6 +275,16 @@ namespace XCharts DrawTriangle(vh, p1, p2, p3, color, color, color); } + public static void DrawTriangle(VertexHelper vh, Vector3 pos, float size, Color32 color) + { + var x = size * Mathf.Cos(30 * Mathf.PI / 180); + var y = size * Mathf.Sin(30 * Mathf.PI / 180); + var p1 = new Vector2(pos.x - x, pos.y - y); + var p2 = new Vector2(pos.x, pos.y + size); + var p3 = new Vector2(pos.x + x, pos.y - y); + ChartDrawer.DrawTriangle(vh, p1, p2, p3, color); + } + public static void DrawTriangle(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Color32 color, Color32 color2, Color32 color3) {