From 2a2725a196777680e22cac47115fa8589973e377 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Tue, 28 Apr 2020 12:28:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`=E8=87=AA=E7=94=B1=E9=94=9A?= =?UTF-8?q?=E7=82=B9`=E6=94=AF=E6=8C=81=EF=BC=8C=E4=BB=BB=E6=84=8F?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + Demo/Runtime/Demo_Test.cs | 3 +- Documentation/XChartsAPI.md | 2 +- Editor/BaseChartEditor.cs | 4 +- Editor/CoordinateChartEditor.cs | 10 +- Editor/RadarChartEditor.cs | 2 +- Editor/XChartEditor.cs | 4 + Runtime/API/BaseChart_API.cs | 85 ++++--- Runtime/API/CoordinateChart_API.cs | 4 +- Runtime/Component/Main/DataZoom.cs | 16 +- Runtime/Component/Main/Radar.cs | 4 +- Runtime/Component/Main/Serie.cs | 16 +- Runtime/Component/Main/VisualMap.cs | 20 +- Runtime/GaugeChart.cs | 17 +- Runtime/HeatmapChart.cs | 12 +- Runtime/Helper/CheckHelper.cs | 1 - Runtime/Helper/LayoutHelper.cs | 233 ++++++++++++++++++ Runtime/Helper/LayoutHelper.cs.meta | 11 + Runtime/Helper/SerieHelper.cs | 16 ++ Runtime/Helper/TooltipHelper.cs | 14 ++ Runtime/Internal/BaseChart.cs | 101 +++++--- Runtime/Internal/CoordinateChart.cs | 100 ++++---- .../Internal/CoordinateChart_DrawHeatmap.cs | 16 +- Runtime/PieChart.cs | 14 +- Runtime/RadarChart.cs | 22 +- Runtime/RingChart.cs | 15 +- Runtime/ScatterChart.cs | 13 +- 27 files changed, 513 insertions(+), 243 deletions(-) create mode 100644 Runtime/Helper/LayoutHelper.cs create mode 100644 Runtime/Helper/LayoutHelper.cs.meta diff --git a/CHANGELOG.md b/CHANGELOG.md index 62f1fce1..60472e62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # 更新日志 +* (2020.04.28) 增加`自由锚点`支持,任意对齐方式 * (2020.04.23) 优化`ScatterChart`的`Tooltip`显示效果 * (2020.04.23) 增加`Tooltip`的`formatter`对`{.}`、`{c:0}`、`{c1:1}`的支持 * (2020.04.19) 优化`LineChart`折线图的区域填充渐变效果 diff --git a/Demo/Runtime/Demo_Test.cs b/Demo/Runtime/Demo_Test.cs index 78487be2..6677fc12 100644 --- a/Demo/Runtime/Demo_Test.cs +++ b/Demo/Runtime/Demo_Test.cs @@ -35,7 +35,8 @@ namespace XCharts void OnTestBtn() { - chart.ClearData(); + //chart.ClearData(); + chart.SetSize(800,400); } void AddData() diff --git a/Documentation/XChartsAPI.md b/Documentation/XChartsAPI.md index b54a6fea..3b01237c 100644 --- a/Documentation/XChartsAPI.md +++ b/Documentation/XChartsAPI.md @@ -14,7 +14,7 @@ * `BaseChart.chartWidth`:图表的宽。 * `BaseChart.chartHeight`:图表的高。 * `BaseChart.customDrawCallback`:自定义绘制回调函数。 -* `BaseChart.SetSize(float width, float height)`:设置图表的大小。 +* `BaseChart.SetSize(float width, float height)`: 设置图表的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform)。 * `BaseChart.ClearData()`:清除所有数据,系列列表会保留,只是移除列表中系列的数据。 * `BaseChart.RemoveData()`:清除所有系列和图例数据,系列列表也会被清除。 * `BaseChart.RemoveData(string serieName)`:清除指定系列名称的数据。 diff --git a/Editor/BaseChartEditor.cs b/Editor/BaseChartEditor.cs index 6cced927..3ed77cfe 100644 --- a/Editor/BaseChartEditor.cs +++ b/Editor/BaseChartEditor.cs @@ -75,8 +75,8 @@ namespace XCharts protected virtual void OnStartInspectorGUI() { EditorGUILayout.PropertyField(m_Script); - EditorGUILayout.PropertyField(m_ChartWidth); - EditorGUILayout.PropertyField(m_ChartHeight); + // EditorGUILayout.PropertyField(m_ChartWidth); + // EditorGUILayout.PropertyField(m_ChartHeight); EditorGUILayout.PropertyField(m_ThemeInfo, true); EditorGUILayout.PropertyField(m_Title, true); EditorGUILayout.PropertyField(m_Legend, true); diff --git a/Editor/CoordinateChartEditor.cs b/Editor/CoordinateChartEditor.cs index d39944f8..f25acc4f 100644 --- a/Editor/CoordinateChartEditor.cs +++ b/Editor/CoordinateChartEditor.cs @@ -39,8 +39,14 @@ namespace XCharts protected override void OnStartInspectorGUI() { base.OnStartInspectorGUI(); - EditorGUILayout.PropertyField(m_DataZoom); - EditorGUILayout.PropertyField(m_VisualMap); + if (m_Target is LineChart || m_Target is BarChart) + { + EditorGUILayout.PropertyField(m_DataZoom); + } + if (m_Target is HeatmapChart) + { + EditorGUILayout.PropertyField(m_VisualMap); + } EditorGUILayout.PropertyField(m_Grid); for (int i = 0; i < m_XAxises.arraySize; i++) { diff --git a/Editor/RadarChartEditor.cs b/Editor/RadarChartEditor.cs index cb4bed97..1cfe72eb 100644 --- a/Editor/RadarChartEditor.cs +++ b/Editor/RadarChartEditor.cs @@ -28,8 +28,8 @@ namespace XCharts protected override void OnEndInspectorGUI() { - base.OnEndInspectorGUI(); EditorGUILayout.PropertyField(m_Radars, true); + base.OnEndInspectorGUI(); } } } \ No newline at end of file diff --git a/Editor/XChartEditor.cs b/Editor/XChartEditor.cs index f1b7cb52..4df8ac79 100644 --- a/Editor/XChartEditor.cs +++ b/Editor/XChartEditor.cs @@ -66,6 +66,10 @@ namespace XCharts chart.transform.SetParent(parent); chart.transform.localScale = Vector3.one; chart.transform.localPosition = Vector3.zero; + var rect = chart.GetComponent(); + rect.anchorMin = new Vector2(0.5f, 0.5f); + rect.anchorMax = new Vector2(0.5f, 0.5f); + rect.pivot = new Vector2(0.5f, 0.5f); } [MenuItem("GameObject/XCharts/LineChart", priority = 44)] diff --git a/Runtime/API/BaseChart_API.cs b/Runtime/API/BaseChart_API.cs index 2ac5a924..67699b78 100644 --- a/Runtime/API/BaseChart_API.cs +++ b/Runtime/API/BaseChart_API.cs @@ -48,6 +48,16 @@ namespace XCharts /// public Settings settings { get { return m_Settings; } } /// + /// The x of chart. + /// 图表的X + /// + public float chartX { get { return m_ChartX; } } + /// + /// The y of chart. + /// 图表的Y + /// + public float chartY { get { return m_ChartY; } } + /// /// The width of chart. /// 图表的宽 /// @@ -58,6 +68,13 @@ namespace XCharts /// public float chartHeight { get { return m_ChartHeight; } } /// + /// The position of chart. + /// 图表的左下角起始坐标。 + /// + /// + public Vector3 chartPosition { get { return m_ChartPosition; } } + public Rect chartRect { get { return m_ChartRect; } } + /// /// The postion of pointer. /// 鼠标位置 /// @@ -70,21 +87,22 @@ namespace XCharts /// 警告信息。 /// public string warningInfo { get; protected set; } + /// - /// Set the size of chart. - /// 设置图表的大小。 + /// 设置图表的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform) /// - /// width - /// height + /// + /// public virtual void SetSize(float width, float height) { - m_ChartWidth = width; - m_ChartHeight = height; - m_CheckWidth = width; - m_CheckHeight = height; - - rectTransform.sizeDelta = new Vector2(m_ChartWidth, m_ChartHeight); - OnSizeChanged(); + if (LayerHelper.IsFixedWidthHeight(rectTransform)) + { + rectTransform.sizeDelta = new Vector2(width, height); + } + else + { + Debug.LogError("Can't set size on stretch pivot,you need to modify rectTransform by yourself."); + } } /// @@ -486,11 +504,7 @@ namespace XCharts m_RefreshChart = true; } - [Obsolete("Use BaseChart.RefreshLabel() instead.", true)] - public void ReinitChartLabel() - { - RefreshLabel(); - } + /// /// 刷新文本标签Label,重新初始化,当有改动Label参数时手动调用改接口 @@ -541,15 +555,7 @@ namespace XCharts m_Series.AnimationEnable(flag); } - [Obsolete("Use BaseChart.AnimationFadeIn() instead.", true)] - public void AnimationStart() - { - } - [Obsolete("Use BaseChart.AnimationFadeOut() instead.", true)] - public void MissAnimationStart() - { - } /// /// fadeIn animation. @@ -620,8 +626,8 @@ namespace XCharts /// public bool IsInChart(Vector2 local) { - if (local.x < 0 || local.x > chartWidth || - local.y < 0 || local.y > chartHeight) + if (local.x < m_ChartX || local.x > m_ChartX + chartWidth || + local.y < m_ChartY || local.y > m_ChartY + chartHeight) { return false; } @@ -634,10 +640,10 @@ namespace XCharts else { var np = new Vector3(pos.x, pos.y); - if (np.x < 0) np.x = 0; - if (np.x > chartWidth) np.x = chartWidth; - if (np.y < 0) np.y = 0; - if (np.y > chartHeight) np.y = chartHeight; + if (np.x < m_ChartX) np.x = m_ChartX; + if (np.x > m_ChartX + chartWidth) np.x = m_ChartX + chartWidth; + if (np.y < m_ChartY) np.y = m_ChartY; + if (np.y > m_ChartY + chartHeight) np.y = m_ChartY + chartHeight; return np; } } @@ -651,5 +657,24 @@ namespace XCharts warningInfo = CheckHelper.CheckChart(this); return warningInfo; } + + public Vector3 GetTitlePosition() + { + return chartPosition + m_Title.location.GetPosition(chartWidth, chartHeight); + } + + public Vector3 GetLegendPosition() + { + return chartPosition + m_Legend.location.GetPosition(chartWidth, chartHeight); + } + + [Obsolete("Use BaseChart.RefreshLabel() instead.", true)] + public void ReinitChartLabel() { } + + [Obsolete("Use BaseChart.AnimationFadeIn() instead.", true)] + public void AnimationStart() { } + + [Obsolete("Use BaseChart.AnimationFadeOut() instead.", true)] + public void MissAnimationStart() { } } } diff --git a/Runtime/API/CoordinateChart_API.cs b/Runtime/API/CoordinateChart_API.cs index e138873a..eb100398 100644 --- a/Runtime/API/CoordinateChart_API.cs +++ b/Runtime/API/CoordinateChart_API.cs @@ -22,12 +22,12 @@ namespace XCharts /// The lower left position x of coordinate system. /// 坐标系的左下角坐标X。 /// - public float coordinateX { get { return m_Grid.left; } } + public float coordinateX { get { return m_ChartX + m_Grid.left; } } /// /// The lower left position y of coordinate system. /// 坐标系的左下角坐标Y。 /// - public float coordinateY { get { return m_Grid.bottom; } } + public float coordinateY { get { return m_ChartY + m_Grid.bottom; } } [Obsolete("Use CoordinateChart.coordinateWidth instead.", true)] public float coordinateWid { get { return coordinateWidth; } } diff --git a/Runtime/Component/Main/DataZoom.cs b/Runtime/Component/Main/DataZoom.cs index 84cd3115..43fa6c3f 100644 --- a/Runtime/Component/Main/DataZoom.cs +++ b/Runtime/Component/Main/DataZoom.cs @@ -321,9 +321,9 @@ namespace XCharts /// /// /// - public bool IsInZoom(Vector2 pos, float startX, float width) + public bool IsInZoom(Vector2 pos, float startX, float startY, float width) { - Rect rect = Rect.MinMaxRect(startX, m_Bottom, startX + width, m_Bottom + m_Height); + Rect rect = Rect.MinMaxRect(startX, startY + m_Bottom, startX + width, startY + m_Bottom + m_Height); return rect.Contains(pos); } @@ -334,11 +334,11 @@ namespace XCharts /// /// /// - public bool IsInSelectedZoom(Vector2 pos, float startX, float width) + public bool IsInSelectedZoom(Vector2 pos, float startX, float startY, float width) { var start = startX + width * m_Start / 100; var end = startX + width * m_End / 100; - Rect rect = Rect.MinMaxRect(start, m_Bottom, end, m_Bottom + m_Height); + Rect rect = Rect.MinMaxRect(start, startY + m_Bottom, end, startY + m_Bottom + m_Height); return rect.Contains(pos); } @@ -349,10 +349,10 @@ namespace XCharts /// /// /// - public bool IsInStartZoom(Vector2 pos, float startX, float width) + public bool IsInStartZoom(Vector2 pos, float startX, float startY, float width) { var start = startX + width * m_Start / 100; - Rect rect = Rect.MinMaxRect(start - 10, m_Bottom, start + 10, m_Bottom + m_Height); + Rect rect = Rect.MinMaxRect(start - 10, startY + m_Bottom, start + 10, startY + m_Bottom + m_Height); return rect.Contains(pos); } @@ -363,10 +363,10 @@ namespace XCharts /// /// /// - public bool IsInEndZoom(Vector2 pos, float startX, float width) + public bool IsInEndZoom(Vector2 pos, float startX, float startY, float width) { var end = startX + width * m_End / 100; - Rect rect = Rect.MinMaxRect(end - 10, m_Bottom, end + 10, m_Bottom + m_Height); + Rect rect = Rect.MinMaxRect(end - 10, startY + m_Bottom, end + 10, startY + m_Bottom + m_Height); return rect.Contains(pos); } diff --git a/Runtime/Component/Main/Radar.cs b/Runtime/Component/Main/Radar.cs index 53c9b9e7..cda5aea7 100644 --- a/Runtime/Component/Main/Radar.cs +++ b/Runtime/Component/Main/Radar.cs @@ -282,12 +282,12 @@ namespace XCharts return 0; } - internal void UpdateRadarCenter(float chartWidth, float chartHeight) + internal void UpdateRadarCenter(Vector3 chartPosition, float chartWidth, float chartHeight) { if (center.Length < 2) return; var centerX = center[0] <= 1 ? chartWidth * center[0] : center[0]; var centerY = center[1] <= 1 ? chartHeight * center[1] : center[1]; - runtimeCenterPos = new Vector2(centerX, centerY); + runtimeCenterPos = chartPosition + new Vector3(centerX, centerY); if (radius <= 0) { runtimeRadius = 0; diff --git a/Runtime/Component/Main/Serie.cs b/Runtime/Component/Main/Serie.cs index 55cf3dd3..785a42f4 100644 --- a/Runtime/Component/Main/Serie.cs +++ b/Runtime/Component/Main/Serie.cs @@ -1572,21 +1572,7 @@ namespace XCharts return false; } - /// - /// 更新运行时中心点和半径 - /// - /// - /// - internal void UpdateCenter(float chartWidth, float chartHeight) - { - if (center.Length < 2) return; - var centerX = center[0] <= 1 ? chartWidth * center[0] : center[0]; - var centerY = center[1] <= 1 ? chartHeight * center[1] : center[1]; - runtimeCenterPos = new Vector2(centerX, centerY); - var minWidth = Mathf.Min(chartWidth, chartHeight); - runtimeInsideRadius = radius[0] <= 1 ? minWidth * radius[0] : radius[0]; - runtimeOutsideRadius = radius[1] <= 1 ? minWidth * radius[1] : radius[1]; - } + /// /// 设置指定index的数据图标的尺寸 diff --git a/Runtime/Component/Main/VisualMap.cs b/Runtime/Component/Main/VisualMap.cs index 09bf484f..7504c40e 100644 --- a/Runtime/Component/Main/VisualMap.cs +++ b/Runtime/Component/Main/VisualMap.cs @@ -381,9 +381,9 @@ namespace XCharts } } - public float GetValue(Vector3 pos, float chartWidth, float chartHeight) + public float GetValue(Vector3 pos, Rect chartRect) { - var centerPos = location.GetPosition(chartWidth, chartHeight); + var centerPos = new Vector3(chartRect.x, chartRect.y) + location.GetPosition(chartRect.width, chartRect.height); var pos1 = centerPos + (runtimeIsVertical ? Vector3.down : Vector3.left) * itemHeight / 2; var pos2 = centerPos + (runtimeIsVertical ? Vector3.up : Vector3.right) * itemHeight / 2; if (runtimeIsVertical) @@ -400,9 +400,9 @@ namespace XCharts } } - public bool IsInRect(Vector3 local, float chartWidth, float chartHeight, float triangleLen = 20) + public bool IsInRect(Vector3 local, Rect chartRect, float triangleLen = 20) { - var centerPos = location.GetPosition(chartWidth, chartHeight); + var centerPos = new Vector3(chartRect.x, chartRect.y) + location.GetPosition(chartRect.width, chartRect.height); var diff = calculable ? triangleLen : 0; if (local.x >= centerPos.x - itemWidth / 2 - diff && local.x <= centerPos.x + itemWidth / 2 + diff && local.y >= centerPos.y - itemHeight / 2 - diff && local.y <= centerPos.y + itemHeight / 2 + diff) @@ -415,9 +415,9 @@ namespace XCharts } } - public bool IsInRangeRect(Vector3 local, float chartWidth, float chartHeight) + public bool IsInRangeRect(Vector3 local, Rect chartRect) { - var centerPos = location.GetPosition(chartWidth, chartHeight); + var centerPos = new Vector3(chartRect.x, chartRect.y) + location.GetPosition(chartRect.width, chartRect.height); if (orient == Orient.Vertical) { var pos1 = centerPos + Vector3.down * itemHeight / 2; @@ -432,9 +432,9 @@ namespace XCharts } } - public bool IsInRangeMinRect(Vector3 local, float chartWidth, float chartHeight, float triangleLen) + public bool IsInRangeMinRect(Vector3 local, Rect chartRect, float triangleLen) { - var centerPos = location.GetPosition(chartWidth, chartHeight); + var centerPos = new Vector3(chartRect.x, chartRect.y) + location.GetPosition(chartRect.width, chartRect.height); if (orient == Orient.Vertical) { var radius = triangleLen / 2; @@ -454,9 +454,9 @@ namespace XCharts } } - public bool IsInRangeMaxRect(Vector3 local, float chartWidth, float chartHeight, float triangleLen) + public bool IsInRangeMaxRect(Vector3 local, Rect chartRect, float triangleLen) { - var centerPos = location.GetPosition(chartWidth, chartHeight); + var centerPos = new Vector3(chartRect.x, chartRect.y) + location.GetPosition(chartRect.width, chartRect.height); if (orient == Orient.Vertical) { var radius = triangleLen / 2; diff --git a/Runtime/GaugeChart.cs b/Runtime/GaugeChart.cs index 1593313c..074cf8b8 100644 --- a/Runtime/GaugeChart.cs +++ b/Runtime/GaugeChart.cs @@ -84,18 +84,17 @@ namespace XCharts private void InitAxisLabel() { - var labelObject = ChartHelper.AddObject(s_AxisLabelObjectName, transform, Vector2.zero, - Vector2.zero, Vector2.zero, new Vector2(chartWidth, chartHeight)); + var labelObject = ChartHelper.AddObject(s_AxisLabelObjectName, transform, m_ChartMinAnchor, + m_ChartMaxAnchor, m_ChartPivot, m_ChartSizeDelta); SerieLabelPool.ReleaseAll(labelObject.transform); for (int i = 0; i < m_Series.Count; i++) { var serie = m_Series.list[i]; - var serieLabel = serie.gaugeAxis.axisLabel; - serie.gaugeAxis.ClearLabelObject(); - serie.UpdateCenter(chartWidth, chartHeight); var count = serie.splitNumber > 36 ? 36 : (serie.splitNumber + 1); var startAngle = serie.startAngle; + serie.gaugeAxis.ClearLabelObject(); + SerieHelper.UpdateCenter(serie, chartPosition, chartWidth, chartHeight); for (int j = 0; j < count; j++) { var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, i, j); @@ -124,6 +123,12 @@ namespace XCharts base.OnThemeChanged(); } + protected override void OnSizeChanged() + { + base.OnSizeChanged(); + InitAxisLabel(); + } + private void DrawData(VertexHelper vh) { for (int i = 0; i < m_Series.Count; i++) @@ -136,7 +141,7 @@ namespace XCharts private void DrawGauge(VertexHelper vh, Serie serie) { - serie.UpdateCenter(chartWidth, chartHeight); + SerieHelper.UpdateCenter(serie, chartPosition, chartWidth, chartHeight); var destAngle = GetCurrAngle(serie, true); serie.animation.InitProgress(0, serie.startAngle, destAngle); var currAngle = serie.animation.IsFinish() ? GetCurrAngle(serie, false) : serie.animation.GetCurrDetail(); diff --git a/Runtime/HeatmapChart.cs b/Runtime/HeatmapChart.cs index edb1fd21..c2ed085e 100644 --- a/Runtime/HeatmapChart.cs +++ b/Runtime/HeatmapChart.cs @@ -115,17 +115,7 @@ namespace XCharts } } } - m_Tooltip.UpdateContentText(sb.ToString().Trim()); - var pos = m_Tooltip.GetContentPos(); - if (pos.x + m_Tooltip.runtimeWidth > chartWidth) - { - pos.x = chartWidth - m_Tooltip.runtimeWidth; - } - if (pos.y - m_Tooltip.runtimeHeight < 0) - { - pos.y = m_Tooltip.runtimeHeight; - } - m_Tooltip.UpdateContentPos(pos); + TooltipHelper.SetContentAndPosition(tooltip,sb.ToString().Trim(),chartRect); m_Tooltip.SetActive(true); for (int i = 0; i < m_XAxises.Count; i++) diff --git a/Runtime/Helper/CheckHelper.cs b/Runtime/Helper/CheckHelper.cs index 2d5cf764..a15b3e9a 100644 --- a/Runtime/Helper/CheckHelper.cs +++ b/Runtime/Helper/CheckHelper.cs @@ -61,7 +61,6 @@ namespace XCharts if (legend.textStyle.color != Color.clear && legend.textStyle.color.a == 0) sb.Append("warning:legend->textStyle->color alpha is 0\n"); var serieNameList = chart.series.GetLegalSerieNameList(); - Debug.LogError("namelist:" + serieNameList.Count); if (serieNameList.Count == 0) sb.Append("warning:legend need serie.name or serieData.name not empty\n"); foreach (var category in legend.data) { diff --git a/Runtime/Helper/LayoutHelper.cs b/Runtime/Helper/LayoutHelper.cs new file mode 100644 index 00000000..583f927a --- /dev/null +++ b/Runtime/Helper/LayoutHelper.cs @@ -0,0 +1,233 @@ +/******************************************/ +/* */ +/* Copyright (c) 2018 monitor1394 */ +/* https://github.com/monitor1394 */ +/* */ +/******************************************/ + +using UnityEngine; + +namespace XCharts +{ + public static class LayerHelper + { + private static Vector2 s_Vector0And0 = new Vector2(0, 0); + private static Vector2 s_Vector0And0Dot5 = new Vector2(0, 0.5f); + private static Vector2 s_Vector0And1 = new Vector2(0, 1f); + private static Vector2 s_Vector0Dot5And1 = new Vector2(0.5f, 1f); + private static Vector2 s_Vector0Dot5And0Dot5 = new Vector2(0.5f, 0.5f); + private static Vector2 s_Vector0Dot5And0 = new Vector2(0.5f, 0f); + private static Vector2 s_Vector1And1 = new Vector2(1f, 1f); + private static Vector2 s_Vector1And0Dot5 = new Vector2(1f, 0.5f); + private static Vector2 s_Vector1And0 = new Vector2(1f, 0); + + internal static Vector2 ResetChartPositionAndPivot(Vector2 minAnchor, Vector2 maxAnchor, float width, float height, ref float chartX, + ref float chartY) + { + if (IsLeftTop(minAnchor, maxAnchor)) + { + chartX = 0; + chartY = -height; + return s_Vector0And1; + } + else if (IsLeftCenter(minAnchor, maxAnchor)) + { + chartX = 0; + chartY = -height / 2; + return s_Vector0And0Dot5; + } + else if (IsLeftBottom(minAnchor, maxAnchor)) + { + chartX = 0; + chartY = 0; + return s_Vector0And0; + } + else if (IsCenterTop(minAnchor, maxAnchor)) + { + chartX = -width / 2; + chartY = -height; + return s_Vector0Dot5And1; + } + else if (IsCenterCenter(minAnchor, maxAnchor)) + { + chartX = -width / 2; + chartY = -height / 2; + return s_Vector0Dot5And0Dot5; + } + else if (IsCenterBottom(minAnchor, maxAnchor)) + { + chartX = -width / 2; + chartY = 0; + return s_Vector0Dot5And0; + } + else if (IsRightTop(minAnchor, maxAnchor)) + { + chartX = -width; + chartY = -height; + return s_Vector1And1; + } + else if (IsRightCenter(minAnchor, maxAnchor)) + { + chartX = -width; + chartY = -height / 2; + return s_Vector1And0Dot5; + } + else if (IsRightBottom(minAnchor, maxAnchor)) + { + chartX = -width; + chartY = 0; + return s_Vector1And0; + } + else if (IsStretchTop(minAnchor, maxAnchor)) + { + chartX = -width / 2; + chartY = -height; + return s_Vector0Dot5And1; + } + else if (IsStretchMiddle(minAnchor, maxAnchor)) + { + chartX = -width / 2; + chartY = -height / 2; + return s_Vector0Dot5And0Dot5; + } + else if (IsStretchBottom(minAnchor, maxAnchor)) + { + chartX = -width / 2; + chartY = 0; + return s_Vector0Dot5And0; + } + else if (IsStretchLeft(minAnchor, maxAnchor)) + { + chartX = 0; + chartY = -height / 2; + return s_Vector0And0Dot5; + } + else if (IsStretchCenter(minAnchor, maxAnchor)) + { + chartX = -width / 2; + chartY = -height / 2; + return s_Vector0Dot5And0Dot5; + } + else if (IsStretchRight(minAnchor, maxAnchor)) + { + chartX = -width; + chartY = -height / 2; + return s_Vector1And0Dot5; + } + else if (IsStretchStrech(minAnchor, maxAnchor)) + { + chartX = -width / 2; + chartY = -height / 2; + return s_Vector0Dot5And0Dot5; + } + chartX = 0; + chartY = 0; + return Vector2.zero; + } + + private static bool IsLeftTop(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0And1 && maxAnchor == s_Vector0And1; + } + + private static bool IsLeftCenter(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0And0Dot5 && maxAnchor == s_Vector0And0Dot5; + } + + private static bool IsLeftBottom(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == Vector2.zero && maxAnchor == Vector2.zero; + } + + private static bool IsCenterTop(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0Dot5And1 && maxAnchor == s_Vector0Dot5And1; + } + + private static bool IsCenterCenter(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0Dot5And0Dot5 && maxAnchor == s_Vector0Dot5And0Dot5; + } + + private static bool IsCenterBottom(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0Dot5And0 && maxAnchor == s_Vector0Dot5And0; + } + + private static bool IsRightTop(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector1And1 && maxAnchor == s_Vector1And1; + } + + private static bool IsRightCenter(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector1And0Dot5 && maxAnchor == s_Vector1And0Dot5; + } + + private static bool IsRightBottom(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector1And0 && maxAnchor == s_Vector1And0; + } + + private static bool IsStretchTop(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0And1 && maxAnchor == s_Vector1And1; + } + + private static bool IsStretchMiddle(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0And0Dot5 && maxAnchor == s_Vector1And0Dot5; + } + + private static bool IsStretchBottom(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0And0 && maxAnchor == s_Vector1And0; + } + + private static bool IsStretchLeft(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0And0 && maxAnchor == s_Vector0And1; + } + + private static bool IsStretchCenter(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0Dot5And0 && maxAnchor == s_Vector0Dot5And1; + } + + private static bool IsStretchRight(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector1And0 && maxAnchor == s_Vector1And1; + } + + private static bool IsStretchStrech(Vector2 minAnchor, Vector2 maxAnchor) + { + return minAnchor == s_Vector0And0 && maxAnchor == s_Vector1And1; + } + + public static bool IsStretchPivot(RectTransform rt) + { + return IsStretchTop(rt.anchorMin, rt.anchorMax) || + IsStretchMiddle(rt.anchorMin, rt.anchorMax) || + IsStretchBottom(rt.anchorMin, rt.anchorMax) || + IsStretchLeft(rt.anchorMin, rt.anchorMax) || + IsStretchCenter(rt.anchorMin, rt.anchorMax) || + IsStretchRight(rt.anchorMin, rt.anchorMax) || + IsStretchStrech(rt.anchorMin, rt.anchorMax); + } + + public static bool IsFixedWidthHeight(RectTransform rt) + { + return IsLeftTop(rt.anchorMin, rt.anchorMax) || + IsLeftCenter(rt.anchorMin, rt.anchorMax) || + IsLeftBottom(rt.anchorMin, rt.anchorMax) || + IsCenterTop(rt.anchorMin, rt.anchorMax) || + IsCenterCenter(rt.anchorMin, rt.anchorMax) || + IsCenterBottom(rt.anchorMin, rt.anchorMax) || + IsRightTop(rt.anchorMin, rt.anchorMax) || + IsRightCenter(rt.anchorMin, rt.anchorMax) || + IsRightBottom(rt.anchorMin, rt.anchorMax); + } + + } +} \ No newline at end of file diff --git a/Runtime/Helper/LayoutHelper.cs.meta b/Runtime/Helper/LayoutHelper.cs.meta new file mode 100644 index 00000000..5d6d6574 --- /dev/null +++ b/Runtime/Helper/LayoutHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b0e7e693f76fc4853a01019b644b5d88 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Helper/SerieHelper.cs b/Runtime/Helper/SerieHelper.cs index ba1f320e..17a67e05 100644 --- a/Runtime/Helper/SerieHelper.cs +++ b/Runtime/Helper/SerieHelper.cs @@ -240,5 +240,21 @@ namespace XCharts if (itemStyle != null) return itemStyle.cornerRadius; else return null; } + + /// + /// 更新运行时中心点和半径 + /// + /// + /// + internal static void UpdateCenter(Serie serie, Vector3 chartPosition, float chartWidth, float chartHeight) + { + if (serie.center.Length < 2) return; + var centerX = serie.center[0] <= 1 ? chartWidth * serie.center[0] : serie.center[0]; + var centerY = serie.center[1] <= 1 ? chartHeight * serie.center[1] : serie.center[1]; + serie.runtimeCenterPos = chartPosition + new Vector3(centerX, centerY); + var minWidth = Mathf.Min(chartWidth, chartHeight); + 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]; + } } } \ No newline at end of file diff --git a/Runtime/Helper/TooltipHelper.cs b/Runtime/Helper/TooltipHelper.cs index d3aa510f..0426fb35 100644 --- a/Runtime/Helper/TooltipHelper.cs +++ b/Runtime/Helper/TooltipHelper.cs @@ -175,6 +175,20 @@ namespace XCharts } } + public static void SetContentAndPosition(Tooltip tooltip,string content,Rect chartRect){ + tooltip.UpdateContentText(content); + var pos = tooltip.GetContentPos(); + if (pos.x + tooltip.runtimeWidth > chartRect.x + chartRect.width) + { + pos.x = chartRect.x + chartRect.width - tooltip.runtimeWidth; + } + if (pos.y - tooltip.runtimeHeight < chartRect.y) + { + pos.y = chartRect.y + tooltip.runtimeHeight; + } + tooltip.UpdateContentPos(pos); + } + public static string GetFormatterContent(Tooltip tooltip, int dataIndex, Series series, ThemeInfo themeInfo, string category = null, DataZoom dataZoom = null, bool isCartesian = false) { diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 13536d61..851995af 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -41,6 +41,8 @@ namespace XCharts [SerializeField] protected float m_ChartWidth; [SerializeField] protected float m_ChartHeight; + [SerializeField] protected float m_ChartX; + [SerializeField] protected float m_ChartY; [SerializeField] protected ThemeInfo m_ThemeInfo; [SerializeField] protected Title m_Title = Title.defaultTitle; [SerializeField] protected Legend m_Legend = Legend.defaultLegend; @@ -52,10 +54,12 @@ namespace XCharts [SerializeField] protected string m_DebugInfo = ""; [NonSerialized] private Theme m_CheckTheme = 0; - [NonSerialized] private float m_CheckWidth = 0; - [NonSerialized] private float m_CheckHeight = 0; - [NonSerialized] private Vector2 m_CheckMinAnchor; - [NonSerialized] private Vector2 m_CheckMaxAnchor; + [NonSerialized] protected Vector3 m_ChartPosition = Vector3.zero; + [NonSerialized] protected Vector2 m_ChartMinAnchor; + [NonSerialized] protected Vector2 m_ChartMaxAnchor; + [NonSerialized] protected Vector2 m_ChartPivot; + [NonSerialized] protected Vector2 m_ChartSizeDelta; + [NonSerialized] protected Rect m_ChartRect = new Rect(0, 0, 0, 0); [NonSerialized] protected bool m_RefreshChart = false; [NonSerialized] protected bool m_RefreshLabel = false; @@ -65,9 +69,9 @@ namespace XCharts [NonSerialized] protected bool m_IsPlayingAnimation = false; [NonSerialized] protected List m_LegendRealShowName = new List(); - protected Vector2 chartAnchorMax { get { return rectTransform.anchorMax; } } - protected Vector2 chartAnchorMin { get { return rectTransform.anchorMin; } } - protected Vector2 chartPivot { get { return rectTransform.pivot; } } + protected Vector2 chartAnchorMax { get { return m_ChartMinAnchor; } } + protected Vector2 chartAnchorMin { get { return m_ChartMaxAnchor; } } + protected Vector2 chartPivot { get { return m_ChartPivot; } } protected virtual void InitComponent() { @@ -85,13 +89,10 @@ namespace XCharts m_ThemeInfo = ThemeInfo.Default; } raycastTarget = false; - rectTransform.anchorMax = Vector2.zero; - rectTransform.anchorMin = Vector2.zero; - rectTransform.pivot = Vector2.zero; - m_ChartWidth = rectTransform.sizeDelta.x; - m_ChartHeight = rectTransform.sizeDelta.y; - m_CheckWidth = m_ChartWidth; - m_CheckHeight = m_ChartHeight; + m_ChartX = 100; + m_ChartY = 100; + m_ChartWidth = rectTransform.rect.width; + m_ChartHeight = rectTransform.rect.height; m_CheckTheme = m_ThemeInfo.theme; InitComponent(); m_Series.AnimationReset(); @@ -225,7 +226,7 @@ namespace XCharts Vector2 anchorMin = m_Title.location.runtimeAnchorMin; Vector2 anchorMax = m_Title.location.runtimeAnchorMax; Vector2 pivot = m_Title.location.runtimePivot; - Vector3 titlePosition = m_Title.location.GetPosition(chartWidth, chartHeight); + Vector3 titlePosition = GetTitlePosition(); Vector3 subTitlePosition = -new Vector3(0, m_Title.textStyle.fontSize + m_Title.itemGap, 0); float titleWid = chartWidth; @@ -269,7 +270,7 @@ namespace XCharts var legendObject = ChartHelper.AddObject(s_LegendObjectName, transform, anchorMin, anchorMax, pivot, new Vector2(chartWidth, chartHeight)); - legendObject.transform.localPosition = m_Legend.location.GetPosition(chartWidth, chartHeight); + legendObject.transform.localPosition = GetLegendPosition(); m_LegendRealShowName = m_Series.GetSerieNameList(); List datas; @@ -363,14 +364,14 @@ namespace XCharts private void InitSerieLabel() { - var labelObject = ChartHelper.AddObject(s_SerieLabelObjectName, transform, Vector2.zero, - Vector2.zero, Vector2.zero, new Vector2(chartWidth, chartHeight)); + var labelObject = ChartHelper.AddObject(s_SerieLabelObjectName, transform, m_ChartMinAnchor, + m_ChartMaxAnchor, m_ChartPivot, m_ChartSizeDelta); SerieLabelPool.ReleaseAll(labelObject.transform); int count = 0; for (int i = 0; i < m_Series.Count; i++) { var serie = m_Series.list[i]; - serie.UpdateCenter(chartWidth, chartHeight); + SerieHelper.UpdateCenter(serie, chartPosition, chartWidth, chartHeight); for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; @@ -404,8 +405,8 @@ namespace XCharts private void InitSerieTitle() { - var titleObject = ChartHelper.AddObject(s_SerieTitleObjectName, transform, Vector2.zero, - Vector2.zero, Vector2.zero, new Vector2(chartWidth, chartHeight)); + var titleObject = ChartHelper.AddObject(s_SerieTitleObjectName, transform, m_ChartMinAnchor, + m_ChartMaxAnchor, m_ChartPivot, new Vector2(chartWidth, chartHeight)); ChartHelper.HideAllObject(titleObject); for (int i = 0; i < m_Series.Count; i++) { @@ -436,8 +437,8 @@ namespace XCharts private void InitTooltip() { - var tooltipObject = ChartHelper.AddObject("tooltip", transform, chartAnchorMin, - chartAnchorMax, chartPivot, new Vector2(chartWidth, chartHeight)); + var tooltipObject = ChartHelper.AddObject("tooltip", transform, m_ChartMinAnchor, + m_ChartMaxAnchor, m_ChartPivot, m_ChartSizeDelta); tooltipObject.transform.localPosition = Vector3.zero; DestroyImmediate(tooltipObject.GetComponent()); var parent = tooltipObject.transform; @@ -459,24 +460,45 @@ namespace XCharts private void CheckSize() { - var sizeDelta = rectTransform.sizeDelta; - if (m_CheckWidth == 0 && m_CheckHeight == 0 && (sizeDelta.x != 0 || sizeDelta.y != 0)) + var currWidth = rectTransform.rect.width; + var currHeight = rectTransform.rect.height; + + if (m_ChartWidth == 0 && m_ChartHeight == 0 && (currWidth != 0 || currHeight != 0)) { Awake(); } - else if (m_CheckWidth != sizeDelta.x || m_CheckHeight != sizeDelta.y) - { - SetSize(sizeDelta.x, sizeDelta.y); - } - if (m_CheckMinAnchor != rectTransform.anchorMin || m_CheckMaxAnchor != rectTransform.anchorMax) + if (m_ChartWidth != currWidth || m_ChartHeight != currHeight || + m_ChartMinAnchor != rectTransform.anchorMin || m_ChartMaxAnchor != rectTransform.anchorMax) { - m_CheckMaxAnchor = rectTransform.anchorMax; - m_CheckMinAnchor = rectTransform.anchorMin; - m_ReinitLabel = true; + UpdateSize(); } } + private void UpdateSize() + { + m_ChartWidth = rectTransform.rect.width; + m_ChartHeight = rectTransform.rect.height; + + m_ChartMaxAnchor = rectTransform.anchorMax; + m_ChartMinAnchor = rectTransform.anchorMin; + m_ChartSizeDelta = rectTransform.sizeDelta; + m_ReinitLabel = true; + + rectTransform.pivot = LayerHelper.ResetChartPositionAndPivot(m_ChartMinAnchor, m_ChartMaxAnchor, + m_ChartWidth, m_ChartHeight, ref m_ChartX, ref m_ChartY); + m_ChartPivot = rectTransform.pivot; + + m_ChartRect.x = m_ChartX; + m_ChartRect.y = m_ChartY; + m_ChartRect.width = m_ChartWidth; + m_ChartRect.height = m_ChartHeight; + m_ChartPosition.x = m_ChartX; + m_ChartPosition.y = m_ChartY; + + OnSizeChanged(); + } + private void CheckLegend() { if (m_Legend.show) @@ -541,8 +563,7 @@ namespace XCharts } return; } - if (local.x < 0 || local.x > chartWidth || - local.y < 0 || local.y > chartHeight) + if (!IsInChart(local)) { if (m_Tooltip.IsActive()) { @@ -609,6 +630,7 @@ namespace XCharts m_Legend.SetAllDirty(); m_Tooltip.SetAllDirty(); m_Series.SetLabelDirty(); + RefreshChart(); } protected virtual void OnThemeChanged() @@ -721,10 +743,10 @@ namespace XCharts protected virtual void DrawBackground(VertexHelper vh) { - Vector3 p1 = new Vector3(0, chartHeight); - Vector3 p2 = new Vector3(chartWidth, chartHeight); - Vector3 p3 = new Vector3(chartWidth, 0); - Vector3 p4 = new Vector3(0, 0); + Vector3 p1 = new Vector3(chartX, chartY + chartHeight); + Vector3 p2 = new Vector3(chartX + chartWidth, chartY + chartHeight); + Vector3 p3 = new Vector3(chartX + chartWidth, chartY); + Vector3 p4 = new Vector3(chartX, chartY); ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, m_ThemeInfo.backgroundColor); } @@ -858,7 +880,6 @@ namespace XCharts public virtual void OnPointerUp(PointerEventData eventData) { - } public virtual void OnPointerEnter(PointerEventData eventData) diff --git a/Runtime/Internal/CoordinateChart.cs b/Runtime/Internal/CoordinateChart.cs index a7a855b9..78cdca2d 100644 --- a/Runtime/Internal/CoordinateChart.cs +++ b/Runtime/Internal/CoordinateChart.cs @@ -154,6 +154,7 @@ namespace XCharts var cp3 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, cpty); var cp4 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, coordinateY - xLineDiff); ChartDrawer.DrawPolygon(vh, cp1, cp2, cp3, cp4, m_ThemeInfo.backgroundColor); + } else { @@ -168,25 +169,25 @@ namespace XCharts var yLineDiff = yAxis0.axisLine.width; var xSplitDiff = xAxis0.splitLine.lineStyle.width; var ySplitDiff = yAxis0.splitLine.lineStyle.width; - var lp1 = new Vector3(0, 0); - var lp2 = new Vector3(0, chartHeight); - var lp3 = new Vector3(coordinateX - yLineDiff, chartHeight); - var lp4 = new Vector3(coordinateX - yLineDiff, 0); + var lp1 = new Vector3(m_ChartX, m_ChartY); + var lp2 = new Vector3(m_ChartX, m_ChartY + chartHeight); + var lp3 = new Vector3(coordinateX - yLineDiff, m_ChartY + chartHeight); + var lp4 = new Vector3(coordinateX - yLineDiff, m_ChartY); ChartDrawer.DrawPolygon(vh, lp1, lp2, lp3, lp4, m_ThemeInfo.backgroundColor); - var rp1 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, 0); - var rp2 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, chartHeight); - var rp3 = new Vector3(chartWidth, chartHeight); - var rp4 = new Vector3(chartWidth, 0); + var rp1 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, m_ChartY); + var rp2 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, m_ChartY + chartHeight); + var rp3 = new Vector3(m_ChartX + chartWidth, m_ChartY + chartHeight); + var rp4 = new Vector3(m_ChartX + chartWidth, m_ChartY); ChartDrawer.DrawPolygon(vh, rp1, rp2, rp3, rp4, m_ThemeInfo.backgroundColor); var up1 = new Vector3(coordinateX - yLineDiff, coordinateY + coordinateHeight + ySplitDiff); - var up2 = new Vector3(coordinateX - yLineDiff, chartHeight); - var up3 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, chartHeight); + var up2 = new Vector3(coordinateX - yLineDiff, m_ChartY + chartHeight); + var up3 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, m_ChartY + chartHeight); var up4 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, coordinateY + coordinateHeight + ySplitDiff); ChartDrawer.DrawPolygon(vh, up1, up2, up3, up4, m_ThemeInfo.backgroundColor); - var dp1 = new Vector3(coordinateX - yLineDiff, 0); + var dp1 = new Vector3(coordinateX - yLineDiff, m_ChartY); var dp2 = new Vector3(coordinateX - yLineDiff, coordinateY - xLineDiff); var dp3 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, coordinateY - xLineDiff); - var dp4 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, 0); + var dp4 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, m_ChartY); ChartDrawer.DrawPolygon(vh, dp1, dp2, dp3, dp4, m_ThemeInfo.backgroundColor); } @@ -407,17 +408,7 @@ namespace XCharts var category = tempAxis.GetData(index, m_DataZoom); var content = TooltipHelper.GetFormatterContent(m_Tooltip, index, m_Series, m_ThemeInfo, category, m_DataZoom, isCartesian); - m_Tooltip.UpdateContentText(content); - var pos = m_Tooltip.GetContentPos(); - if (pos.x + m_Tooltip.runtimeWidth > chartWidth) - { - pos.x = chartWidth - m_Tooltip.runtimeWidth; - } - if (pos.y - m_Tooltip.runtimeHeight < 0) - { - pos.y = m_Tooltip.runtimeHeight; - } - m_Tooltip.UpdateContentPos(pos); + TooltipHelper.SetContentAndPosition(m_Tooltip, content, chartRect); m_Tooltip.SetActive(true); for (int i = 0; i < m_XAxises.Count; i++) @@ -800,16 +791,16 @@ namespace XCharts { if (axis is XAxis) { - m_Series.GetXMinMaxValue(m_DataZoom, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue); + m_Series.GetXMinMaxValue(null, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue); } else { - m_Series.GetYMinMaxValue(m_DataZoom, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue); + m_Series.GetYMinMaxValue(null, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue); } } else { - m_Series.GetYMinMaxValue(m_DataZoom, axisIndex, false, axis.inverse, out tempMinValue, out tempMaxValue); + m_Series.GetYMinMaxValue(null, axisIndex, false, axis.inverse, out tempMinValue, out tempMaxValue); } axis.AdjustMinMaxValue(ref tempMinValue, ref tempMaxValue, true); if (tempMinValue != axis.runtimeMinValue || tempMaxValue != axis.runtimeMaxValue) @@ -1120,10 +1111,10 @@ namespace XCharts { if (!m_DataZoom.enable || !m_DataZoom.supportSlider) return; var hig = m_DataZoom.GetHeight(grid.bottom); - var p1 = new Vector2(coordinateX, m_DataZoom.bottom); - var p2 = new Vector2(coordinateX, m_DataZoom.bottom + hig); - var p3 = new Vector2(coordinateX + coordinateWidth, m_DataZoom.bottom + hig); - var p4 = new Vector2(coordinateX + coordinateWidth, m_DataZoom.bottom); + var p1 = new Vector3(coordinateX, m_ChartY + m_DataZoom.bottom); + var p2 = new Vector3(coordinateX, m_ChartY + m_DataZoom.bottom + hig); + var p3 = new Vector3(coordinateX + coordinateWidth, m_ChartY + m_DataZoom.bottom + hig); + var p4 = new Vector3(coordinateX + coordinateWidth, m_ChartY + m_DataZoom.bottom); var xAxis = xAxises[0]; ChartDrawer.DrawLine(vh, p1, p2, xAxis.axisLine.width, m_ThemeInfo.dataZoomLineColor); ChartDrawer.DrawLine(vh, p2, p3, xAxis.axisLine.width, m_ThemeInfo.dataZoomLineColor); @@ -1155,9 +1146,11 @@ namespace XCharts float value = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i, serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis.inverse); float pX = coordinateX + i * scaleWid; - float dataHig = (axis.runtimeMaxValue - axis.runtimeMinValue) == 0 ? 0 : - (value - axis.runtimeMinValue) / (axis.runtimeMaxValue - axis.runtimeMinValue) * hig; - np = new Vector3(pX, m_DataZoom.bottom + dataHig); + // float dataHig = (axis.runtimeMaxValue - axis.runtimeMinValue) == 0 ? 0 : + // (value - axis.runtimeMinValue) / (axis.runtimeMaxValue - axis.runtimeMinValue) * hig; + float dataHig = (maxValue - minValue) == 0 ? 0 : + (value - minValue) / (maxValue - minValue) * hig; + np = new Vector3(pX, m_ChartY + m_DataZoom.bottom + dataHig); if (i > 0) { Color color = m_ThemeInfo.dataZoomLineColor; @@ -1165,8 +1158,8 @@ namespace XCharts Vector3 alp = new Vector3(lp.x, lp.y - xAxis.axisLine.width); Vector3 anp = new Vector3(np.x, np.y - xAxis.axisLine.width); Color areaColor = new Color(color.r, color.g, color.b, color.a * 0.75f); - Vector3 tnp = new Vector3(np.x, m_DataZoom.bottom + xAxis.axisLine.width); - Vector3 tlp = new Vector3(lp.x, m_DataZoom.bottom + xAxis.axisLine.width); + Vector3 tnp = new Vector3(np.x, m_ChartY + m_DataZoom.bottom + xAxis.axisLine.width); + Vector3 tlp = new Vector3(lp.x, m_ChartY + m_DataZoom.bottom + xAxis.axisLine.width); ChartDrawer.DrawPolygon(vh, alp, anp, tnp, tlp, areaColor); } lp = np; @@ -1181,10 +1174,10 @@ namespace XCharts case DataZoom.RangeMode.Percent: var start = coordinateX + coordinateWidth * m_DataZoom.start / 100; var end = coordinateX + coordinateWidth * m_DataZoom.end / 100; - p1 = new Vector2(start, m_DataZoom.bottom); - p2 = new Vector2(start, m_DataZoom.bottom + hig); - p3 = new Vector2(end, m_DataZoom.bottom + hig); - p4 = new Vector2(end, m_DataZoom.bottom); + p1 = new Vector2(start, m_ChartY + m_DataZoom.bottom); + p2 = new Vector2(start, m_ChartY + m_DataZoom.bottom + hig); + p3 = new Vector2(end, m_ChartY + m_DataZoom.bottom + hig); + p4 = new Vector2(end, m_ChartY + m_DataZoom.bottom); ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, m_ThemeInfo.dataZoomSelectedColor); ChartDrawer.DrawLine(vh, p1, p2, xAxis.axisLine.width, m_ThemeInfo.dataZoomSelectedColor); ChartDrawer.DrawLine(vh, p3, p4, xAxis.axisLine.width, m_ThemeInfo.dataZoomSelectedColor); @@ -1337,9 +1330,9 @@ namespace XCharts m_DataZoom.SetLabelActive(false); return; } - if (m_DataZoom.IsInSelectedZoom(local, coordinateX, coordinateWidth) - || m_DataZoom.IsInStartZoom(local, coordinateX, coordinateWidth) - || m_DataZoom.IsInEndZoom(local, coordinateX, coordinateWidth)) + if (m_DataZoom.IsInSelectedZoom(local, coordinateX, chartY, coordinateWidth) + || m_DataZoom.IsInStartZoom(local, coordinateX, chartY, coordinateWidth) + || m_DataZoom.IsInEndZoom(local, coordinateX, chartY, coordinateWidth)) { m_DataZoom.SetLabelActive(true); RefreshDataZoomLabel(); @@ -1370,8 +1363,8 @@ namespace XCharts var start = coordinateX + coordinateWidth * m_DataZoom.start / 100; var end = coordinateX + coordinateWidth * m_DataZoom.end / 100; var hig = m_DataZoom.GetHeight(grid.bottom); - m_DataZoom.UpdateStartLabelPosition(new Vector3(start - 10, m_DataZoom.bottom + hig / 2)); - m_DataZoom.UpdateEndLabelPosition(new Vector3(end + 10, m_DataZoom.bottom + hig / 2)); + m_DataZoom.UpdateStartLabelPosition(new Vector3(start - 10, chartY + m_DataZoom.bottom + hig / 2)); + m_DataZoom.UpdateEndLabelPosition(new Vector3(end + 10, chartY + m_DataZoom.bottom + hig / 2)); } } @@ -1523,15 +1516,15 @@ namespace XCharts } if (m_DataZoom.supportSlider) { - if (m_DataZoom.IsInStartZoom(pos, coordinateX, coordinateWidth)) + if (m_DataZoom.IsInStartZoom(pos, coordinateX, chartY, coordinateWidth)) { m_DataZoomStartDrag = true; } - else if (m_DataZoom.IsInEndZoom(pos, coordinateX, coordinateWidth)) + else if (m_DataZoom.IsInEndZoom(pos, coordinateX, chartY, coordinateWidth)) { m_DataZoomEndDrag = true; } - else if (m_DataZoom.IsInSelectedZoom(pos, coordinateX, coordinateWidth)) + else if (m_DataZoom.IsInSelectedZoom(pos, coordinateX, chartY, coordinateWidth)) { m_DataZoomDrag = true; } @@ -1656,13 +1649,14 @@ namespace XCharts { return; } - if (m_DataZoom.IsInStartZoom(localPos, coordinateX, coordinateWidth) || - m_DataZoom.IsInEndZoom(localPos, coordinateX, coordinateWidth)) + + if (m_DataZoom.IsInStartZoom(localPos, coordinateX, chartY, coordinateWidth) || + m_DataZoom.IsInEndZoom(localPos, coordinateX, chartY, coordinateWidth)) { return; } - if (m_DataZoom.IsInZoom(localPos, coordinateX, coordinateWidth) - && !m_DataZoom.IsInSelectedZoom(localPos, coordinateX, coordinateWidth)) + if (m_DataZoom.IsInZoom(localPos, coordinateX, chartY, coordinateWidth) + && !m_DataZoom.IsInSelectedZoom(localPos, coordinateX, chartY, coordinateWidth)) { var pointerX = localPos.x; var selectWidth = coordinateWidth * (m_DataZoom.end - m_DataZoom.start) / 100; @@ -1688,14 +1682,14 @@ namespace XCharts public override void OnScroll(PointerEventData eventData) { if (Input.touchCount > 1) return; - if (!m_DataZoom.enable || m_DataZoom.zoomLock || !m_DataZoom.supportInside) return; + if (!m_DataZoom.enable || m_DataZoom.zoomLock) return; Vector2 pos; if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, canvas.worldCamera, out pos)) { return; } - if (!IsInCooridate(pos)) + if (!IsInCooridate(pos) && !m_DataZoom.IsInSelectedZoom(pos, coordinateX, chartY, coordinateWidth)) { return; } diff --git a/Runtime/Internal/CoordinateChart_DrawHeatmap.cs b/Runtime/Internal/CoordinateChart_DrawHeatmap.cs index fad33d03..18206655 100644 --- a/Runtime/Internal/CoordinateChart_DrawHeatmap.cs +++ b/Runtime/Internal/CoordinateChart_DrawHeatmap.cs @@ -31,9 +31,9 @@ namespace XCharts } return; } - if (local.x < 0 || local.x > chartWidth || - local.y < 0 || local.y > chartHeight || - !m_VisualMap.IsInRangeRect(local, chartWidth, chartHeight)) + if (local.x < chartX || local.x > chartX + chartWidth || + local.y < chartY || local.y > chartY + chartHeight || + !m_VisualMap.IsInRangeRect(local, chartRect)) { if (m_VisualMap.runtimeSelectedIndex >= 0) { @@ -45,7 +45,7 @@ namespace XCharts var pos1 = Vector3.zero; var pos2 = Vector3.zero; var halfHig = m_VisualMap.itemHeight / 2; - var centerPos = m_VisualMap.location.GetPosition(chartWidth, chartHeight); + var centerPos = chartPosition + m_VisualMap.location.GetPosition(chartWidth, chartHeight); var selectedIndex = -1; var value = 0f; switch (m_VisualMap.orient) @@ -71,8 +71,8 @@ namespace XCharts protected void OnDragVisualMapStart() { if (!m_VisualMap.enable || !m_VisualMap.show || !m_VisualMap.calculable) return; - var inMinRect = m_VisualMap.IsInRangeMinRect(pointerPos, chartWidth, chartHeight, m_Settings.visualMapTriangeLen); - var inMaxRect = m_VisualMap.IsInRangeMaxRect(pointerPos, chartWidth, chartHeight, m_Settings.visualMapTriangeLen); + var inMinRect = m_VisualMap.IsInRangeMinRect(pointerPos, chartRect, m_Settings.visualMapTriangeLen); + var inMaxRect = m_VisualMap.IsInRangeMaxRect(pointerPos, chartRect, m_Settings.visualMapTriangeLen); if (inMinRect || inMaxRect) { if (inMinRect) @@ -91,7 +91,7 @@ namespace XCharts if (!m_VisualMap.enable || !m_VisualMap.show || !m_VisualMap.calculable) return; if (!m_VisualMapMinDrag && !m_VisualMapMaxDrag) return; - var value = m_VisualMap.GetValue(pointerPos, chartWidth, chartHeight); + var value = m_VisualMap.GetValue(pointerPos, chartRect); if (m_VisualMapMinDrag) { m_VisualMap.rangeMin = value; @@ -202,7 +202,7 @@ namespace XCharts protected void DrawVisualMap(VertexHelper vh) { if (!m_VisualMap.enable || !m_VisualMap.show) return; - var centerPos = m_VisualMap.location.GetPosition(chartWidth, chartHeight); + var centerPos = chartPosition + m_VisualMap.location.GetPosition(chartWidth, chartHeight); var pos1 = Vector3.zero; var pos2 = Vector3.zero; diff --git a/Runtime/PieChart.cs b/Runtime/PieChart.cs index a83be3cf..42345a06 100644 --- a/Runtime/PieChart.cs +++ b/Runtime/PieChart.cs @@ -67,7 +67,7 @@ namespace XCharts if (serie.pieClickOffset) isClickOffset = true; serie.runtimePieDataMax = serie.yMax; serie.runtimePieDataTotal = serie.yTotal; - serie.UpdateCenter(chartWidth, chartHeight); + SerieHelper.UpdateCenter(serie, chartPosition, chartWidth, chartHeight); float totalDegree = 360; float startDegree = 0; @@ -567,17 +567,7 @@ namespace XCharts if (index < 0) continue; showTooltip = true; var content = TooltipHelper.GetFormatterContent(m_Tooltip, index, m_Series, m_ThemeInfo); - m_Tooltip.UpdateContentText(content); - var pos = m_Tooltip.GetContentPos(); - if (pos.x + m_Tooltip.runtimeWidth > chartWidth) - { - pos.x = chartWidth - m_Tooltip.runtimeWidth; - } - if (pos.y - m_Tooltip.runtimeHeight < 0) - { - pos.y = m_Tooltip.runtimeHeight; - } - m_Tooltip.UpdateContentPos(pos); + TooltipHelper.SetContentAndPosition(tooltip, content, chartRect); } m_Tooltip.SetActive(showTooltip); } diff --git a/Runtime/RadarChart.cs b/Runtime/RadarChart.cs index 269a3cf0..5539c7d0 100644 --- a/Runtime/RadarChart.cs +++ b/Runtime/RadarChart.cs @@ -103,13 +103,19 @@ namespace XCharts } #endif + protected override void OnSizeChanged() + { + base.OnSizeChanged(); + m_RadarsDirty = true; + } + private void InitIndicator() { ChartHelper.HideAllObject(transform, INDICATOR_TEXT); for (int n = 0; n < m_Radars.Count; n++) { Radar radar = m_Radars[n]; - radar.UpdateRadarCenter(chartWidth, chartHeight); + radar.UpdateRadarCenter(chartPosition, chartWidth, chartHeight); int indicatorNum = radar.indicatorList.Count; float txtWid = 100; float txtHig = 20; @@ -165,7 +171,7 @@ namespace XCharts base.DrawChart(vh); foreach (var radar in m_Radars) { - radar.UpdateRadarCenter(chartWidth, chartHeight); + radar.UpdateRadarCenter(chartPosition, chartWidth, chartHeight); if (radar.shape == Radar.Shape.Circle) { DrawCricleRadar(vh, radar); @@ -712,17 +718,7 @@ namespace XCharts var radar = m_Radars[serie.radarIndex]; StringBuilder sb = new StringBuilder(); TooltipHelper.InitRadarTooltip(ref sb, tooltip, serie, radar, themeInfo); - m_Tooltip.UpdateContentText(sb.ToString()); - var pos = m_Tooltip.GetContentPos(); - if (pos.x + m_Tooltip.runtimeWidth > chartWidth) - { - pos.x = chartWidth - m_Tooltip.runtimeWidth; - } - if (pos.y - m_Tooltip.runtimeHeight < 0) - { - pos.y = m_Tooltip.runtimeHeight; - } - m_Tooltip.UpdateContentPos(pos); + TooltipHelper.SetContentAndPosition(tooltip, sb.ToString(), chartRect); } protected override void OnRefreshLabel() diff --git a/Runtime/RingChart.cs b/Runtime/RingChart.cs index ca5b7408..a6e696e2 100644 --- a/Runtime/RingChart.cs +++ b/Runtime/RingChart.cs @@ -73,7 +73,7 @@ namespace XCharts continue; } serie.animation.InitProgress(data.Count, serie.startAngle, serie.startAngle + 360); - serie.UpdateCenter(chartWidth, chartHeight); + SerieHelper.UpdateCenter(serie, chartPosition, chartWidth, chartHeight); TitleStyleHelper.CheckTitle(serie, ref m_ReinitTitle, ref m_UpdateTitleText); SerieLabelHelper.CheckLabel(serie, ref m_ReinitLabel, ref m_UpdateLabelText); var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); @@ -330,18 +330,7 @@ namespace XCharts if (index < 0) continue; showTooltip = true; var content = TooltipHelper.GetFormatterContent(m_Tooltip, index, m_Series, m_ThemeInfo); - m_Tooltip.UpdateContentText(content); - - var pos = m_Tooltip.GetContentPos(); - if (pos.x + m_Tooltip.runtimeWidth > chartWidth) - { - pos.x = chartWidth - m_Tooltip.runtimeWidth; - } - if (pos.y - m_Tooltip.runtimeHeight < 0) - { - pos.y = m_Tooltip.runtimeHeight; - } - m_Tooltip.UpdateContentPos(pos); + TooltipHelper.SetContentAndPosition(tooltip,content,chartRect); } m_Tooltip.SetActive(showTooltip); } diff --git a/Runtime/ScatterChart.cs b/Runtime/ScatterChart.cs index 182669b9..3b8d9af5 100644 --- a/Runtime/ScatterChart.cs +++ b/Runtime/ScatterChart.cs @@ -111,18 +111,7 @@ namespace XCharts if (m_Tooltip.isAnySerieDataIndex()) { var content = TooltipHelper.GetFormatterContent(m_Tooltip, 0, m_Series, m_ThemeInfo); - m_Tooltip.UpdateContentText(content); - - var pos = m_Tooltip.GetContentPos(); - if (pos.x + m_Tooltip.runtimeWidth > chartWidth) - { - pos.x = chartWidth - m_Tooltip.runtimeWidth; - } - if (pos.y - m_Tooltip.runtimeHeight < 0) - { - pos.y = m_Tooltip.runtimeHeight; - } - m_Tooltip.UpdateContentPos(pos); + TooltipHelper.SetContentAndPosition(tooltip, content, chartRect); m_Tooltip.SetActive(true); } else