diff --git a/Demo/Runtime/Demo_LargeData.cs b/Demo/Runtime/Demo_LargeData.cs index 8980f411..964244cf 100644 --- a/Demo/Runtime/Demo_LargeData.cs +++ b/Demo/Runtime/Demo_LargeData.cs @@ -28,8 +28,7 @@ namespace XCharts timeNow = System.DateTime.Now; chart.ClearAxisData(); chart.series.ClearData(); - chart.series.list[0].maxCache = maxCacheDataNumber; - chart.xAxises[0].maxCache = maxCacheDataNumber; + chart.SetMaxCache(maxCacheDataNumber); chart.title.text = maxCacheDataNumber + "数据"; } diff --git a/Editor/BaseChartEditor.cs b/Editor/BaseChartEditor.cs index 73547c51..3e771925 100644 --- a/Editor/BaseChartEditor.cs +++ b/Editor/BaseChartEditor.cs @@ -29,6 +29,8 @@ namespace XCharts protected SerializedProperty m_Series; protected SerializedProperty m_Settings; protected SerializedProperty m_Large; + protected SerializedProperty m_ChartName; + protected SerializedProperty m_ChartUUID; protected float m_DefaultLabelWidth; protected float m_DefaultFieldWidth; @@ -40,6 +42,8 @@ namespace XCharts { m_Target = (BaseChart)target; m_Script = serializedObject.FindProperty("m_Script"); + m_ChartName = serializedObject.FindProperty("m_ChartName"); + m_ChartUUID = serializedObject.FindProperty("m_ChartUUID"); m_ChartWidth = serializedObject.FindProperty("m_ChartWidth"); m_ChartHeight = serializedObject.FindProperty("m_ChartHeight"); m_Theme = serializedObject.FindProperty("m_Theme"); @@ -75,8 +79,21 @@ namespace XCharts protected virtual void OnStartInspectorGUI() { EditorGUILayout.PropertyField(m_Script); - // EditorGUILayout.PropertyField(m_ChartWidth); - // EditorGUILayout.PropertyField(m_ChartHeight); + // EditorGUI.BeginChangeCheck(); + // EditorGUILayout.PropertyField(m_ChartName); + // if (EditorGUI.EndChangeCheck()) + // { + // if (XChartsMgr.Instance.ContainsChart(m_ChartName.stringValue)) + // { + // m_ChartName.stringValue = ""; + // serializedObject.ApplyModifiedProperties(); + // } + // else + // { + // m_ChartUUID.stringValue = m_ChartName.stringValue; + // } + // } + // EditorGUILayout.PropertyField(m_ChartUUID); EditorGUILayout.PropertyField(m_ThemeInfo, true); EditorGUILayout.PropertyField(m_Title, true); EditorGUILayout.PropertyField(m_Legend, true); diff --git a/Editor/PropertyDrawers/SerieDrawer.cs b/Editor/PropertyDrawers/SerieDrawer.cs index 255e7e38..34526d50 100644 --- a/Editor/PropertyDrawers/SerieDrawer.cs +++ b/Editor/PropertyDrawers/SerieDrawer.cs @@ -75,6 +75,8 @@ namespace XCharts SerializedProperty m_Ignore = prop.FindPropertyRelative("m_Ignore"); SerializedProperty m_IgnoreValue = prop.FindPropertyRelative("m_IgnoreValue"); SerializedProperty m_ShowAsPositiveNumber = prop.FindPropertyRelative("m_ShowAsPositiveNumber"); + SerializedProperty m_Large = prop.FindPropertyRelative("m_Large"); + SerializedProperty m_LargeThreshold = prop.FindPropertyRelative("m_LargeThreshold"); SerializedProperty m_Datas = prop.FindPropertyRelative("m_Data"); int index = InitToggle(prop); @@ -134,6 +136,10 @@ namespace XCharts drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; EditorGUI.PropertyField(drawRect, m_ShowAsPositiveNumber); drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(drawRect, m_Large); + drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(drawRect, m_LargeThreshold); + drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; EditorGUI.PropertyField(drawRect, m_Symbol); drawRect.y += EditorGUI.GetPropertyHeight(m_Symbol); EditorGUI.PropertyField(drawRect, m_LineStyle); @@ -183,6 +189,10 @@ namespace XCharts drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; EditorGUI.PropertyField(drawRect, m_ShowAsPositiveNumber); drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(drawRect, m_Large); + drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + EditorGUI.PropertyField(drawRect, m_LargeThreshold); + drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; EditorGUI.PropertyField(drawRect, m_ItemStyle); drawRect.y += EditorGUI.GetPropertyHeight(m_ItemStyle); EditorGUI.PropertyField(drawRect, m_Label); @@ -495,7 +505,7 @@ namespace XCharts switch (serieType) { case SerieType.Line: - height += 17 * EditorGUIUtility.singleLineHeight + 16 * EditorGUIUtility.standardVerticalSpacing; + height += 19 * EditorGUIUtility.singleLineHeight + 18 * EditorGUIUtility.standardVerticalSpacing; height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Symbol")); height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineStyle")); height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_LineArrow")); @@ -506,7 +516,7 @@ namespace XCharts height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Animation")); break; case SerieType.Bar: - height += 19 * EditorGUIUtility.singleLineHeight + 18 * EditorGUIUtility.standardVerticalSpacing; + height += 21 * EditorGUIUtility.singleLineHeight + 20 * EditorGUIUtility.standardVerticalSpacing; height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_ItemStyle")); height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Label")); height += EditorGUI.GetPropertyHeight(prop.FindPropertyRelative("m_Emphasis")); diff --git a/Editor/PropertyDrawers/ThemeInfoDrawer.cs b/Editor/PropertyDrawers/ThemeInfoDrawer.cs index 1dcadc9f..c187ceaa 100644 --- a/Editor/PropertyDrawers/ThemeInfoDrawer.cs +++ b/Editor/PropertyDrawers/ThemeInfoDrawer.cs @@ -323,7 +323,7 @@ namespace XCharts m_CustomColorPalette.InsertArrayElementAtIndex(m_CustomColorPalette.arraySize); } var customElement = m_CustomColorPalette.GetArrayElementAtIndex(i); - color = customElement.colorValue != Color.clear ? + color = !ChartHelper.IsClearColor(customElement.colorValue) ? customElement : m_ColorPalette.GetArrayElementAtIndex(i); EditorGUI.BeginChangeCheck(); diff --git a/Runtime/API/BaseChart_API.cs b/Runtime/API/BaseChart_API.cs index f2c3b461..f88085dd 100644 --- a/Runtime/API/BaseChart_API.cs +++ b/Runtime/API/BaseChart_API.cs @@ -149,6 +149,7 @@ namespace XCharts m_Tooltip.ClearValue(); m_CheckAnimation = false; m_ReinitLabel = true; + m_SerieLabelRoot = null; RefreshChart(); } @@ -161,6 +162,7 @@ namespace XCharts { m_Series.Remove(serieName); m_Legend.RemoveData(serieName); + m_SerieLabelRoot = null; RefreshChart(); } @@ -191,8 +193,9 @@ namespace XCharts var serieData = m_Series.AddData(serieName, data, dataName); if (serieData != null) { + var serie = m_Series.GetSerie(serieName); + AddSerieLabel(serie, serieData); RefreshChart(); - RefreshLabel(); } return serieData; } @@ -210,8 +213,9 @@ namespace XCharts var serieData = m_Series.AddData(serieIndex, data, dataName); if (serieData != null) { + var serie = m_Series.GetSerie(serieIndex); + AddSerieLabel(serie, serieData); RefreshChart(); - RefreshLabel(); } return serieData; } @@ -229,8 +233,9 @@ namespace XCharts var serieData = m_Series.AddData(serieName, multidimensionalData, dataName); if (serieData != null) { + var serie = m_Series.GetSerie(serieName); + AddSerieLabel(serie, serieData); RefreshChart(); - RefreshLabel(); } return serieData; } @@ -248,8 +253,9 @@ namespace XCharts var serieData = m_Series.AddData(serieIndex, multidimensionalData, dataName); if (serieData != null) { + var serie = m_Series.GetSerie(serieIndex); + AddSerieLabel(serie, serieData); RefreshChart(); - RefreshLabel(); } return serieData; } @@ -268,8 +274,9 @@ namespace XCharts var serieData = m_Series.AddXYData(serieName, xValue, yValue, dataName); if (serieData != null) { + var serie = m_Series.GetSerie(serieName); + AddSerieLabel(serie, serieData); RefreshChart(); - RefreshLabel(); } return serieData; } @@ -288,8 +295,9 @@ namespace XCharts var serieData = m_Series.AddXYData(serieIndex, xValue, yValue, dataName); if (serieData != null) { + var serie = m_Series.GetSerie(serieIndex); + AddSerieLabel(serie, serieData); RefreshChart(); - RefreshLabel(); } return serieData; } @@ -529,6 +537,7 @@ namespace XCharts public void RefreshLabel() { m_ReinitLabel = true; + m_SerieLabelRoot = null; } /// @@ -643,25 +652,27 @@ namespace XCharts /// public bool IsInChart(Vector2 local) { - if (local.x < m_ChartX || local.x > m_ChartX + m_ChartWidth || - local.y < m_ChartY || local.y > m_ChartY + m_ChartHeight) + return IsInChart(local.x, local.y); + } + + public bool IsInChart(float x, float y) + { + if (x < m_ChartX || x > m_ChartX + m_ChartWidth || + y < m_ChartY || y > m_ChartY + m_ChartHeight) { return false; } return true; } - public Vector3 ClampInChart(Vector3 pos) + public void ClampInChart(ref Vector3 pos) { - if (IsInChart(pos)) return pos; - else + if (!IsInChart(pos.x, pos.y)) { - var np = new Vector3(pos.x, pos.y); - 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; + if (pos.x < m_ChartX) pos.x = m_ChartX; + if (pos.x > m_ChartX + m_ChartWidth) pos.x = m_ChartX + m_ChartWidth; + if (pos.y < m_ChartY) pos.y = m_ChartY; + if (pos.y > m_ChartY + m_ChartHeight) pos.y = m_ChartY + m_ChartHeight; } } diff --git a/Runtime/API/CoordinateChart_API.cs b/Runtime/API/CoordinateChart_API.cs index eb100398..60d3cb30 100644 --- a/Runtime/API/CoordinateChart_API.cs +++ b/Runtime/API/CoordinateChart_API.cs @@ -22,29 +22,23 @@ namespace XCharts /// The lower left position x of coordinate system. /// 坐标系的左下角坐标X。 /// - public float coordinateX { get { return m_ChartX + m_Grid.left; } } + public float coordinateX { get { return m_CoordinateX; } } /// /// The lower left position y of coordinate system. /// 坐标系的左下角坐标Y。 /// - public float coordinateY { get { return m_ChartY + m_Grid.bottom; } } - - [Obsolete("Use CoordinateChart.coordinateWidth instead.", true)] - public float coordinateWid { get { return coordinateWidth; } } - - [Obsolete("Use CoordinateChart.coordinateHeight instead.", true)] - public float coordinateHig { get { return coordinateHeight; } } + public float coordinateY { get { return m_CoordinateY; } } /// /// the width of coordinate system。 /// 坐标系的宽。 /// - public float coordinateWidth { get { return chartWidth - m_Grid.left - m_Grid.right; } } + public float coordinateWidth { get { return m_CoordinateWidth; } } /// /// the height of coordinate system。 /// 坐标系的高。 /// - public float coordinateHeight { get { return chartHeight - m_Grid.top - m_Grid.bottom; } } + public float coordinateHeight { get { return m_CoordinateHeight; } } /// /// grid component. /// 网格组件。 @@ -175,8 +169,18 @@ namespace XCharts public bool IsInCooridate(Vector2 local) { - if (local.x < coordinateX - 1 || local.x > coordinateX + coordinateWidth + 1 || - local.y < coordinateY - 1 || local.y > coordinateY + coordinateHeight + 1) + return IsInCooridate(local.x, local.y); + } + + public bool IsInCooridate(Vector3 local) + { + return IsInCooridate(local.x, local.y); + } + + public bool IsInCooridate(float x, float y) + { + if (x < m_CoordinateX - 1 || x > m_CoordinateX + m_CoordinateWidth + 1 || + y < m_CoordinateY - 1 || y > m_CoordinateY + m_CoordinateHeight + 1) { return false; } @@ -204,12 +208,12 @@ namespace XCharts if (IsInCooridate(pos)) return pos; else { - var np = new Vector3(pos.x, pos.y); - if (np.x < coordinateX) np.x = coordinateX; - if (np.x > coordinateX + coordinateWidth) np.x = coordinateX + coordinateWidth; - if (np.y < coordinateY) np.y = coordinateY; - if (np.y > coordinateY + coordinateHeight) np.y = coordinateY + coordinateHeight; - return np; + // var pos = new Vector3(pos.x, pos.y); + if (pos.x < m_CoordinateX) pos.x = m_CoordinateX; + if (pos.x > m_CoordinateX + m_CoordinateWidth) pos.x = m_CoordinateX + m_CoordinateWidth; + if (pos.y < m_CoordinateY) pos.y = m_CoordinateY; + if (pos.y > m_CoordinateY + m_CoordinateHeight) pos.y = m_CoordinateY + m_CoordinateHeight; + return pos; } } @@ -236,6 +240,27 @@ namespace XCharts yAxis.runtimeMaxValue = 0; } } + + /// + /// 更新坐标系原点和宽高 + /// + public void UpdateCoordinate() + { + m_CoordinateX = m_ChartX + m_Grid.left; + m_CoordinateY = m_ChartY + m_Grid.bottom; + m_CoordinateWidth = m_ChartWidth - m_Grid.left - m_Grid.right; + m_CoordinateHeight = m_ChartHeight - m_Grid.top - m_Grid.bottom; + } + + /// + /// 设置可缓存的最大数据量。 + /// + public void SetMaxCache(int maxCache) + { + foreach (var serie in m_Series.list) serie.maxCache = maxCache; + foreach (var axis in m_XAxises) axis.maxCache = maxCache; + foreach (var axis in m_YAxises) axis.maxCache = maxCache; + } } } diff --git a/Runtime/Component/Main/Serie.cs b/Runtime/Component/Main/Serie.cs index a9943079..124f06c1 100644 --- a/Runtime/Component/Main/Serie.cs +++ b/Runtime/Component/Main/Serie.cs @@ -271,6 +271,8 @@ namespace XCharts [SerializeField] private bool m_Ignore = false; [SerializeField] private float m_IgnoreValue = 0; [SerializeField] private bool m_ShowAsPositiveNumber = false; + [SerializeField] private bool m_Large = true; + [SerializeField] private int m_LargeThreshold = 200; [SerializeField] private RadarType m_RadarType = RadarType.Multiple; [SerializeField] private List m_Data = new List(); @@ -753,6 +755,38 @@ namespace XCharts set { if (PropertyUtility.SetStruct(ref m_ShowAsPositiveNumber, value)) SetComponentDirty(); } } /// + /// 是否开启大数据量优化,在数据图形特别多而出现卡顿时候可以开启。 + /// 开启后配合 largeThreshold 在数据量大于指定阈值的时候对绘制进行优化。 + /// 缺点:优化后不能自定义设置单个数据项的样式,不能显示Label。 + /// + public bool large + { + get { return m_Large; } + set + { + if (PropertyUtility.SetStruct(ref m_Large, value)) + { + SetAllDirty(); + label.SetComponentDirty(); + } + } + } + /// + /// 开启大数量优化的阈值。 + /// + public int largeThreshold + { + get { return m_LargeThreshold; } + set + { + if (PropertyUtility.SetStruct(ref m_LargeThreshold, value)) + { + SetAllDirty(); + label.SetComponentDirty(); + } + } + } + /// /// 系列中的数据内容数组。SerieData可以设置1到n维数据。 /// public List data { get { return m_Data; } } @@ -869,7 +903,7 @@ namespace XCharts } else { - var list = new List(size); + var list = ListPool.Get(); m_UpSmoothPoints[dataIndex] = list; return list; } @@ -883,7 +917,7 @@ namespace XCharts } else { - var list = new List(size); + var list = ListPool.Get(); m_DownSmoothPoints[dataIndex] = list; return list; } @@ -1016,9 +1050,9 @@ namespace XCharts /// public void ClearData() { - foreach (var serieData in m_Data) + while (m_Data.Count > 0) { - SerieDataPool.Release(serieData); + RemoveData(0); } m_Data.Clear(); SetVerticesDirty(); @@ -1037,6 +1071,22 @@ namespace XCharts SetNameDirty(); } SetVerticesDirty(); + var serieData = m_Data[index]; + SerieDataPool.Release(serieData); + if (serieData.labelObject != null) + { + SerieLabelPool.Release(serieData.labelObject.gameObject); + } + if (m_UpSmoothPoints.ContainsKey(serieData.index)) + { + ListPool.Release(m_UpSmoothPoints[serieData.index]); + m_UpSmoothPoints.Remove(serieData.index); + } + if (m_DownSmoothPoints.ContainsKey(serieData.index)) + { + ListPool.Release(m_DownSmoothPoints[serieData.index]); + m_DownSmoothPoints.Remove(serieData.index); + } m_Data.RemoveAt(index); } } @@ -1048,15 +1098,7 @@ namespace XCharts /// public SerieData AddYData(float value, string dataName = null) { - if (m_MaxCache > 0) - { - while (m_Data.Count > m_MaxCache) - { - m_NeedUpdateFilterData = true; - SerieDataPool.Release(m_Data[0]); - m_Data.RemoveAt(0); - } - } + CheckMaxCache(); int xValue = m_Data.Count; var serieData = SerieDataPool.Get(); serieData.data.Add(xValue); @@ -1146,8 +1188,7 @@ namespace XCharts while (m_Data.Count > m_MaxCache) { m_NeedUpdateFilterData = true; - SerieDataPool.Release(m_Data[0]); - m_Data.RemoveAt(0); + RemoveData(0); } } @@ -1431,9 +1472,9 @@ namespace XCharts var serieData = m_Data[index]; serieData.name = name; SetNameDirty(); - if (serieData.labelText != null) + if (serieData.labelObject != null) { - serieData.labelText.text = name == null ? "" : name; + serieData.labelObject.SetText(name == null ? "" : name); } return true; } @@ -1572,7 +1613,16 @@ namespace XCharts return false; } - + /// + /// 是否为性能模式。只有折线图和柱状图才有性能模式。性能模式下不绘制Symbol,不刷新Label,不单独设置数据项配置。 + /// + public bool IsPerformanceMode() + { + if (m_Type == SerieType.Line || m_Type == SerieType.Bar) + return m_Large && m_Data.Count > m_LargeThreshold; + else + return false; + } /// /// 设置指定index的数据图标的尺寸 diff --git a/Runtime/Component/Main/Series.cs b/Runtime/Component/Main/Series.cs index 1401a282..61664a55 100644 --- a/Runtime/Component/Main/Series.cs +++ b/Runtime/Component/Main/Series.cs @@ -120,6 +120,12 @@ namespace XCharts SetLabelDirty(); } + public override void ClearDirty() + { + base.ClearDirty(); + ClearLabelDirty(); + } + /// /// 清空所有系列的数据 /// @@ -242,7 +248,9 @@ namespace XCharts { if (serie.show && serie.areaStyle.show && stack.Equals(serie.stack)) { - if (serie.areaStyle.color != serie.areaStyle.toColor && serie.areaStyle.toColor != Color.clear) return true; + if (serie.areaStyle.color != serie.areaStyle.toColor + && !ChartHelper.IsClearColor(serie.areaStyle.toColor)) + return true; } } return false; diff --git a/Runtime/Component/Main/Theme.cs b/Runtime/Component/Main/Theme.cs index 68233dc1..40ed0eaa 100644 --- a/Runtime/Component/Main/Theme.cs +++ b/Runtime/Component/Main/Theme.cs @@ -107,7 +107,7 @@ namespace XCharts /// public Color32 backgroundColor { - get { return m_CustomBackgroundColor != Color.clear ? m_CustomBackgroundColor : m_BackgroundColor; } + get { return !ChartHelper.IsClearColor(m_CustomBackgroundColor) ? m_CustomBackgroundColor : m_BackgroundColor; } set { if (PropertyUtility.SetColor(ref m_CustomBackgroundColor, value)) SetVerticesDirty(); } } /// @@ -116,7 +116,7 @@ namespace XCharts /// public Color32 titleTextColor { - get { return m_CustomTitleTextColor != Color.clear ? m_CustomTitleTextColor : m_TitleTextColor; } + get { return !ChartHelper.IsClearColor(m_CustomTitleTextColor) ? m_CustomTitleTextColor : m_TitleTextColor; } set { if (PropertyUtility.SetColor(ref m_CustomTitleTextColor, value)) SetComponentDirty(); } } /// @@ -125,7 +125,7 @@ namespace XCharts /// public Color32 titleSubTextColor { - get { return m_CustomTitleSubTextColor != Color.clear ? m_CustomTitleSubTextColor : m_TitleSubTextColor; } + get { return !ChartHelper.IsClearColor(m_CustomTitleSubTextColor) ? m_CustomTitleSubTextColor : m_TitleSubTextColor; } set { if (PropertyUtility.SetColor(ref m_CustomTitleSubTextColor, value)) SetComponentDirty(); } } /// @@ -134,7 +134,7 @@ namespace XCharts /// public Color32 legendTextColor { - get { return m_CustomLegendTextColor != Color.clear ? m_CustomLegendTextColor : m_LegendTextColor; } + get { return !ChartHelper.IsClearColor(m_CustomLegendTextColor) ? m_CustomLegendTextColor : m_LegendTextColor; } set { if (PropertyUtility.SetColor(ref m_CustomLegendTextColor, value)) SetComponentDirty(); } } /// @@ -143,7 +143,7 @@ namespace XCharts /// public Color32 legendUnableColor { - get { return m_CustomLegendUnableColor != Color.clear ? m_CustomLegendUnableColor : m_LegendUnableColor; } + get { return !ChartHelper.IsClearColor(m_CustomLegendUnableColor) ? m_CustomLegendUnableColor : m_LegendUnableColor; } set { if (PropertyUtility.SetColor(ref m_CustomLegendUnableColor, value)) SetComponentDirty(); } } /// @@ -152,7 +152,7 @@ namespace XCharts /// public Color32 axisTextColor { - get { return m_CustomAxisTextColor != Color.clear ? m_CustomAxisTextColor : m_AxisTextColor; } + get { return !ChartHelper.IsClearColor(m_CustomAxisTextColor) ? m_CustomAxisTextColor : m_AxisTextColor; } set { if (PropertyUtility.SetColor(ref m_CustomAxisTextColor, value)) SetComponentDirty(); } } /// @@ -161,7 +161,7 @@ namespace XCharts /// public Color32 axisLineColor { - get { return m_CustomAxisLineColor != Color.clear ? m_CustomAxisLineColor : m_AxisLineColor; } + get { return !ChartHelper.IsClearColor(m_CustomAxisLineColor) ? m_CustomAxisLineColor : m_AxisLineColor; } set { if (PropertyUtility.SetColor(ref m_CustomAxisLineColor, value)) SetVerticesDirty(); } } /// @@ -170,7 +170,7 @@ namespace XCharts /// public Color32 axisSplitLineColor { - get { return m_CustomAxisSplitLineColor != Color.clear ? m_CustomAxisSplitLineColor : m_AxisSplitLineColor; } + get { return !ChartHelper.IsClearColor(m_CustomAxisSplitLineColor) ? m_CustomAxisSplitLineColor : m_AxisSplitLineColor; } set { if (PropertyUtility.SetColor(ref m_CustomAxisSplitLineColor, value)) SetVerticesDirty(); } } /// @@ -179,7 +179,7 @@ namespace XCharts /// public Color32 tooltipBackgroundColor { - get { return m_CustomTooltipBackgroundColor != Color.clear ? m_CustomTooltipBackgroundColor : m_TooltipBackgroundColor; } + get { return !ChartHelper.IsClearColor(m_CustomTooltipBackgroundColor) ? m_CustomTooltipBackgroundColor : m_TooltipBackgroundColor; } set { if (PropertyUtility.SetColor(ref m_CustomTooltipBackgroundColor, value)) SetComponentDirty(); } } /// @@ -188,7 +188,7 @@ namespace XCharts /// public Color32 tooltipFlagAreaColor { - get { return m_CustomTooltipFlagAreaColor != Color.clear ? m_CustomTooltipFlagAreaColor : m_TooltipFlagAreaColor; } + get { return !ChartHelper.IsClearColor(m_CustomTooltipFlagAreaColor) ? m_CustomTooltipFlagAreaColor : m_TooltipFlagAreaColor; } set { if (PropertyUtility.SetColor(ref m_CustomTooltipFlagAreaColor, value)) SetVerticesDirty(); } } /// @@ -197,7 +197,7 @@ namespace XCharts /// public Color32 tooltipTextColor { - get { return m_CustomTooltipTextColor != Color.clear ? m_CustomTooltipTextColor : m_TooltipTextColor; } + get { return !ChartHelper.IsClearColor(m_CustomTooltipTextColor) ? m_CustomTooltipTextColor : m_TooltipTextColor; } set { if (PropertyUtility.SetColor(ref m_CustomTooltipTextColor, value)) SetComponentDirty(); } } /// @@ -206,7 +206,7 @@ namespace XCharts /// public Color32 tooltipLabelColor { - get { return m_CustomTooltipLabelColor != Color.clear ? m_CustomTooltipLabelColor : m_TooltipLabelColor; } + get { return !ChartHelper.IsClearColor(m_CustomTooltipLabelColor) ? m_CustomTooltipLabelColor : m_TooltipLabelColor; } set { if (PropertyUtility.SetColor(ref m_CustomTooltipLabelColor, value)) SetVerticesDirty(); } } /// @@ -215,7 +215,7 @@ namespace XCharts /// public Color32 tooltipLineColor { - get { return m_CustomTooltipLineColor != Color.clear ? m_CustomTooltipLineColor : m_TooltipLineColor; } + get { return !ChartHelper.IsClearColor(m_CustomTooltipLineColor) ? m_CustomTooltipLineColor : m_TooltipLineColor; } set { if (PropertyUtility.SetColor(ref m_CustomTooltipLineColor, value)) SetVerticesDirty(); } } /// @@ -224,7 +224,7 @@ namespace XCharts /// public Color32 dataZoomTextColor { - get { return m_CustomDataZoomTextColor != Color.clear ? m_CustomDataZoomTextColor : m_DataZoomTextColor; } + get { return !ChartHelper.IsClearColor(m_CustomDataZoomTextColor) ? m_CustomDataZoomTextColor : m_DataZoomTextColor; } set { if (PropertyUtility.SetColor(ref m_CustomDataZoomTextColor, value)) SetComponentDirty(); } } /// @@ -233,7 +233,7 @@ namespace XCharts /// public Color32 dataZoomLineColor { - get { return m_CustomDataZoomLineColor != Color.clear ? m_CustomDataZoomLineColor : m_DataZoomLineColor; } + get { return !ChartHelper.IsClearColor(m_CustomDataZoomLineColor) ? m_CustomDataZoomLineColor : m_DataZoomLineColor; } set { if (PropertyUtility.SetColor(ref m_CustomDataZoomLineColor, value)) SetVerticesDirty(); } } /// @@ -242,7 +242,7 @@ namespace XCharts /// public Color32 dataZoomSelectedColor { - get { return m_CustomDataZoomSelectedColor != Color.clear ? m_CustomDataZoomSelectedColor : m_DataZoomSelectedColor; } + get { return !ChartHelper.IsClearColor(m_CustomDataZoomSelectedColor) ? m_CustomDataZoomSelectedColor : m_DataZoomSelectedColor; } set { if (PropertyUtility.SetColor(ref m_CustomDataZoomSelectedColor, value)) SetVerticesDirty(); } } @@ -251,7 +251,7 @@ namespace XCharts /// public Color32 visualMapBackgroundColor { - get { return m_CustomVisualMapBackgroundColor != Color.clear ? m_CustomVisualMapBackgroundColor : m_VisualMapBackgroundColor; } + get { return !ChartHelper.IsClearColor(m_CustomVisualMapBackgroundColor) ? m_CustomVisualMapBackgroundColor : m_VisualMapBackgroundColor; } set { if (PropertyUtility.SetColor(ref m_CustomVisualMapBackgroundColor, value)) SetVerticesDirty(); } } @@ -260,7 +260,7 @@ namespace XCharts /// public Color32 visualMapBorderColor { - get { return m_CustomVisualMapBorderColor != Color.clear ? m_CustomVisualMapBorderColor : m_VisualMapBorderColor; } + get { return !ChartHelper.IsClearColor(m_CustomVisualMapBorderColor) ? m_CustomVisualMapBorderColor : m_VisualMapBorderColor; } set { if (PropertyUtility.SetColor(ref m_CustomVisualMapBorderColor, value)) SetVerticesDirty(); } } @@ -282,7 +282,8 @@ namespace XCharts if (m_CustomColorPalette.Count > 0) { var customIndex = index < m_CustomColorPalette.Count ? index : index % m_CustomColorPalette.Count; - if (customIndex < m_CustomColorPalette.Count && m_CustomColorPalette[customIndex] != Color.clear) + if (customIndex < m_CustomColorPalette.Count + && !ChartHelper.IsClearColor(m_CustomColorPalette[customIndex])) { return m_CustomColorPalette[customIndex]; } @@ -305,12 +306,12 @@ namespace XCharts } for (int i = 0; i < m_ColorPalette.Length; i++) { - if (m_ColorPalette[i] != Color.clear && m_ColorPalette[i].a == 0) + if (!ChartHelper.IsClearColor(m_ColorPalette[i]) && m_ColorPalette[i].a == 0) sb.AppendFormat("warning:theme->colorPalette[{0}] alpha = 0\n", i); } for (int i = 0; i < m_CustomColorPalette.Count; i++) { - if (m_CustomColorPalette[i] != Color.clear && m_CustomColorPalette[i].a == 0) + if (!ChartHelper.IsClearColor(m_CustomColorPalette[i]) && m_CustomColorPalette[i].a == 0) sb.AppendFormat("warning:theme->colorPalette[{0}] alpha = 0\n", i); } } diff --git a/Runtime/Component/Sub/AxisSplitLine.cs b/Runtime/Component/Sub/AxisSplitLine.cs index 9c65975a..4d7fd843 100644 --- a/Runtime/Component/Sub/AxisSplitLine.cs +++ b/Runtime/Component/Sub/AxisSplitLine.cs @@ -79,7 +79,7 @@ namespace XCharts internal Color GetColor(ThemeInfo theme) { - if (lineStyle.color != Color.clear) + if (!ChartHelper.IsClearColor(lineStyle.color)) { var color = lineStyle.color; color.a *= lineStyle.opacity; diff --git a/Runtime/Component/Sub/GaugeAxis.cs b/Runtime/Component/Sub/GaugeAxis.cs index ee66f9c3..07029220 100644 --- a/Runtime/Component/Sub/GaugeAxis.cs +++ b/Runtime/Component/Sub/GaugeAxis.cs @@ -177,14 +177,14 @@ namespace XCharts internal Color GetAxisLineColor(ThemeInfo theme, int index) { - var color = axisLine.barColor != Color.clear ? axisLine.barColor : (Color)theme.GetColor(index); + var color = !ChartHelper.IsClearColor(axisLine.barColor) ? axisLine.barColor : (Color)theme.GetColor(index); color.a *= axisLine.opacity; return color; } internal Color GetAxisLineBackgroundColor(ThemeInfo theme, int index) { - var color = axisLine.barBackgroundColor != Color.clear ? axisLine.barBackgroundColor : Color.grey; + var color = !ChartHelper.IsClearColor(axisLine.barBackgroundColor) ? axisLine.barBackgroundColor : Color.grey; color.a *= axisLine.opacity; return color; } @@ -192,7 +192,7 @@ namespace XCharts internal Color GetSplitLineColor(ThemeInfo theme, int serieIndex, float angle) { Color color; - if (splitLine.lineStyle.color != Color.clear) + if (!ChartHelper.IsClearColor(splitLine.lineStyle.color)) { color = splitLine.lineStyle.color; color.a *= splitLine.lineStyle.opacity; @@ -215,7 +215,7 @@ namespace XCharts internal Color GetAxisTickColor(ThemeInfo theme, int serieIndex, float angle) { Color color; - if (axisTick.lineStyle.color != Color.clear) + if (!ChartHelper.IsClearColor(axisTick.lineStyle.color)) { color = axisTick.lineStyle.color; color.a *= axisTick.lineStyle.opacity; @@ -238,7 +238,7 @@ namespace XCharts internal Color GetPointerColor(ThemeInfo theme, int serieIndex, float angle, ItemStyle itemStyle) { Color color; - if (itemStyle.color != Color.clear) + if (!ChartHelper.IsClearColor(itemStyle.color)) { color = itemStyle.color; color.a *= itemStyle.opacity; diff --git a/Runtime/Component/Sub/IconStyle.cs b/Runtime/Component/Sub/IconStyle.cs index 8d665b0a..73ed4a6c 100644 --- a/Runtime/Component/Sub/IconStyle.cs +++ b/Runtime/Component/Sub/IconStyle.cs @@ -33,7 +33,7 @@ namespace XCharts /// Whether the data icon is show. /// 是否显示图标。 /// - public bool show { get { return m_Show; } set { m_Show = value; UpdateIcon(); } } + public bool show { get { return m_Show; } set { m_Show = value; } } /// /// 显示在上层还是在下层。 /// @@ -59,47 +59,5 @@ namespace XCharts /// 图标偏移。 /// public Vector3 offset { get { return m_Offset; } set { m_Offset = value; } } - - public Image image { get; private set; } - public RectTransform rect { get; private set; } - - public void SetImage(Image image) - { - this.image = image; - if (image) - { - rect = image.GetComponent(); - if (m_Layer == Layer.UnderLabel) - rect.SetSiblingIndex(0); - else - rect.SetSiblingIndex(image.transform.childCount - 1); - UpdateIcon(); - } - } - - public void SetActive(bool flag) - { - if (image) - { - ChartHelper.SetActive(image.gameObject, flag); - } - } - - public void UpdateIcon() - { - if (image == null) return; - if (show) - { - ChartHelper.SetActive(image.gameObject, true); - image.sprite = m_Sprite; - image.color = m_Color; - rect.sizeDelta = new Vector2(m_Width, m_Height); - image.transform.localPosition = m_Offset; - } - else - { - ChartHelper.SetActive(image.gameObject, false); - } - } } } diff --git a/Runtime/Component/Sub/ItemStyle.cs b/Runtime/Component/Sub/ItemStyle.cs index cd0a8cf2..10d3b99a 100644 --- a/Runtime/Component/Sub/ItemStyle.cs +++ b/Runtime/Component/Sub/ItemStyle.cs @@ -178,11 +178,12 @@ namespace XCharts /// public bool NeedShowBorder() { - return borderWidth != 0 && borderColor != Color.clear; + return borderWidth != 0 && !ChartHelper.IsClearColor(borderColor); } public Color GetColor() { + if (m_Opacity == 1) return m_Color; var color = m_Color; color.a *= m_Opacity; return color; diff --git a/Runtime/Component/Sub/SerieData.cs b/Runtime/Component/Sub/SerieData.cs index 99569a85..d9c3747a 100644 --- a/Runtime/Component/Sub/SerieData.cs +++ b/Runtime/Component/Sub/SerieData.cs @@ -32,10 +32,9 @@ namespace XCharts [SerializeField] private Emphasis m_Emphasis = new Emphasis(); [SerializeField] private List m_Data = new List(); + public LabelObject labelObject { get; set; } + private bool m_Show = true; - private bool m_LabelAutoSize; - private float m_LabelPaddingLeftRight; - private float m_LabelPaddingTopBottom; private float m_RtPieOutsideRadius; public int index { get; set; } @@ -102,15 +101,6 @@ namespace XCharts /// 该数据项是否被高亮,一般由鼠标悬停或图例悬停触发高亮。 /// public bool highlighted { get; set; } - /// - /// the label of data item. - /// 该数据项的文本标签。 - /// - public Text labelText { get; private set; } - public RectTransform labelRect { get; private set; } - /// - /// 标志位置。 - /// public Vector3 labelPosition { get; set; } private bool m_CanShowLabel = true; /// @@ -127,11 +117,6 @@ namespace XCharts /// 最小值。 /// public float min { get { return m_Data.Min(); } } - - /// - /// 关联的gameObject - /// - public GameObject gameObject { get; private set; } /// /// 饼图数据项的开始角度(运行时自动计算) /// @@ -279,93 +264,21 @@ namespace XCharts return false; } - public void InitLabel(GameObject labelObj, bool autoSize, float paddingLeftRight, float paddingTopBottom) - { - gameObject = labelObj; - m_LabelAutoSize = autoSize; - m_LabelPaddingLeftRight = paddingLeftRight; - m_LabelPaddingTopBottom = paddingTopBottom; - labelText = labelObj.GetComponentInChildren(); - labelRect = labelText.GetComponent(); - } - - public void SetLabelActive(bool active) - { - if (labelRect) - { - ChartHelper.SetActive(labelRect, active); - } - } - - public bool SetLabelText(string text) - { - if (labelText && !labelText.text.Equals(text)) - { - labelText.text = text; - if (m_LabelAutoSize) - { - var newSize = string.IsNullOrEmpty(text) ? Vector2.zero : - new Vector2(labelText.preferredWidth + m_LabelPaddingLeftRight * 2, - labelText.preferredHeight + m_LabelPaddingTopBottom * 2); - var sizeChange = newSize.x != labelRect.sizeDelta.x || newSize.y != labelRect.sizeDelta.y; - if (sizeChange) labelRect.sizeDelta = newSize; - return sizeChange; - } - } - return false; - } - - public void SetLabelColor(Color color) - { - if (labelText) - { - labelText.color = color; - } - } - public float GetLabelWidth() { - if (labelRect) return labelRect.sizeDelta.x; + if (labelObject != null) return labelObject.GetLabelWidth(); else return 0; } public float GetLabelHeight() { - if (labelRect) return labelRect.sizeDelta.y; + if (labelObject != null) return labelObject.GetLabelHeight(); return 0; } - public void SetGameObjectPosition(Vector3 position) + public void SetLabelActive(bool flag) { - if (gameObject) - { - gameObject.transform.localPosition = position; - } - } - - public void SetLabelPosition(Vector3 position) - { - if (labelRect) labelRect.localPosition = position; - } - - [Obsolete("Use SerieData.SetIconImage() instead.", true)] - public void SetIconObj(GameObject iconObj) { } - - public void SetIconImage(Image image) - { - if (iconStyle == null) return; - iconStyle.SetImage(image); - } - - public void UpdateIcon() - { - if (iconStyle == null) return; - iconStyle.UpdateIcon(); - } - - public bool IsInitLabel() - { - return labelText != null; + if (labelObject != null) labelObject.SetLabelActive(flag); } } } diff --git a/Runtime/Component/Sub/SerieLabel.cs b/Runtime/Component/Sub/SerieLabel.cs index 0b9e70ae..f6ae12b6 100644 --- a/Runtime/Component/Sub/SerieLabel.cs +++ b/Runtime/Component/Sub/SerieLabel.cs @@ -110,7 +110,7 @@ namespace XCharts public bool show { get { return m_Show; } - set { if (PropertyUtility.SetStruct(ref m_Show, value)) SetVerticesDirty(); } + set { if (PropertyUtility.SetStruct(ref m_Show, value)) SetAllDirty(); } } /// /// The position of label. diff --git a/Runtime/Component/Sub/TitleStyle.cs b/Runtime/Component/Sub/TitleStyle.cs index 1ddca59b..7d398120 100644 --- a/Runtime/Component/Sub/TitleStyle.cs +++ b/Runtime/Component/Sub/TitleStyle.cs @@ -79,7 +79,7 @@ namespace XCharts { if (runtimeText && !runtimeText.text.Equals(text)) { - if (textStyle.color != Color.clear) runtimeText.color = textStyle.color; + if (!ChartHelper.IsClearColor(textStyle.color)) runtimeText.color = textStyle.color; runtimeText.text = text; } } diff --git a/Runtime/GaugeChart.cs b/Runtime/GaugeChart.cs index 5b236136..fff2cad4 100644 --- a/Runtime/GaugeChart.cs +++ b/Runtime/GaugeChart.cs @@ -206,7 +206,7 @@ namespace XCharts { if (!serie.gaugePointer.show) return; var pointerColor = serie.gaugeAxis.GetPointerColor(m_ThemeInfo, serie.index, currAngle, serie.itemStyle); - var pointerToColor = serie.itemStyle.toColor != Color.clear ? serie.itemStyle.toColor : pointerColor; + var pointerToColor = !ChartHelper.IsClearColor(serie.itemStyle.toColor) ? serie.itemStyle.toColor : pointerColor; var len = serie.gaugePointer.length < 1 && serie.gaugePointer.length > -1 ? serie.runtimeInsideRadius * serie.gaugePointer.length : serie.gaugePointer.length; diff --git a/Runtime/HeatmapChart.cs b/Runtime/HeatmapChart.cs index c3c0a815..07f647b4 100644 --- a/Runtime/HeatmapChart.cs +++ b/Runtime/HeatmapChart.cs @@ -36,8 +36,8 @@ namespace XCharts RemoveData(); var serie = AddSerie(SerieType.Heatmap, "serie1"); var heatmapGridWid = 10f; - int xSplitNumber = (int)(coordinateWidth / heatmapGridWid); - int ySplitNumber = (int)(coordinateHeight / heatmapGridWid); + int xSplitNumber = (int)(m_CoordinateWidth / heatmapGridWid); + int ySplitNumber = (int)(m_CoordinateHeight / heatmapGridWid); serie.itemStyle.show = true; serie.itemStyle.borderWidth = 1; serie.itemStyle.borderColor = Color.clear; diff --git a/Runtime/Helper/CheckHelper.cs b/Runtime/Helper/CheckHelper.cs index a15b3e9a..095311c0 100644 --- a/Runtime/Helper/CheckHelper.cs +++ b/Runtime/Helper/CheckHelper.cs @@ -13,7 +13,7 @@ namespace XCharts { private static bool IsColorAlphaZero(Color color) { - return color != Color.clear && color.a == 0; + return !ChartHelper.IsClearColor(color) && color.a == 0; } public static string CheckChart(BaseChart chart) { @@ -48,9 +48,9 @@ namespace XCharts var title = chart.title; if (!title.show) return; if (string.IsNullOrEmpty(title.text)) sb.Append("warning:title->text is null\n"); - if (title.textStyle.color != Color.clear && title.textStyle.color.a == 0) + if(IsColorAlphaZero(title.textStyle.color)) sb.Append("warning:title->textStyle->color alpha is 0\n"); - if (title.subTextStyle.color != Color.clear && title.subTextStyle.color.a == 0) + if(IsColorAlphaZero(title.subTextStyle.color)) sb.Append("warning:title->subTextStyle->color alpha is 0\n"); } @@ -58,7 +58,7 @@ namespace XCharts { var legend = chart.legend; if (!legend.show) return; - if (legend.textStyle.color != Color.clear && legend.textStyle.color.a == 0) + if(IsColorAlphaZero(legend.textStyle.color)) sb.Append("warning:legend->textStyle->color alpha is 0\n"); var serieNameList = chart.series.GetLegalSerieNameList(); if (serieNameList.Count == 0) sb.Append("warning:legend need serie.name or serieData.name not empty\n"); @@ -106,7 +106,7 @@ namespace XCharts sb.AppendFormat("warning:serie {0} lineStyle->width is 0\n", serie.index); if (serie.lineStyle.opacity == 0) sb.AppendFormat("warning:serie {0} lineStyle->opacity is 0\n", serie.index); - if (serie.lineStyle.color != Color.clear && serie.lineStyle.color.a == 0) + if(IsColorAlphaZero(serie.lineStyle.color)) sb.AppendFormat("warning:serie {0} lineStyle->color alpha is 0\n", serie.index); break; case SerieType.Bar: diff --git a/Runtime/Helper/LegendHelper.cs b/Runtime/Helper/LegendHelper.cs index bae8e964..aa50a8a8 100644 --- a/Runtime/Helper/LegendHelper.cs +++ b/Runtime/Helper/LegendHelper.cs @@ -14,7 +14,7 @@ namespace XCharts public static Color GetContentColor(Legend legend, ThemeInfo themeInfo, bool active) { var textStyle = legend.textStyle; - if (active) return textStyle.color != Color.clear ? textStyle.color : (Color)themeInfo.legendTextColor; + if (active) return !ChartHelper.IsClearColor(textStyle.color) ? textStyle.color : (Color)themeInfo.legendTextColor; else return (Color)themeInfo.legendUnableColor; } diff --git a/Runtime/Helper/SerieHelper.cs b/Runtime/Helper/SerieHelper.cs index 17a67e05..544d27c7 100644 --- a/Runtime/Helper/SerieHelper.cs +++ b/Runtime/Helper/SerieHelper.cs @@ -13,19 +13,19 @@ namespace XCharts { internal static Color GetItemBackgroundColor(Serie serie, SerieData serieData, ThemeInfo theme, int index, bool highlight, bool useDefault = true) { - var itemStyle = GetItemStyle(serie, serieData); var color = Color.clear; if (highlight) { var itemStyleEmphasis = GetItemStyleEmphasis(serie, serieData); - if (itemStyleEmphasis != null && itemStyleEmphasis.backgroundColor != Color.clear) + if (itemStyleEmphasis != null && !ChartHelper.IsClearColor(itemStyleEmphasis.backgroundColor)) { color = itemStyleEmphasis.backgroundColor; color.a *= itemStyleEmphasis.opacity; return color; } } - if (itemStyle.backgroundColor != Color.clear) + var itemStyle = GetItemStyle(serie, serieData); + if (!ChartHelper.IsClearColor(itemStyle.backgroundColor)) { color = itemStyle.backgroundColor; if (highlight) color *= color; @@ -39,23 +39,23 @@ namespace XCharts color.a = 0.2f; return color; } - return Color.clear; + return color; } internal static Color GetItemColor(Serie serie, SerieData serieData, ThemeInfo theme, int index, bool highlight) { - var itemStyle = GetItemStyle(serie, serieData); if (highlight) { var itemStyleEmphasis = GetItemStyleEmphasis(serie, serieData); - if (itemStyleEmphasis != null && itemStyleEmphasis.color != Color.clear) + if (itemStyleEmphasis != null && !ChartHelper.IsClearColor(itemStyleEmphasis.color)) { var color = itemStyleEmphasis.color; color.a *= itemStyleEmphasis.opacity; return color; } } - if (itemStyle.color != Color.clear) + var itemStyle = GetItemStyle(serie, serieData); + if (!ChartHelper.IsClearColor(itemStyle.color)) { var color = itemStyle.color; if (highlight) color *= color; @@ -73,26 +73,26 @@ namespace XCharts internal static Color GetItemToColor(Serie serie, SerieData serieData, ThemeInfo theme, int index, bool highlight) { - var itemStyle = GetItemStyle(serie, serieData, highlight); if (highlight) { var itemStyleEmphasis = GetItemStyleEmphasis(serie, serieData); - if (itemStyleEmphasis != null && itemStyleEmphasis.toColor != Color.clear) + if (itemStyleEmphasis != null && !ChartHelper.IsClearColor(itemStyleEmphasis.toColor)) { var color = itemStyleEmphasis.toColor; color.a *= itemStyleEmphasis.opacity; return color; } } + var itemStyle = GetItemStyle(serie, serieData, highlight); if (itemStyle == null) itemStyle = serieData.itemStyle; - if (itemStyle.toColor != Color.clear) + if (!ChartHelper.IsClearColor(itemStyle.toColor)) { var color = itemStyle.toColor; if (highlight) color *= color; color.a *= itemStyle.opacity; return color; } - if (itemStyle.color != Color.clear) + if (!ChartHelper.IsClearColor(itemStyle.color)) { var color = itemStyle.color; if (highlight) color *= color; @@ -142,13 +142,14 @@ namespace XCharts if (style == null) return GetItemStyle(serie, serieData, false); else return style; } + else if (serie.IsPerformanceMode()) return serie.itemStyle; else if (serieData != null && serieData.enableItemStyle) return serieData.itemStyle; else return serie.itemStyle; } public static ItemStyle GetItemStyleEmphasis(Serie serie, SerieData serieData) { - if (serieData != null && serieData.enableEmphasis && serieData.emphasis.show) + if (!serie.IsPerformanceMode() && serieData != null && serieData.enableEmphasis && serieData.emphasis.show) return serieData.emphasis.itemStyle; else if (serie.emphasis.show) return serie.emphasis.itemStyle; else return null; @@ -158,13 +159,14 @@ namespace XCharts { if (highlight) { - if (serieData.enableEmphasis && serieData.emphasis.show) return serieData.emphasis.label; + if (!serie.IsPerformanceMode() && serieData.enableEmphasis && serieData.emphasis.show) + return serieData.emphasis.label; else if (serie.emphasis.show) return serie.emphasis.label; else return serie.label; } else { - if (serieData.enableLabel) return serieData.label; + if (!serie.IsPerformanceMode() && serieData.enableLabel) return serieData.label; else return serie.label; } } @@ -172,10 +174,10 @@ namespace XCharts public static Color GetAreaColor(Serie serie, ThemeInfo theme, int index, bool highlight) { var areaStyle = serie.areaStyle; - var color = areaStyle.color != Color.clear ? areaStyle.color : (Color)theme.GetColor(index); + var color = !ChartHelper.IsClearColor(areaStyle.color) ? areaStyle.color : (Color)theme.GetColor(index); if (highlight) { - if (areaStyle.highlightColor != Color.clear) color = areaStyle.highlightColor; + if (!ChartHelper.IsClearColor(areaStyle.highlightColor)) color = areaStyle.highlightColor; else color *= color; } color.a *= areaStyle.opacity; @@ -185,12 +187,12 @@ namespace XCharts public static Color GetAreaToColor(Serie serie, ThemeInfo theme, int index, bool highlight) { var areaStyle = serie.areaStyle; - if (areaStyle.toColor != Color.clear) + if (!ChartHelper.IsClearColor(areaStyle.toColor)) { var color = areaStyle.toColor; if (highlight) { - if (areaStyle.highlightToColor != Color.clear) color = areaStyle.highlightToColor; + if (!ChartHelper.IsClearColor(areaStyle.highlightToColor)) color = areaStyle.highlightToColor; else color *= color; } color.a *= areaStyle.opacity; @@ -208,16 +210,16 @@ namespace XCharts if (highlight) { var itemStyleEmphasis = GetItemStyleEmphasis(serie, null); - if (itemStyleEmphasis != null && itemStyleEmphasis.color != Color.clear) + if (itemStyleEmphasis != null && !ChartHelper.IsClearColor(itemStyleEmphasis.color)) { color = itemStyleEmphasis.color; color.a *= itemStyleEmphasis.opacity; return color; } } - if (serie.lineStyle.color != Color.clear) color = serie.lineStyle.GetColor(); - else if (serie.itemStyle.color != Color.clear) color = serie.itemStyle.GetColor(); - if (color == Color.clear) + if (!ChartHelper.IsClearColor(serie.lineStyle.color)) color = serie.lineStyle.GetColor(); + else if (!ChartHelper.IsClearColor(serie.itemStyle.color)) color = serie.itemStyle.GetColor(); + if (ChartHelper.IsClearColor(color)) { color = (Color)theme.GetColor(index); color.a = serie.lineStyle.opacity; diff --git a/Runtime/Helper/SerieLabelHelper.cs b/Runtime/Helper/SerieLabelHelper.cs index d5800864..75da71e6 100644 --- a/Runtime/Helper/SerieLabelHelper.cs +++ b/Runtime/Helper/SerieLabelHelper.cs @@ -22,7 +22,7 @@ namespace XCharts { if (serie.label.show && serie.show) { - if (serieData.IsInitLabel()) + if (serieData.labelObject != null) { serieData.SetLabelActive(true); m_UpdateLabelText = true; @@ -32,7 +32,7 @@ namespace XCharts m_ReinitLabel = true; } } - else + else if (serieData.labelObject != null) { serieData.SetLabelActive(false); } @@ -60,7 +60,7 @@ namespace XCharts public static Color GetLabelColor(Serie serie, ThemeInfo themeInfo, int index) { - if (serie.label.color != Color.clear) + if (!ChartHelper.IsClearColor(serie.label.color)) { return serie.label.color; } @@ -72,13 +72,12 @@ namespace XCharts public static void ResetLabel(SerieData serieData, SerieLabel label, ThemeInfo themeInfo, int colorIndex) { - if (serieData.labelText) - { - serieData.labelText.color = label.color != Color.clear ? label.color : - (Color)themeInfo.GetColor(colorIndex); - serieData.labelText.fontSize = label.fontSize; - serieData.labelText.fontStyle = label.fontStyle; - } + if (serieData.labelObject == null) return; + if (serieData.labelObject.label == null) return; + serieData.labelObject.label.color = !ChartHelper.IsClearColor(label.color) ? label.color : + (Color)themeInfo.GetColor(colorIndex); + serieData.labelObject.label.fontSize = label.fontSize; + serieData.labelObject.label.fontStyle = label.fontStyle; } public static string GetFormatterContent(Serie serie, SerieData serieData, @@ -126,20 +125,16 @@ namespace XCharts private static void SetGaugeLabelText(Serie serie) { var serieData = serie.GetSerieData(0); - if (serieData != null) + if (serieData == null) return; + if (serieData.labelObject == null) return; + var value = serieData.GetData(1); + var total = serie.max; + var content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total); + serieData.labelObject.SetText(content); + serieData.labelObject.SetLabelPosition(serie.runtimeCenterPos + serie.label.offset); + if (!ChartHelper.IsClearColor(serie.label.color)) { - if (serieData.IsInitLabel()) - { - var value = serieData.GetData(1); - var total = serie.max; - var content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total); - serieData.SetLabelText(content); - serieData.SetLabelPosition(serie.runtimeCenterPos + serie.label.offset); - if (serie.label.color != Color.clear) - { - serieData.SetLabelColor(serie.label.color); - } - } + serieData.labelObject.label.color = serie.label.color; } } @@ -149,7 +144,7 @@ namespace XCharts { var serieData = serie.data[i]; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData, serieData.highlighted); - if (serieLabel.show && serieData.IsInitLabel()) + if (serieLabel.show && serieData.labelObject != null) { if (!serie.show || !serieData.show) { @@ -160,20 +155,20 @@ namespace XCharts var total = serieData.GetData(1); var content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total); serieData.SetLabelActive(true); - serieData.SetLabelText(content); - serieData.SetLabelColor(GetLabelColor(serie, themeInfo, i)); + serieData.labelObject.SetText(content); + serieData.labelObject.SetLabelColor(GetLabelColor(serie, themeInfo, i)); if (serie.label.position == SerieLabel.Position.Bottom) { var labelWidth = serieData.GetLabelWidth(); if (serie.clockwise) - serieData.SetLabelPosition(serieData.labelPosition - new Vector3(labelWidth / 2, 0)); + serieData.labelObject.SetLabelPosition(serieData.labelPosition - new Vector3(labelWidth / 2, 0)); else - serieData.SetLabelPosition(serieData.labelPosition + new Vector3(labelWidth / 2, 0)); + serieData.labelObject.SetLabelPosition(serieData.labelPosition + new Vector3(labelWidth / 2, 0)); } else { - serieData.SetLabelPosition(serieData.labelPosition); + serieData.labelObject.SetLabelPosition(serieData.labelPosition); } } } diff --git a/Runtime/Helper/TitleHelper.cs b/Runtime/Helper/TitleHelper.cs index 64da6c76..27ab0c41 100644 --- a/Runtime/Helper/TitleHelper.cs +++ b/Runtime/Helper/TitleHelper.cs @@ -18,7 +18,7 @@ namespace XCharts public static Color GetTextColor(Title title, ThemeInfo themeInfo) { - return title.textStyle.color != Color.clear ? title.textStyle.color : (Color)themeInfo.titleTextColor; + return !ChartHelper.IsClearColor(title.textStyle.color) ? title.textStyle.color : (Color)themeInfo.titleTextColor; } public static Font GetSubTextFont(Title title, ThemeInfo themeInfo) @@ -28,7 +28,7 @@ namespace XCharts public static Color GetSubTextColor(Title title, ThemeInfo themeInfo) { - return title.subTextStyle.color != Color.clear ? title.subTextStyle.color : (Color)themeInfo.titleSubTextColor; + return !ChartHelper.IsClearColor(title.subTextStyle.color) ? title.subTextStyle.color : (Color)themeInfo.titleSubTextColor; } } } \ No newline at end of file diff --git a/Runtime/Helper/TooltipHelper.cs b/Runtime/Helper/TooltipHelper.cs index 9c7bd851..2dd0cc67 100644 --- a/Runtime/Helper/TooltipHelper.cs +++ b/Runtime/Helper/TooltipHelper.cs @@ -421,7 +421,7 @@ namespace XCharts public static Color GetLineColor(Tooltip tooltip, ThemeInfo theme) { var lineStyle = tooltip.lineStyle; - if (lineStyle.color != Color.clear) + if (!ChartHelper.IsClearColor(lineStyle.color)) { var color = lineStyle.color; color.a *= lineStyle.opacity; diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 809b194d..5d63a45c 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -35,6 +35,7 @@ namespace XCharts IDragHandler, IEndDragHandler, IScrollHandler { protected static readonly string s_TitleObjectName = "title"; + protected static readonly string s_SubTitleObjectName = "title_sub"; protected static readonly string s_LegendObjectName = "legend"; protected static readonly string s_SerieLabelObjectName = "label"; protected static readonly string s_SerieTitleObjectName = "serie"; @@ -70,6 +71,7 @@ namespace XCharts [NonSerialized] protected bool m_CheckAnimation = false; [NonSerialized] protected bool m_IsPlayingAnimation = false; [NonSerialized] protected List m_LegendRealShowName = new List(); + [NonSerialized] protected GameObject m_SerieLabelRoot; protected Vector2 chartAnchorMax { get { return m_ChartMinAnchor; } } protected Vector2 chartAnchorMin { get { return m_ChartMaxAnchor; } } @@ -249,7 +251,7 @@ namespace XCharts var subTextFont = TitleHelper.GetSubTextFont(title, themeInfo); var subTextColor = TitleHelper.GetSubTextColor(title, themeInfo); - Text subText = ChartHelper.AddTextObject(s_TitleObjectName + "_sub", titleObject.transform, + Text subText = ChartHelper.AddTextObject(s_SubTitleObjectName, titleObject.transform, subTextFont, subTextColor, anchor, anchorMin, anchorMax, pivot, new Vector2(titleWid, m_Title.subTextStyle.fontSize), m_Title.subTextStyle.fontSize, m_Title.subTextStyle.rotate, m_Title.subTextStyle.fontStyle, m_Title.subTextStyle.lineSpacing); @@ -364,9 +366,9 @@ namespace XCharts private void InitSerieLabel() { - var labelObject = ChartHelper.AddObject(s_SerieLabelObjectName, transform, m_ChartMinAnchor, + m_SerieLabelRoot = ChartHelper.AddObject(s_SerieLabelObjectName, transform, m_ChartMinAnchor, m_ChartMaxAnchor, m_ChartPivot, m_ChartSizeDelta); - SerieLabelPool.ReleaseAll(labelObject.transform); + SerieLabelPool.ReleaseAll(m_SerieLabelRoot.transform); int count = 0; for (int i = 0; i < m_Series.Count; i++) { @@ -375,34 +377,44 @@ namespace XCharts for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; - var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); - if (!serieLabel.show && j > 100) continue; - var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, i, j); - var color = Color.grey; - if (serie.type == SerieType.Pie) - { - color = (serieLabel.position == SerieLabel.Position.Inside) ? Color.white : - (Color)m_ThemeInfo.GetColor(count); - } - else - { - color = serieLabel.color != Color.clear ? serieLabel.color : - (Color)m_ThemeInfo.GetColor(i); - } - var labelObj = SerieLabelPool.Get(textName, labelObject.transform, serieLabel, m_ThemeInfo.font, color, - serieData.iconStyle.width, serieData.iconStyle.height); - var iconImage = labelObj.transform.Find("Icon").GetComponent(); - serieData.SetIconImage(iconImage); - - var isAutoSize = serieLabel.backgroundWidth == 0 || serieLabel.backgroundHeight == 0; - serieData.InitLabel(labelObj, isAutoSize, serieLabel.paddingLeftRight, serieLabel.paddingTopBottom); - serieData.SetLabelActive(false); + serieData.index = j; + AddSerieLabel(serie, serieData, count); count++; } } SerieLabelHelper.UpdateLabelText(m_Series, m_ThemeInfo); } + protected void AddSerieLabel(Serie serie, SerieData serieData, int count = -1) + { + if (m_SerieLabelRoot == null) return; + if (count == -1) count = serie.dataCount; + var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); + if (serie.IsPerformanceMode()) return; + if (!serieLabel.show) return; + var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index); + var color = Color.grey; + if (serie.type == SerieType.Pie) + { + color = (serieLabel.position == SerieLabel.Position.Inside) ? Color.white : + (Color)m_ThemeInfo.GetColor(count); + } + else + { + color = !ChartHelper.IsClearColor(serieLabel.color) ? serieLabel.color : + (Color)m_ThemeInfo.GetColor(serie.index); + } + var labelObj = SerieLabelPool.Get(textName, m_SerieLabelRoot.transform, serieLabel, m_ThemeInfo.font, color, + serieData.iconStyle.width, serieData.iconStyle.height); + var iconImage = labelObj.transform.Find("Icon").GetComponent(); + var isAutoSize = serieLabel.backgroundWidth == 0 || serieLabel.backgroundHeight == 0; + var item = new LabelObject(); + item.SetLabel(labelObj, isAutoSize, serieLabel.paddingLeftRight, serieLabel.paddingTopBottom); + item.SetIcon(iconImage); + item.SetIconActive(false); + serieData.labelObject = item; + } + private void InitSerieTitle() { var titleObject = ChartHelper.AddObject(s_SerieTitleObjectName, transform, m_ChartMinAnchor, @@ -412,7 +424,7 @@ namespace XCharts { var serie = m_Series.list[i]; var textStyle = serie.titleStyle.textStyle; - var color = textStyle.color == Color.clear ? m_ThemeInfo.GetColor(i) : (Color32)textStyle.color; + var color = ChartHelper.IsClearColor(textStyle.color) ? m_ThemeInfo.GetColor(i) : (Color32)textStyle.color; var anchorMin = new Vector2(0.5f, 0.5f); var anchorMax = new Vector2(0.5f, 0.5f); var pivot = new Vector2(0.5f, 0.5f); @@ -850,7 +862,7 @@ namespace XCharts && SerieHelper.IsDownPoint(serie, serieData.index) && !serie.areaStyle.show; var centerPos = serieData.labelPosition + serieLabel.offset * (invert ? -1 : 1); - var labelHalfWid = serieData.GetLabelWidth() / 2; + var labelHalfWid = serieData.labelObject.GetLabelWidth() / 2; var labelHalfHig = serieData.GetLabelHeight() / 2; var p1 = new Vector3(centerPos.x - labelHalfWid, centerPos.y + labelHalfHig); var p2 = new Vector3(centerPos.x + labelHalfWid, centerPos.y + labelHalfHig); diff --git a/Runtime/Internal/CoordinateChart.cs b/Runtime/Internal/CoordinateChart.cs index 4427958e..5908b222 100644 --- a/Runtime/Internal/CoordinateChart.cs +++ b/Runtime/Internal/CoordinateChart.cs @@ -24,6 +24,10 @@ namespace XCharts [SerializeField] protected DataZoom m_DataZoom = DataZoom.defaultDataZoom; [SerializeField] protected VisualMap m_VisualMap = new VisualMap(); + protected float m_CoordinateX; + protected float m_CoordinateY; + protected float m_CoordinateWidth; + protected float m_CoordinateHeight; private bool m_DataZoomDrag; private bool m_DataZoomCoordinateDrag; private bool m_DataZoomStartDrag; @@ -147,11 +151,11 @@ namespace XCharts var xSplitDiff = xAxis0.splitLine.lineStyle.width; var ySplitDiff = yAxis0.splitLine.lineStyle.width; - var cpty = coordinateY + coordinateHeight + ySplitDiff; - var cp1 = new Vector3(coordinateX - yLineDiff, coordinateY - xLineDiff); - var cp2 = new Vector3(coordinateX - yLineDiff, cpty); - var cp3 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, cpty); - var cp4 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, coordinateY - xLineDiff); + var cpty = m_CoordinateY + m_CoordinateHeight + ySplitDiff; + var cp1 = new Vector3(m_CoordinateX - yLineDiff, m_CoordinateY - xLineDiff); + var cp2 = new Vector3(m_CoordinateX - yLineDiff, cpty); + var cp3 = new Vector3(m_CoordinateX + m_CoordinateWidth + xSplitDiff, cpty); + var cp4 = new Vector3(m_CoordinateX + m_CoordinateWidth + xSplitDiff, m_CoordinateY - xLineDiff); ChartDrawer.DrawPolygon(vh, cp1, cp2, cp3, cp4, m_ThemeInfo.backgroundColor); } @@ -170,23 +174,23 @@ namespace XCharts var ySplitDiff = yAxis0.splitLine.lineStyle.width; 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); + var lp3 = new Vector3(m_CoordinateX - yLineDiff, m_ChartY + chartHeight); + var lp4 = new Vector3(m_CoordinateX - yLineDiff, m_ChartY); ChartDrawer.DrawPolygon(vh, lp1, lp2, lp3, lp4, m_ThemeInfo.backgroundColor); - var rp1 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, m_ChartY); - var rp2 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, m_ChartY + chartHeight); + var rp1 = new Vector3(m_CoordinateX + m_CoordinateWidth + xSplitDiff, m_ChartY); + var rp2 = new Vector3(m_CoordinateX + m_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, m_ChartY + chartHeight); - var up3 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, m_ChartY + chartHeight); - var up4 = new Vector3(coordinateX + coordinateWidth + xSplitDiff, coordinateY + coordinateHeight + ySplitDiff); + var up1 = new Vector3(m_CoordinateX - yLineDiff, m_CoordinateY + m_CoordinateHeight + ySplitDiff); + var up2 = new Vector3(m_CoordinateX - yLineDiff, m_ChartY + chartHeight); + var up3 = new Vector3(m_CoordinateX + m_CoordinateWidth + xSplitDiff, m_ChartY + chartHeight); + var up4 = new Vector3(m_CoordinateX + m_CoordinateWidth + xSplitDiff, m_CoordinateY + m_CoordinateHeight + ySplitDiff); ChartDrawer.DrawPolygon(vh, up1, up2, up3, up4, m_ThemeInfo.backgroundColor); - 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, m_ChartY); + var dp1 = new Vector3(m_CoordinateX - yLineDiff, m_ChartY); + var dp2 = new Vector3(m_CoordinateX - yLineDiff, m_CoordinateY - xLineDiff); + var dp3 = new Vector3(m_CoordinateX + m_CoordinateWidth + xSplitDiff, m_CoordinateY - xLineDiff); + var dp4 = new Vector3(m_CoordinateX + m_CoordinateWidth + xSplitDiff, m_ChartY); ChartDrawer.DrawPolygon(vh, dp1, dp2, dp3, dp4, m_ThemeInfo.backgroundColor); } @@ -260,12 +264,12 @@ namespace XCharts if (!xAxis.show && !yAxis.show) continue; if (isCartesian && xAxis.show && yAxis.show) { - var yRate = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) / coordinateHeight; - var xRate = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) / coordinateWidth; - var yValue = yRate * (local.y - coordinateY - yAxis.runtimeZeroYOffset); + var yRate = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) / m_CoordinateHeight; + var xRate = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) / m_CoordinateWidth; + var yValue = yRate * (local.y - m_CoordinateY - yAxis.runtimeZeroYOffset); if (yAxis.runtimeMinValue > 0) yValue += yAxis.runtimeMinValue; m_Tooltip.runtimeYValues[i] = yValue; - var xValue = xRate * (local.x - coordinateX - xAxis.runtimeZeroXOffset); + var xValue = xRate * (local.x - m_CoordinateX - xAxis.runtimeZeroXOffset); if (xAxis.runtimeMinValue > 0) xValue += xAxis.runtimeMinValue; m_Tooltip.runtimeXValues[i] = xValue; @@ -296,8 +300,8 @@ namespace XCharts for (int j = 0; j < xAxis.GetDataNumber(m_DataZoom); j++) { - float splitWid = xAxis.GetDataWidth(coordinateWidth, dataCount, m_DataZoom); - float pX = coordinateX + j * splitWid; + float splitWid = xAxis.GetDataWidth(m_CoordinateWidth, dataCount, m_DataZoom); + float pX = m_CoordinateX + j * splitWid; if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) || (!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2))) { @@ -308,8 +312,8 @@ namespace XCharts } for (int j = 0; j < yAxis.GetDataNumber(m_DataZoom); j++) { - float splitWid = yAxis.GetDataWidth(coordinateHeight, dataCount, m_DataZoom); - float pY = coordinateY + j * splitWid; + float splitWid = yAxis.GetDataWidth(m_CoordinateHeight, dataCount, m_DataZoom); + float pY = m_CoordinateY + j * splitWid; if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) || (!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2))) { @@ -320,13 +324,13 @@ namespace XCharts } else if (xAxis.IsCategory()) { - var value = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * (local.y - coordinateY - yAxis.runtimeZeroYOffset) / coordinateHeight; + var value = (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * (local.y - m_CoordinateY - yAxis.runtimeZeroYOffset) / m_CoordinateHeight; if (yAxis.runtimeMinValue > 0) value += yAxis.runtimeMinValue; m_Tooltip.runtimeYValues[i] = value; for (int j = 0; j < xAxis.GetDataNumber(m_DataZoom); j++) { - float splitWid = xAxis.GetDataWidth(coordinateWidth, dataCount, m_DataZoom); - float pX = coordinateX + j * splitWid; + float splitWid = xAxis.GetDataWidth(m_CoordinateWidth, dataCount, m_DataZoom); + float pX = m_CoordinateX + j * splitWid; if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) || (!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2))) { @@ -338,13 +342,13 @@ namespace XCharts } else if (yAxis.IsCategory()) { - var value = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * (local.x - coordinateX - xAxis.runtimeZeroXOffset) / coordinateWidth; + var value = (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * (local.x - m_CoordinateX - xAxis.runtimeZeroXOffset) / m_CoordinateWidth; if (xAxis.runtimeMinValue > 0) value += xAxis.runtimeMinValue; m_Tooltip.runtimeXValues[i] = value; for (int j = 0; j < yAxis.GetDataNumber(m_DataZoom); j++) { - float splitWid = yAxis.GetDataWidth(coordinateHeight, dataCount, m_DataZoom); - float pY = coordinateY + j * splitWid; + float splitWid = yAxis.GetDataWidth(m_CoordinateHeight, dataCount, m_DataZoom); + float pY = m_CoordinateY + j * splitWid; if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) || (!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2))) { @@ -429,7 +433,7 @@ namespace XCharts Vector2 labelPos = Vector2.zero; if (axis is XAxis) { - var posY = axisIndex > 0 ? coordinateY + coordinateHeight : coordinateY; + var posY = axisIndex > 0 ? m_CoordinateY + m_CoordinateHeight : m_CoordinateY; var diff = axisIndex > 0 ? -axis.axisLabel.fontSize - axis.axisLabel.margin - 3.5f : axis.axisLabel.margin / 2 + 1; if (axis.IsValue()) { @@ -439,15 +443,15 @@ namespace XCharts else { labelText = axis.GetData((int)m_Tooltip.runtimeXValues[axisIndex], m_DataZoom); - float splitWidth = axis.GetSplitWidth(coordinateWidth, m_DataZoom); + float splitWidth = axis.GetSplitWidth(m_CoordinateWidth, m_DataZoom); int index = (int)m_Tooltip.runtimeXValues[axisIndex]; - float px = coordinateX + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0) + 0.5f; + float px = m_CoordinateX + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0) + 0.5f; labelPos = new Vector2(px, posY - diff); } } else if (axis is YAxis) { - var posX = axisIndex > 0 ? coordinateX + coordinateWidth : coordinateX; + var posX = axisIndex > 0 ? m_CoordinateX + m_CoordinateWidth : m_CoordinateX; var diff = axisIndex > 0 ? -axis.axisLabel.margin + 3 : axis.axisLabel.margin - 3; if (axis.IsValue()) { @@ -457,9 +461,9 @@ namespace XCharts else { labelText = axis.GetData((int)m_Tooltip.runtimeYValues[axisIndex], m_DataZoom); - float splitWidth = axis.GetSplitWidth(coordinateHeight, m_DataZoom); + float splitWidth = axis.GetSplitWidth(m_CoordinateHeight, m_DataZoom); int index = (int)m_Tooltip.runtimeYValues[axisIndex]; - float py = coordinateY + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0); + float py = m_CoordinateY + index * splitWidth + (axis.boundaryGap ? splitWidth / 2 : 0); labelPos = new Vector2(posX - diff, py); } } @@ -518,10 +522,10 @@ namespace XCharts axisObj.transform.localPosition = Vector3.zero; axisObj.SetActive(yAxis.show && yAxis.axisLabel.show); ChartHelper.HideAllObject(axisObj); - var labelColor = yAxis.axisLabel.color == Color.clear ? + var labelColor = ChartHelper.IsClearColor(yAxis.axisLabel.color) ? (Color)m_ThemeInfo.axisTextColor : yAxis.axisLabel.color; - int splitNumber = yAxis.GetSplitNumber(coordinateHeight, m_DataZoom); + int splitNumber = yAxis.GetSplitNumber(m_CoordinateHeight, m_DataZoom); float totalWidth = 0; for (int i = 0; i < splitNumber; i++) { @@ -542,12 +546,12 @@ namespace XCharts yAxis.axisLabel.fontSize, yAxis.axisLabel.rotate, yAxis.axisLabel.fontStyle); } - float labelWidth = yAxis.GetScaleWidth(coordinateHeight, i, m_DataZoom); + float labelWidth = yAxis.GetScaleWidth(m_CoordinateHeight, i, m_DataZoom); if (i == 0) yAxis.axisLabel.SetRelatedText(txt, labelWidth); txt.transform.localPosition = GetLabelYPosition(totalWidth + (yAxis.boundaryGap ? labelWidth / 2 : 0), i, yAxisIndex, yAxis); var isPercentStack = m_Series.IsPercentStack(SerieType.Bar); - txt.text = yAxis.GetLabelName(coordinateHeight, i, yAxis.runtimeMinValue, yAxis.runtimeMaxValue, m_DataZoom, isPercentStack); + txt.text = yAxis.GetLabelName(m_CoordinateHeight, i, yAxis.runtimeMinValue, yAxis.runtimeMaxValue, m_DataZoom, isPercentStack); txt.gameObject.SetActive(yAxis.show && (yAxis.axisLabel.interval == 0 || i % (yAxis.axisLabel.interval + 1) == 0)); yAxis.axisLabelTextList.Add(txt); @@ -555,12 +559,12 @@ namespace XCharts } if (yAxis.axisName.show) { - var color = yAxis.axisName.color == Color.clear ? (Color)m_ThemeInfo.axisTextColor : + var color = ChartHelper.IsClearColor(yAxis.axisName.color) ? (Color)m_ThemeInfo.axisTextColor : yAxis.axisName.color; var fontSize = yAxis.axisName.fontSize; var offset = yAxis.axisName.offset; Text axisName = null; - var zeroPos = new Vector3(coordinateX + m_XAxises[yAxisIndex].runtimeZeroXOffset, coordinateY); + var zeroPos = new Vector3(m_CoordinateX + m_XAxises[yAxisIndex].runtimeZeroXOffset, m_CoordinateY); switch (yAxis.axisName.location) { case AxisName.Location.Start: @@ -569,8 +573,8 @@ namespace XCharts new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(100, 20), fontSize, yAxis.axisName.rotate, yAxis.axisName.fontStyle); axisName.transform.localPosition = yAxisIndex > 0 ? - new Vector2(coordinateX + coordinateWidth + offset.x, coordinateY - offset.y) : - new Vector2(zeroPos.x + offset.x, coordinateY - offset.y); + new Vector2(m_CoordinateX + m_CoordinateWidth + offset.x, m_CoordinateY - offset.y) : + new Vector2(zeroPos.x + offset.x, m_CoordinateY - offset.y); break; case AxisName.Location.Middle: axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, @@ -578,8 +582,8 @@ namespace XCharts new Vector2(1, 0.5f), new Vector2(1, 0.5f), new Vector2(100, 20), fontSize, yAxis.axisName.rotate, yAxis.axisName.fontStyle); axisName.transform.localPosition = yAxisIndex > 0 ? - new Vector2(coordinateX + coordinateWidth - offset.x, coordinateY + coordinateHeight / 2 + offset.y) : - new Vector2(coordinateX - offset.x, coordinateY + coordinateHeight / 2 + offset.y); + new Vector2(m_CoordinateX + m_CoordinateWidth - offset.x, m_CoordinateY + m_CoordinateHeight / 2 + offset.y) : + new Vector2(m_CoordinateX - offset.x, m_CoordinateY + m_CoordinateHeight / 2 + offset.y); break; case AxisName.Location.End: axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, @@ -587,8 +591,8 @@ namespace XCharts new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(100, 20), fontSize, yAxis.axisName.rotate, yAxis.axisName.fontStyle); axisName.transform.localPosition = yAxisIndex > 0 ? - new Vector2(coordinateX + coordinateWidth + offset.x, coordinateY + coordinateHeight + offset.y) : - new Vector2(zeroPos.x + offset.x, coordinateY + coordinateHeight + offset.y); + new Vector2(m_CoordinateX + m_CoordinateWidth + offset.x, m_CoordinateY + m_CoordinateHeight + offset.y) : + new Vector2(zeroPos.x + offset.x, m_CoordinateY + m_CoordinateHeight + offset.y); break; } axisName.text = yAxis.axisName.name; @@ -623,14 +627,14 @@ namespace XCharts axisObj.transform.localPosition = Vector3.zero; axisObj.SetActive(xAxis.show && xAxis.axisLabel.show); ChartHelper.HideAllObject(axisObj); - var labelColor = xAxis.axisLabel.color == Color.clear ? + var labelColor = ChartHelper.IsClearColor(xAxis.axisLabel.color) ? (Color)m_ThemeInfo.axisTextColor : xAxis.axisLabel.color; - int splitNumber = xAxis.GetSplitNumber(coordinateWidth, m_DataZoom); + int splitNumber = xAxis.GetSplitNumber(m_CoordinateWidth, m_DataZoom); float totalWidth = 0; for (int i = 0; i < splitNumber; i++) { - float labelWidth = xAxis.GetScaleWidth(coordinateWidth, i, m_DataZoom); + float labelWidth = xAxis.GetScaleWidth(m_CoordinateWidth, i, m_DataZoom); bool inside = xAxis.axisLabel.inside; Text txt = ChartHelper.AddTextObject(ChartCached.GetXAxisName(xAxisIndex, i), axisObj.transform, m_ThemeInfo.font, labelColor, TextAnchor.MiddleCenter, new Vector2(0, 1), @@ -641,7 +645,7 @@ namespace XCharts i, xAxisIndex, xAxis); totalWidth += labelWidth; var isPercentStack = m_Series.IsPercentStack(SerieType.Bar); - txt.text = xAxis.GetLabelName(coordinateWidth, i, xAxis.runtimeMinValue, xAxis.runtimeMaxValue, m_DataZoom, + txt.text = xAxis.GetLabelName(m_CoordinateWidth, i, xAxis.runtimeMinValue, xAxis.runtimeMaxValue, m_DataZoom, isPercentStack); txt.gameObject.SetActive(xAxis.show && (xAxis.axisLabel.interval == 0 || i % (xAxis.axisLabel.interval + 1) == 0)); @@ -649,12 +653,12 @@ namespace XCharts } if (xAxis.axisName.show) { - var color = xAxis.axisName.color == Color.clear ? (Color)m_ThemeInfo.axisTextColor : + var color = ChartHelper.IsClearColor(xAxis.axisName.color) ? (Color)m_ThemeInfo.axisTextColor : xAxis.axisName.color; var fontSize = xAxis.axisName.fontSize; var offset = xAxis.axisName.offset; Text axisName = null; - var zeroPos = new Vector3(coordinateX, coordinateY + m_YAxises[xAxisIndex].runtimeZeroYOffset); + var zeroPos = new Vector3(m_CoordinateX, m_CoordinateY + m_YAxises[xAxisIndex].runtimeZeroYOffset); switch (xAxis.axisName.location) { case AxisName.Location.Start: @@ -663,7 +667,7 @@ namespace XCharts new Vector2(1, 0.5f), new Vector2(1, 0.5f), new Vector2(100, 20), fontSize, xAxis.axisName.rotate, xAxis.axisName.fontStyle); axisName.transform.localPosition = xAxisIndex > 0 ? - new Vector2(zeroPos.x - offset.x, coordinateY + coordinateHeight + offset.y) : + new Vector2(zeroPos.x - offset.x, m_CoordinateY + m_CoordinateHeight + offset.y) : new Vector2(zeroPos.x - offset.x, zeroPos.y + offset.y); break; case AxisName.Location.Middle: @@ -672,8 +676,8 @@ namespace XCharts new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(100, 20), fontSize, xAxis.axisName.rotate, xAxis.axisName.fontStyle); axisName.transform.localPosition = xAxisIndex > 0 ? - new Vector2(coordinateX + coordinateWidth / 2 + offset.x, coordinateY + coordinateHeight - offset.y) : - new Vector2(coordinateX + coordinateWidth / 2 + offset.x, coordinateY - offset.y); + new Vector2(m_CoordinateX + m_CoordinateWidth / 2 + offset.x, m_CoordinateY + m_CoordinateHeight - offset.y) : + new Vector2(m_CoordinateX + m_CoordinateWidth / 2 + offset.x, m_CoordinateY - offset.y); break; case AxisName.Location.End: axisName = ChartHelper.AddTextObject(s_DefaultAxisName, axisObj.transform, @@ -681,8 +685,8 @@ namespace XCharts new Vector2(0, 0.5f), new Vector2(0, 0.5f), new Vector2(100, 20), fontSize, xAxis.axisName.rotate, xAxis.axisName.fontStyle); axisName.transform.localPosition = xAxisIndex > 0 ? - new Vector2(coordinateX + coordinateWidth + offset.x, coordinateY + coordinateHeight + offset.y) : - new Vector2(coordinateX + coordinateWidth + offset.x, zeroPos.y + offset.y); + new Vector2(m_CoordinateX + m_CoordinateWidth + offset.x, m_CoordinateY + m_CoordinateHeight + offset.y) : + new Vector2(m_CoordinateX + m_CoordinateWidth + offset.x, zeroPos.y + offset.y); break; } axisName.text = xAxis.axisName.name; @@ -727,7 +731,7 @@ namespace XCharts private Vector3 GetLabelYPosition(float scaleWid, int i, int yAxisIndex, YAxis yAxis) { - var startX = yAxisIndex == 0 ? coordinateX : coordinateX + coordinateWidth; + var startX = yAxisIndex == 0 ? m_CoordinateX : m_CoordinateX + m_CoordinateWidth; var posX = 0f; var inside = yAxis.axisLabel.inside; if ((inside && yAxisIndex == 0) || (!inside && yAxisIndex == 1)) @@ -738,13 +742,13 @@ namespace XCharts { posX = startX - yAxis.axisLabel.margin; } - return new Vector3(posX, coordinateY + scaleWid, 0); + return new Vector3(posX, m_CoordinateY + scaleWid, 0); } private Vector3 GetLabelXPosition(float scaleWid, int i, int xAxisIndex, XAxis xAxis) { - var startY = coordinateY + (xAxis.axisLabel.onZero ? m_YAxises[xAxisIndex].runtimeZeroYOffset : 0); - if (xAxisIndex > 0) startY += coordinateHeight; + var startY = m_CoordinateY + (xAxis.axisLabel.onZero ? m_YAxises[xAxisIndex].runtimeZeroYOffset : 0); + if (xAxisIndex > 0) startY += m_CoordinateHeight; var posY = 0f; var inside = xAxis.axisLabel.inside; if ((inside && xAxisIndex == 0) || (!inside && xAxisIndex == 1)) @@ -755,7 +759,7 @@ namespace XCharts { posY = startY - xAxis.axisLabel.margin - xAxis.axisLabel.fontSize / 2; } - return new Vector3(coordinateX + scaleWid, posY); + return new Vector3(m_CoordinateX + scaleWid, posY); } private void CheckMinMaxValue() @@ -813,14 +817,14 @@ namespace XCharts if (axis is XAxis && axis.IsValue()) { axis.runtimeZeroXOffset = axis.runtimeMinValue > 0 ? 0 : - axis.runtimeMaxValue < 0 ? this.coordinateWidth : - Mathf.Abs(axis.runtimeMinValue) * (this.coordinateWidth / (Mathf.Abs(axis.runtimeMinValue) + Mathf.Abs(axis.runtimeMaxValue))); + axis.runtimeMaxValue < 0 ? this.m_CoordinateWidth : + Mathf.Abs(axis.runtimeMinValue) * (this.m_CoordinateWidth / (Mathf.Abs(axis.runtimeMinValue) + Mathf.Abs(axis.runtimeMaxValue))); } if (axis is YAxis && axis.IsValue()) { axis.runtimeZeroYOffset = axis.runtimeMinValue > 0 ? 0 : - axis.runtimeMaxValue < 0 ? coordinateHeight : - Mathf.Abs(axis.runtimeMinValue) * (coordinateHeight / (Mathf.Abs(axis.runtimeMinValue) + Mathf.Abs(axis.runtimeMaxValue))); + axis.runtimeMaxValue < 0 ? m_CoordinateHeight : + Mathf.Abs(axis.runtimeMinValue) * (m_CoordinateHeight / (Mathf.Abs(axis.runtimeMinValue) + Mathf.Abs(axis.runtimeMaxValue))); } } if (updateChart) @@ -838,13 +842,14 @@ namespace XCharts protected void UpdateAxisLabelText(Axis axis) { - float coordinateWidth = axis is XAxis ? this.coordinateWidth : coordinateHeight; + float m_CoordinateWidth = axis is XAxis ? this.m_CoordinateWidth : m_CoordinateHeight; var isPercentStack = m_Series.IsPercentStack(SerieType.Bar); - axis.UpdateLabelText(coordinateWidth, m_DataZoom, isPercentStack, 500); + axis.UpdateLabelText(m_CoordinateWidth, m_DataZoom, isPercentStack, 500); } protected virtual void OnCoordinateChanged() { + UpdateCoordinate(); m_XAxisesDirty = true; m_YAxisesDirty = true; } @@ -852,8 +857,7 @@ namespace XCharts protected override void OnSizeChanged() { base.OnSizeChanged(); - m_XAxisesDirty = true; - m_YAxisesDirty = true; + OnCoordinateChanged(); } private void DrawCoordinate(VertexHelper vh) @@ -891,12 +895,12 @@ namespace XCharts private void DrawGrid(VertexHelper vh) { - if (m_Grid.show && m_Grid.backgroundColor != Color.clear) + if (m_Grid.show && !ChartHelper.IsClearColor(m_Grid.backgroundColor)) { - var p1 = new Vector2(coordinateX, coordinateY); - var p2 = new Vector2(coordinateX, coordinateY + coordinateHeight); - var p3 = new Vector2(coordinateX + coordinateWidth, coordinateY + coordinateHeight); - var p4 = new Vector2(coordinateX + coordinateWidth, coordinateY); + var p1 = new Vector2(m_CoordinateX, m_CoordinateY); + var p2 = new Vector2(m_CoordinateX, m_CoordinateY + m_CoordinateHeight); + var p3 = new Vector2(m_CoordinateX + m_CoordinateWidth, m_CoordinateY + m_CoordinateHeight); + var p4 = new Vector2(m_CoordinateX + m_CoordinateWidth, m_CoordinateY); ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, m_Grid.backgroundColor); } } @@ -905,13 +909,13 @@ namespace XCharts { if (yAxis.NeedShowSplit()) { - var size = yAxis.GetScaleNumber(coordinateWidth, m_DataZoom); - var totalWidth = coordinateY; + var size = yAxis.GetScaleNumber(m_CoordinateWidth, m_DataZoom); + var totalWidth = m_CoordinateY; var xAxis = m_XAxises[yAxisIndex]; - var zeroPos = new Vector3(coordinateX + xAxis.runtimeZeroXOffset, coordinateY + yAxis.runtimeZeroYOffset); + var zeroPos = new Vector3(m_CoordinateX + xAxis.runtimeZeroXOffset, m_CoordinateY + yAxis.runtimeZeroYOffset); for (int i = 0; i < size; i++) { - var scaleWidth = yAxis.GetScaleWidth(coordinateHeight, i, m_DataZoom); + var scaleWidth = yAxis.GetScaleWidth(m_CoordinateHeight, i, m_DataZoom); float pY = totalWidth; if (yAxis.boundaryGap && yAxis.axisTick.alignWithLabel) { @@ -919,10 +923,10 @@ namespace XCharts } if (yAxis.splitArea.show && i < size - 1) { - ChartDrawer.DrawPolygon(vh, new Vector2(coordinateX, pY), - new Vector2(coordinateX + coordinateWidth, pY), - new Vector2(coordinateX + coordinateWidth, pY + scaleWidth), - new Vector2(coordinateX, pY + scaleWidth), + ChartDrawer.DrawPolygon(vh, new Vector2(m_CoordinateX, pY), + new Vector2(m_CoordinateX + m_CoordinateWidth, pY), + new Vector2(m_CoordinateX + m_CoordinateWidth, pY + scaleWidth), + new Vector2(m_CoordinateX, pY + scaleWidth), yAxis.splitArea.getColor(i)); } if (yAxis.splitLine.show) @@ -931,8 +935,8 @@ namespace XCharts { if (yAxis.splitLine.NeedShow(i)) { - DrawLineStyle(vh, yAxis.splitLine.lineStyle, new Vector3(coordinateX, pY), - new Vector3(coordinateX + coordinateWidth, pY), yAxis.splitLine.GetColor(m_ThemeInfo)); + DrawLineStyle(vh, yAxis.splitLine.lineStyle, new Vector3(m_CoordinateX, pY), + new Vector3(m_CoordinateX + m_CoordinateWidth, pY), yAxis.splitLine.GetColor(m_ThemeInfo)); } } } @@ -945,12 +949,12 @@ namespace XCharts { if (yAxis.NeedShowSplit()) { - var size = yAxis.GetScaleNumber(coordinateWidth, m_DataZoom); - var totalWidth = coordinateY; + var size = yAxis.GetScaleNumber(m_CoordinateWidth, m_DataZoom); + var totalWidth = m_CoordinateY; var xAxis = m_XAxises[yAxisIndex]; for (int i = 0; i < size; i++) { - var scaleWidth = yAxis.GetScaleWidth(coordinateHeight, i, m_DataZoom); + var scaleWidth = yAxis.GetScaleWidth(m_CoordinateHeight, i, m_DataZoom); float pX = 0; float pY = totalWidth; if (yAxis.boundaryGap && yAxis.axisTick.alignWithLabel) @@ -959,9 +963,9 @@ namespace XCharts } if (yAxis.axisTick.show) { - var startX = coordinateX + (yAxis.axisLine.onZero ? m_XAxises[yAxisIndex].runtimeZeroXOffset : 0); + var startX = m_CoordinateX + (yAxis.axisLine.onZero ? m_XAxises[yAxisIndex].runtimeZeroXOffset : 0); startX -= yAxis.axisLine.width; - if (yAxis.IsValue() && yAxisIndex > 0) startX += coordinateWidth; + if (yAxis.IsValue() && yAxisIndex > 0) startX += m_CoordinateWidth; bool inside = yAxis.axisTick.inside; if ((inside && yAxisIndex == 0) || (!inside && yAxisIndex == 1)) { @@ -979,13 +983,13 @@ namespace XCharts } if (yAxis.show && yAxis.axisLine.show) { - var lineX = coordinateX + (yAxis.axisLine.onZero ? m_XAxises[yAxisIndex].runtimeZeroXOffset : 0); - if (yAxis.IsValue() && yAxisIndex > 0) lineX += coordinateWidth; - var top = new Vector3(lineX, coordinateY + coordinateHeight + yAxis.axisLine.width); + var lineX = m_CoordinateX + (yAxis.axisLine.onZero ? m_XAxises[yAxisIndex].runtimeZeroXOffset : 0); + if (yAxis.IsValue() && yAxisIndex > 0) lineX += m_CoordinateWidth; + var top = new Vector3(lineX, m_CoordinateY + m_CoordinateHeight + yAxis.axisLine.width); if (yAxis.axisLine.symbol) { var axisLine = yAxis.axisLine; - ChartDrawer.DrawArrow(vh, new Vector3(lineX, coordinateX), top, axisLine.symbolWidth, axisLine.symbolHeight, + ChartDrawer.DrawArrow(vh, new Vector3(lineX, m_CoordinateX), top, axisLine.symbolWidth, axisLine.symbolHeight, axisLine.symbolOffset, axisLine.symbolDent, m_ThemeInfo.axisLineColor); } } @@ -995,13 +999,13 @@ namespace XCharts { if (xAxis.NeedShowSplit()) { - var size = xAxis.GetScaleNumber(coordinateWidth, m_DataZoom); - var totalWidth = coordinateX; + var size = xAxis.GetScaleNumber(m_CoordinateWidth, m_DataZoom); + var totalWidth = m_CoordinateX; var yAxis = m_YAxises[xAxisIndex]; - var zeroPos = new Vector3(coordinateX, coordinateY + yAxis.runtimeZeroYOffset); + var zeroPos = new Vector3(m_CoordinateX, m_CoordinateY + yAxis.runtimeZeroYOffset); for (int i = 0; i < size; i++) { - var scaleWidth = xAxis.GetScaleWidth(coordinateWidth, i, m_DataZoom); + var scaleWidth = xAxis.GetScaleWidth(m_CoordinateWidth, i, m_DataZoom); float pX = totalWidth; if (xAxis.boundaryGap && xAxis.axisTick.alignWithLabel) { @@ -1009,10 +1013,10 @@ namespace XCharts } if (xAxis.splitArea.show && i < size - 1) { - ChartDrawer.DrawPolygon(vh, new Vector2(pX, coordinateY), - new Vector2(pX, coordinateY + coordinateHeight), - new Vector2(pX + scaleWidth, coordinateY + coordinateHeight), - new Vector2(pX + scaleWidth, coordinateY), + ChartDrawer.DrawPolygon(vh, new Vector2(pX, m_CoordinateY), + new Vector2(pX, m_CoordinateY + m_CoordinateHeight), + new Vector2(pX + scaleWidth, m_CoordinateY + m_CoordinateHeight), + new Vector2(pX + scaleWidth, m_CoordinateY), xAxis.splitArea.getColor(i)); } if (xAxis.splitLine.show) @@ -1021,8 +1025,8 @@ namespace XCharts { if (xAxis.splitLine.NeedShow(i)) { - DrawLineStyle(vh, xAxis.splitLine.lineStyle, new Vector3(pX, coordinateY), - new Vector3(pX, coordinateY + coordinateHeight), xAxis.splitLine.GetColor(m_ThemeInfo)); + DrawLineStyle(vh, xAxis.splitLine.lineStyle, new Vector3(pX, m_CoordinateY), + new Vector3(pX, m_CoordinateY + m_CoordinateHeight), xAxis.splitLine.GetColor(m_ThemeInfo)); } } } @@ -1035,12 +1039,12 @@ namespace XCharts { if (xAxis.NeedShowSplit()) { - var size = xAxis.GetScaleNumber(coordinateWidth, m_DataZoom); - var totalWidth = coordinateX; + var size = xAxis.GetScaleNumber(m_CoordinateWidth, m_DataZoom); + var totalWidth = m_CoordinateX; var yAxis = m_YAxises[xAxisIndex]; for (int i = 0; i < size; i++) { - var scaleWidth = xAxis.GetScaleWidth(coordinateWidth, i, m_DataZoom); + var scaleWidth = xAxis.GetScaleWidth(m_CoordinateWidth, i, m_DataZoom); float pX = totalWidth; float pY = 0; if (xAxis.boundaryGap && xAxis.axisTick.alignWithLabel) @@ -1049,9 +1053,9 @@ namespace XCharts } if (xAxis.axisTick.show) { - var startY = coordinateY + (xAxis.axisLine.onZero ? m_YAxises[xAxisIndex].runtimeZeroYOffset : 0); + var startY = m_CoordinateY + (xAxis.axisLine.onZero ? m_YAxises[xAxisIndex].runtimeZeroYOffset : 0); startY -= xAxis.axisLine.width; - if (xAxis.IsValue() && xAxisIndex > 0) startY += coordinateHeight; + if (xAxis.IsValue() && xAxisIndex > 0) startY += m_CoordinateHeight; bool inside = xAxis.axisTick.inside; if ((inside && xAxisIndex == 0) || (!inside && xAxisIndex == 1)) { @@ -1069,13 +1073,13 @@ namespace XCharts } if (xAxis.show && xAxis.axisLine.show) { - var lineY = coordinateY + (xAxis.axisLine.onZero ? m_YAxises[xAxisIndex].runtimeZeroYOffset : 0); - if (xAxis.IsValue() && xAxisIndex > 0) lineY += coordinateHeight; - var top = new Vector3(coordinateX + coordinateWidth + xAxis.axisLine.width, lineY); + var lineY = m_CoordinateY + (xAxis.axisLine.onZero ? m_YAxises[xAxisIndex].runtimeZeroYOffset : 0); + if (xAxis.IsValue() && xAxisIndex > 0) lineY += m_CoordinateHeight; + var top = new Vector3(m_CoordinateX + m_CoordinateWidth + xAxis.axisLine.width, lineY); if (xAxis.axisLine.symbol) { var axisLine = xAxis.axisLine; - ChartDrawer.DrawArrow(vh, new Vector3(coordinateX, lineY), top, axisLine.symbolWidth, axisLine.symbolHeight, + ChartDrawer.DrawArrow(vh, new Vector3(m_CoordinateX, lineY), top, axisLine.symbolWidth, axisLine.symbolHeight, axisLine.symbolOffset, axisLine.symbolDent, m_ThemeInfo.axisLineColor); } } @@ -1085,10 +1089,10 @@ namespace XCharts { if (xAxis.show && xAxis.axisLine.show) { - var lineY = coordinateY + (xAxis.axisLine.onZero ? m_YAxises[xAxisIndex].runtimeZeroYOffset : 0); - if (xAxis.IsValue() && xAxisIndex > 0) lineY += coordinateHeight; - var left = new Vector3(coordinateX - xAxis.axisLine.width, lineY); - var top = new Vector3(coordinateX + coordinateWidth + xAxis.axisLine.width, lineY); + var lineY = m_CoordinateY + (xAxis.axisLine.onZero ? m_YAxises[xAxisIndex].runtimeZeroYOffset : 0); + if (xAxis.IsValue() && xAxisIndex > 0) lineY += m_CoordinateHeight; + var left = new Vector3(m_CoordinateX - xAxis.axisLine.width, lineY); + var top = new Vector3(m_CoordinateX + m_CoordinateWidth + xAxis.axisLine.width, lineY); ChartDrawer.DrawLine(vh, left, top, xAxis.axisLine.width, m_ThemeInfo.axisLineColor); } } @@ -1097,10 +1101,10 @@ namespace XCharts { if (yAxis.show && yAxis.axisLine.show) { - var lineX = coordinateX + (yAxis.axisLine.onZero ? m_XAxises[yAxisIndex].runtimeZeroXOffset : 0); - if (yAxis.IsValue() && yAxisIndex > 0) lineX += coordinateWidth; - var top = new Vector3(lineX, coordinateY + coordinateHeight + yAxis.axisLine.width); - ChartDrawer.DrawLine(vh, new Vector3(lineX, coordinateY - yAxis.axisLine.width), + var lineX = m_CoordinateX + (yAxis.axisLine.onZero ? m_XAxises[yAxisIndex].runtimeZeroXOffset : 0); + if (yAxis.IsValue() && yAxisIndex > 0) lineX += m_CoordinateWidth; + var top = new Vector3(lineX, m_CoordinateY + m_CoordinateHeight + yAxis.axisLine.width); + ChartDrawer.DrawLine(vh, new Vector3(lineX, m_CoordinateY - yAxis.axisLine.width), top, yAxis.axisLine.width, m_ThemeInfo.axisLineColor); } } @@ -1109,10 +1113,10 @@ namespace XCharts { if (!m_DataZoom.enable || !m_DataZoom.supportSlider) return; var hig = m_DataZoom.GetHeight(grid.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 p1 = new Vector3(m_CoordinateX, m_ChartY + m_DataZoom.bottom); + var p2 = new Vector3(m_CoordinateX, m_ChartY + m_DataZoom.bottom + hig); + var p3 = new Vector3(m_CoordinateX + m_CoordinateWidth, m_ChartY + m_DataZoom.bottom + hig); + var p4 = new Vector3(m_CoordinateX + m_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); @@ -1123,7 +1127,7 @@ namespace XCharts Serie serie = m_Series.list[0]; Axis axis = yAxises[0]; var showData = serie.GetDataList(null); - float scaleWid = coordinateWidth / (showData.Count - 1); + float scaleWid = m_CoordinateWidth / (showData.Count - 1); Vector3 lp = Vector3.zero; Vector3 np = Vector3.zero; float minValue = 0; @@ -1134,7 +1138,7 @@ namespace XCharts int rate = 1; var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist; var maxCount = showData.Count; - if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (coordinateWidth / sampleDist)); + if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (m_CoordinateWidth / sampleDist)); if (rate < 1) rate = 1; var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage : DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate); @@ -1143,7 +1147,7 @@ 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 pX = m_CoordinateX + i * scaleWid; // float dataHig = (axis.runtimeMaxValue - axis.runtimeMinValue) == 0 ? 0 : // (value - axis.runtimeMinValue) / (axis.runtimeMaxValue - axis.runtimeMinValue) * hig; float dataHig = (maxValue - minValue) == 0 ? 0 : @@ -1170,8 +1174,8 @@ namespace XCharts switch (m_DataZoom.rangeMode) { case DataZoom.RangeMode.Percent: - var start = coordinateX + coordinateWidth * m_DataZoom.start / 100; - var end = coordinateX + coordinateWidth * m_DataZoom.end / 100; + var start = m_CoordinateX + m_CoordinateWidth * m_DataZoom.start / 100; + var end = m_CoordinateX + m_CoordinateWidth * m_DataZoom.end / 100; 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); @@ -1193,35 +1197,35 @@ namespace XCharts var xAxis = m_XAxises[i]; var yAxis = m_YAxises[i]; if (!xAxis.show) continue; - float splitWidth = xAxis.GetDataWidth(coordinateWidth, dataCount, m_DataZoom); + float splitWidth = xAxis.GetDataWidth(m_CoordinateWidth, dataCount, m_DataZoom); switch (m_Tooltip.type) { case Tooltip.Type.Corss: case Tooltip.Type.Line: - float pX = coordinateX + m_Tooltip.runtimeXValues[i] * splitWidth + float pX = m_CoordinateX + m_Tooltip.runtimeXValues[i] * splitWidth + (xAxis.boundaryGap ? splitWidth / 2 : 0); if (xAxis.IsValue()) pX = m_Tooltip.runtimePointerPos.x; - Vector2 sp = new Vector2(pX, coordinateY); - Vector2 ep = new Vector2(pX, coordinateY + coordinateHeight); + Vector2 sp = new Vector2(pX, m_CoordinateY); + Vector2 ep = new Vector2(pX, m_CoordinateY + m_CoordinateHeight); var lineColor = TooltipHelper.GetLineColor(tooltip, m_ThemeInfo); DrawLineStyle(vh, m_Tooltip.lineStyle, sp, ep, lineColor); if (m_Tooltip.type == Tooltip.Type.Corss) { - sp = new Vector2(coordinateX, m_Tooltip.runtimePointerPos.y); - ep = new Vector2(coordinateX + coordinateWidth, m_Tooltip.runtimePointerPos.y); + sp = new Vector2(m_CoordinateX, m_Tooltip.runtimePointerPos.y); + ep = new Vector2(m_CoordinateX + m_CoordinateWidth, m_Tooltip.runtimePointerPos.y); DrawLineStyle(vh, m_Tooltip.lineStyle, sp, ep, lineColor); } break; case Tooltip.Type.Shadow: float tooltipSplitWid = splitWidth < 1 ? 1 : splitWidth; - pX = coordinateX + splitWidth * m_Tooltip.runtimeXValues[i] - + pX = m_CoordinateX + splitWidth * m_Tooltip.runtimeXValues[i] - (xAxis.boundaryGap ? 0 : splitWidth / 2); if (xAxis.IsValue()) pX = m_Tooltip.runtimeXValues[i]; - float pY = coordinateY + coordinateHeight; - Vector3 p1 = new Vector3(pX, coordinateY); + float pY = m_CoordinateY + m_CoordinateHeight; + Vector3 p1 = new Vector3(pX, m_CoordinateY); Vector3 p2 = new Vector3(pX, pY); Vector3 p3 = new Vector3(pX + tooltipSplitWid, pY); - Vector3 p4 = new Vector3(pX + tooltipSplitWid, coordinateY); + Vector3 p4 = new Vector3(pX + tooltipSplitWid, m_CoordinateY); ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, m_ThemeInfo.tooltipFlagAreaColor); break; } @@ -1238,30 +1242,30 @@ namespace XCharts var yAxis = m_YAxises[i]; var xAxis = m_XAxises[i]; if (!yAxis.show) continue; - float splitWidth = yAxis.GetDataWidth(coordinateHeight, dataCount, m_DataZoom); + float splitWidth = yAxis.GetDataWidth(m_CoordinateHeight, dataCount, m_DataZoom); switch (m_Tooltip.type) { case Tooltip.Type.Corss: case Tooltip.Type.Line: - float pY = coordinateY + m_Tooltip.runtimeYValues[i] * splitWidth + (yAxis.boundaryGap ? splitWidth / 2 : 0); - Vector2 sp = new Vector2(coordinateX, pY); - Vector2 ep = new Vector2(coordinateX + coordinateWidth, pY); + float pY = m_CoordinateY + m_Tooltip.runtimeYValues[i] * splitWidth + (yAxis.boundaryGap ? splitWidth / 2 : 0); + Vector2 sp = new Vector2(m_CoordinateX, pY); + Vector2 ep = new Vector2(m_CoordinateX + m_CoordinateWidth, pY); var lineColor = TooltipHelper.GetLineColor(tooltip, m_ThemeInfo); DrawLineStyle(vh, m_Tooltip.lineStyle, sp, ep, lineColor); if (m_Tooltip.type == Tooltip.Type.Corss) { - sp = new Vector2(coordinateX, m_Tooltip.runtimePointerPos.y); - ep = new Vector2(coordinateX + coordinateWidth, m_Tooltip.runtimePointerPos.y); + sp = new Vector2(m_CoordinateX, m_Tooltip.runtimePointerPos.y); + ep = new Vector2(m_CoordinateX + m_CoordinateWidth, m_Tooltip.runtimePointerPos.y); DrawLineStyle(vh, m_Tooltip.lineStyle, sp, ep, lineColor); } break; case Tooltip.Type.Shadow: float tooltipSplitWid = splitWidth < 1 ? 1 : splitWidth; - float pX = coordinateX + coordinateWidth; - pY = coordinateY + splitWidth * m_Tooltip.runtimeYValues[i] - + float pX = m_CoordinateX + m_CoordinateWidth; + pY = m_CoordinateY + splitWidth * m_Tooltip.runtimeYValues[i] - (yAxis.boundaryGap ? 0 : splitWidth / 2); - Vector3 p1 = new Vector3(coordinateX, pY); - Vector3 p2 = new Vector3(coordinateX, pY + tooltipSplitWid); + Vector3 p1 = new Vector3(m_CoordinateX, pY); + Vector3 p2 = new Vector3(m_CoordinateX, pY + tooltipSplitWid); Vector3 p3 = new Vector3(pX, pY + tooltipSplitWid); Vector3 p4 = new Vector3(pX, pY); ChartDrawer.DrawPolygon(vh, p1, p2, p3, p4, m_ThemeInfo.tooltipFlagAreaColor); @@ -1328,9 +1332,9 @@ namespace XCharts m_DataZoom.SetLabelActive(false); return; } - if (m_DataZoom.IsInSelectedZoom(local, coordinateX, chartY, coordinateWidth) - || m_DataZoom.IsInStartZoom(local, coordinateX, chartY, coordinateWidth) - || m_DataZoom.IsInEndZoom(local, coordinateX, chartY, coordinateWidth)) + if (m_DataZoom.IsInSelectedZoom(local, m_CoordinateX, chartY, m_CoordinateWidth) + || m_DataZoom.IsInStartZoom(local, m_CoordinateX, chartY, m_CoordinateWidth) + || m_DataZoom.IsInEndZoom(local, m_CoordinateX, chartY, m_CoordinateWidth)) { m_DataZoom.SetLabelActive(true); RefreshDataZoomLabel(); @@ -1358,8 +1362,8 @@ namespace XCharts } InitAxisX(); } - var start = coordinateX + coordinateWidth * m_DataZoom.start / 100; - var end = coordinateX + coordinateWidth * m_DataZoom.end / 100; + var start = m_CoordinateX + m_CoordinateWidth * m_DataZoom.start / 100; + var end = m_CoordinateX + m_CoordinateWidth * m_DataZoom.end / 100; var hig = m_DataZoom.GetHeight(grid.bottom); 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)); @@ -1378,6 +1382,7 @@ namespace XCharts for (int j = 0; j < serie.data.Count; j++) { var serieData = serie.data[j]; + if (serieData.labelObject == null) continue; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData, serieData.highlighted); serieData.index = j; if ((serieLabel.show || serieData.iconStyle.show)) @@ -1406,12 +1411,12 @@ namespace XCharts if (isYAxis) { var xAxis = m_XAxises[serie.axisIndex]; - zeroPos = new Vector3(coordinateX + xAxis.runtimeZeroXOffset, coordinateY); + zeroPos = new Vector3(m_CoordinateX + xAxis.runtimeZeroXOffset, m_CoordinateY); } else { var yAxis = m_YAxises[serie.axisIndex]; - zeroPos = new Vector3(coordinateX, coordinateY + yAxis.runtimeZeroYOffset); + zeroPos = new Vector3(m_CoordinateX, m_CoordinateY + yAxis.runtimeZeroYOffset); } } } @@ -1448,18 +1453,20 @@ namespace XCharts for (int i = 0; i < m_Series.Count; i++) { var serie = m_Series.GetSerie(i); + if (serie.IsPerformanceMode()) continue; var total = serie.yTotal; var isPercentStack = m_Series.IsPercentStack(serie.stack, SerieType.Bar); for (int j = 0; j < serie.data.Count; j++) { if (j >= serie.dataPoints.Count) break; var serieData = serie.data[j]; + if (serieData.labelObject == null) continue; var pos = serie.dataPoints[j]; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); var dimension = 1; var isIgnore = serie.IsIgnoreIndex(j, 1); - serieData.SetGameObjectPosition(serieData.labelPosition); - serieData.UpdateIcon(); + serieData.labelObject.SetPosition(serieData.labelPosition); + serieData.labelObject.UpdateIcon(serieData.iconStyle); if (serie.show && serieLabel.show && serieData.canShowLabel && !isIgnore) { float value = 0f; @@ -1485,8 +1492,8 @@ namespace XCharts } serieData.SetLabelActive(value != 0 && serieData.labelPosition != Vector3.zero); var invert = serie.type == SerieType.Line && SerieHelper.IsDownPoint(serie, j) && !serie.areaStyle.show; - serieData.SetLabelPosition(invert ? -serieLabel.offset : serieLabel.offset); - if (serieData.SetLabelText(content)) RefreshChart(); + serieData.labelObject.SetLabelPosition(invert ? -serieLabel.offset : serieLabel.offset); + if (serieData.labelObject.SetText(content)) RefreshChart(); } else { @@ -1514,15 +1521,15 @@ namespace XCharts } if (m_DataZoom.supportSlider) { - if (m_DataZoom.IsInStartZoom(pos, coordinateX, chartY, coordinateWidth)) + if (m_DataZoom.IsInStartZoom(pos, m_CoordinateX, chartY, m_CoordinateWidth)) { m_DataZoomStartDrag = true; } - else if (m_DataZoom.IsInEndZoom(pos, coordinateX, chartY, coordinateWidth)) + else if (m_DataZoom.IsInEndZoom(pos, m_CoordinateX, chartY, m_CoordinateWidth)) { m_DataZoomEndDrag = true; } - else if (m_DataZoom.IsInSelectedZoom(pos, coordinateX, chartY, coordinateWidth)) + else if (m_DataZoom.IsInSelectedZoom(pos, m_CoordinateX, chartY, m_CoordinateWidth)) { m_DataZoomDrag = true; } @@ -1534,7 +1541,7 @@ namespace XCharts { if (Input.touchCount > 1) return; float deltaX = eventData.delta.x; - float deltaPercent = deltaX / coordinateWidth * 100; + float deltaPercent = deltaX / m_CoordinateWidth * 100; OnDragInside(deltaPercent); OnDragSlider(deltaPercent); OnDragVisualMap(); @@ -1648,30 +1655,30 @@ namespace XCharts return; } - if (m_DataZoom.IsInStartZoom(localPos, coordinateX, chartY, coordinateWidth) || - m_DataZoom.IsInEndZoom(localPos, coordinateX, chartY, coordinateWidth)) + if (m_DataZoom.IsInStartZoom(localPos, m_CoordinateX, chartY, m_CoordinateWidth) || + m_DataZoom.IsInEndZoom(localPos, m_CoordinateX, chartY, m_CoordinateWidth)) { return; } - if (m_DataZoom.IsInZoom(localPos, coordinateX, chartY, coordinateWidth) - && !m_DataZoom.IsInSelectedZoom(localPos, coordinateX, chartY, coordinateWidth)) + if (m_DataZoom.IsInZoom(localPos, m_CoordinateX, chartY, m_CoordinateWidth) + && !m_DataZoom.IsInSelectedZoom(localPos, m_CoordinateX, chartY, m_CoordinateWidth)) { var pointerX = localPos.x; - var selectWidth = coordinateWidth * (m_DataZoom.end - m_DataZoom.start) / 100; + var selectWidth = m_CoordinateWidth * (m_DataZoom.end - m_DataZoom.start) / 100; var startX = pointerX - selectWidth / 2; var endX = pointerX + selectWidth / 2; - if (startX < coordinateX) + if (startX < m_CoordinateX) { - startX = coordinateX; - endX = coordinateX + selectWidth; + startX = m_CoordinateX; + endX = m_CoordinateX + selectWidth; } - else if (endX > coordinateX + coordinateWidth) + else if (endX > m_CoordinateX + m_CoordinateWidth) { - endX = coordinateX + coordinateWidth; - startX = coordinateX + coordinateWidth - selectWidth; + endX = m_CoordinateX + m_CoordinateWidth; + startX = m_CoordinateX + m_CoordinateWidth - selectWidth; } - m_DataZoom.start = (startX - coordinateX) / coordinateWidth * 100; - m_DataZoom.end = (endX - coordinateX) / coordinateWidth * 100; + m_DataZoom.start = (startX - m_CoordinateX) / m_CoordinateWidth * 100; + m_DataZoom.end = (endX - m_CoordinateX) / m_CoordinateWidth * 100; RefreshDataZoomLabel(); RefreshChart(); } @@ -1687,7 +1694,7 @@ namespace XCharts { return; } - if (!IsInCooridate(pos) && !m_DataZoom.IsInSelectedZoom(pos, coordinateX, chartY, coordinateWidth)) + if (!IsInCooridate(pos) && !m_DataZoom.IsInSelectedZoom(pos, m_CoordinateX, chartY, m_CoordinateWidth)) { return; } @@ -1696,7 +1703,7 @@ namespace XCharts private void ScaleDataZoom(float delta) { - float deltaPercent = Mathf.Abs(delta / coordinateWidth * 100); + float deltaPercent = Mathf.Abs(delta / m_CoordinateWidth * 100); if (delta > 0) { if (m_DataZoom.end <= m_DataZoom.start) return; @@ -1735,10 +1742,10 @@ namespace XCharts protected void CheckClipAndDrawPolygon(VertexHelper vh, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, Color32 startColor, Color32 toColor, bool clip) { - p1 = ClampInChart(p1); - p2 = ClampInChart(p2); - p3 = ClampInChart(p3); - p4 = ClampInChart(p4); + ClampInChart(ref p1); + ClampInChart(ref p2); + ClampInChart(ref p3); + ClampInChart(ref p4); if (clip) { p1 = ClampInCoordinate(p1); @@ -1753,10 +1760,10 @@ namespace XCharts protected void CheckClipAndDrawPolygon(VertexHelper vh, ref Vector3 p1, ref Vector3 p2, ref Vector3 p3, ref Vector3 p4, Color32 startColor, Color32 toColor, bool clip) { - p1 = ClampInChart(p1); - p2 = ClampInChart(p2); - p3 = ClampInChart(p3); - p4 = ClampInChart(p4); + ClampInChart(ref p1); + ClampInChart(ref p2); + ClampInChart(ref p3); + ClampInChart(ref p4); if (clip) { p1 = ClampInCoordinate(p1); @@ -1801,21 +1808,21 @@ namespace XCharts protected void CheckClipAndDrawZebraLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, float zebraWidth, float zebraGap, Color32 color, bool clip) { - p1 = ClampInChart(p1); - p2 = ClampInChart(p2); + ClampInChart(ref p1); + ClampInChart(ref p2); ChartDrawer.DrawZebraLine(vh, p1, p2, size, zebraWidth, zebraGap, color); } protected Color GetXLerpColor(Color areaColor, Color areaToColor, Vector3 pos) { if (areaColor == areaToColor) return areaColor; - return Color.Lerp(areaToColor, areaColor, (pos.y - coordinateY) / coordinateHeight); + return Color.Lerp(areaToColor, areaColor, (pos.y - m_CoordinateY) / m_CoordinateHeight); } protected Color GetYLerpColor(Color areaColor, Color areaToColor, Vector3 pos) { if (areaColor == areaToColor) return areaColor; - return Color.Lerp(areaToColor, areaColor, (pos.x - coordinateX) / coordinateWidth); + return Color.Lerp(areaToColor, areaColor, (pos.x - m_CoordinateX) / m_CoordinateWidth); } } } diff --git a/Runtime/Internal/CoordinateChart_DrawBar.cs b/Runtime/Internal/CoordinateChart_DrawBar.cs index 7ba26ee7..f2383d83 100644 --- a/Runtime/Internal/CoordinateChart_DrawBar.cs +++ b/Runtime/Internal/CoordinateChart_DrawBar.cs @@ -24,7 +24,7 @@ namespace XCharts if (!yAxis.show) yAxis = m_YAxises[(serie.axisIndex + 1) % m_YAxises.Count]; var showData = serie.GetDataList(m_DataZoom); - float categoryWidth = yAxis.GetDataWidth(coordinateHeight, showData.Count, m_DataZoom); + float categoryWidth = yAxis.GetDataWidth(m_CoordinateHeight, showData.Count, m_DataZoom); float barGap = GetBarGap(); float totalBarWidth = GetBarTotalWidth(categoryWidth, barGap); float barWidth = serie.GetBarWidth(categoryWidth); @@ -71,8 +71,8 @@ namespace XCharts float borderWidth = value == 0 ? 0 : itemStyle.runtimeBorderWidth; if (showData[i].IsDataChanged()) dataChanging = true; float axisLineWidth = (value < 0 ? -1 : 1) * yAxis.axisLine.width; - float pX = seriesHig[i] + coordinateX + xAxis.runtimeZeroXOffset + axisLineWidth; - float pY = coordinateY + i * categoryWidth; + float pX = seriesHig[i] + m_CoordinateX + xAxis.runtimeZeroXOffset + axisLineWidth; + float pY = m_CoordinateY + i * categoryWidth; if (!yAxis.boundaryGap) pY -= categoryWidth / 2; var barHig = 0f; @@ -80,7 +80,7 @@ namespace XCharts if (isPercentStack) { valueTotal = GetSameStackTotalValue(serie.stack, i); - barHig = valueTotal != 0 ? (value / valueTotal * coordinateWidth) : 0; + barHig = valueTotal != 0 ? (value / valueTotal * m_CoordinateWidth) : 0; seriesHig[i] += barHig; } else @@ -88,7 +88,7 @@ namespace XCharts valueTotal = xMaxValue - xMinValue; if (valueTotal != 0) barHig = (xMinValue > 0 ? value - xMinValue : value) - / valueTotal * coordinateWidth; + / valueTotal * m_CoordinateWidth; seriesHig[i] += barHig; } @@ -165,7 +165,7 @@ namespace XCharts var xAxis = m_XAxises[serie.axisIndex]; if (!xAxis.show) xAxis = m_XAxises[(serie.axisIndex + 1) % m_XAxises.Count]; - float categoryWidth = xAxis.GetDataWidth(coordinateWidth, showData.Count, m_DataZoom); + float categoryWidth = xAxis.GetDataWidth(m_CoordinateWidth, showData.Count, m_DataZoom); float barGap = GetBarGap(); float totalBarWidth = GetBarTotalWidth(categoryWidth, barGap); float barWidth = serie.GetBarWidth(categoryWidth); @@ -208,8 +208,8 @@ namespace XCharts float value = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse); float borderWidth = value == 0 ? 0 : itemStyle.runtimeBorderWidth; if (serieData.IsDataChanged()) dataChanging = true; - float pX = coordinateX + i * categoryWidth; - float zeroY = coordinateY + yAxis.runtimeZeroYOffset; + float pX = m_CoordinateX + i * categoryWidth; + float zeroY = m_CoordinateY + yAxis.runtimeZeroYOffset; if (!xAxis.boundaryGap) pX -= categoryWidth / 2; float axisLineWidth = (value < 0 ? -1 : 1) * xAxis.axisLine.width; float pY = seriesHig[i] + zeroY + axisLineWidth; @@ -219,7 +219,7 @@ namespace XCharts if (isPercentStack) { valueTotal = GetSameStackTotalValue(serie.stack, i); - barHig = valueTotal != 0 ? (value / valueTotal * coordinateHeight) : 0; + barHig = valueTotal != 0 ? (value / valueTotal * m_CoordinateHeight) : 0; seriesHig[i] += barHig; } else @@ -227,7 +227,7 @@ namespace XCharts valueTotal = yMaxValue - yMinValue; if (valueTotal != 0) barHig = (yMinValue > 0 ? value - yMinValue : value) - / valueTotal * coordinateHeight; + / valueTotal * m_CoordinateHeight; seriesHig[i] += barHig; } float currHig = CheckAnimation(serie, i, barHig); @@ -436,15 +436,15 @@ namespace XCharts bool highlight, float pX, float pY, float space, float barWidth, bool isYAxis) { Color color = SerieHelper.GetItemBackgroundColor(serie, serieData, m_ThemeInfo, colorIndex, highlight, false); - if (color == Color.clear) return; + if (ChartHelper.IsClearColor(color)) return; if (isYAxis) { var axis = m_YAxises[serie.axisIndex]; var axisWidth = axis.axisLine.width; - Vector3 plt = new Vector3(coordinateX + axisWidth, pY + space + barWidth); - Vector3 prt = new Vector3(coordinateX + axisWidth + coordinateWidth, pY + space + barWidth); - Vector3 prb = new Vector3(coordinateX + axisWidth + coordinateWidth, pY + space); - Vector3 plb = new Vector3(coordinateX + axisWidth, pY + space); + Vector3 plt = new Vector3(m_CoordinateX + axisWidth, pY + space + barWidth); + Vector3 prt = new Vector3(m_CoordinateX + axisWidth + m_CoordinateWidth, pY + space + barWidth); + Vector3 prb = new Vector3(m_CoordinateX + axisWidth + m_CoordinateWidth, pY + space); + Vector3 plb = new Vector3(m_CoordinateX + axisWidth, pY + space); if (serie.barType == BarType.Capsule) { var radius = barWidth / 2; @@ -480,10 +480,10 @@ namespace XCharts { var axis = m_XAxises[serie.axisIndex]; var axisWidth = axis.axisLine.width; - Vector3 plb = new Vector3(pX + space, coordinateY + axisWidth); - Vector3 plt = new Vector3(pX + space, coordinateY + coordinateHeight + axisWidth); - Vector3 prt = new Vector3(pX + space + barWidth, coordinateY + coordinateHeight + axisWidth); - Vector3 prb = new Vector3(pX + space + barWidth, coordinateY + axisWidth); + Vector3 plb = new Vector3(pX + space, m_CoordinateY + axisWidth); + Vector3 plt = new Vector3(pX + space, m_CoordinateY + m_CoordinateHeight + axisWidth); + Vector3 prt = new Vector3(pX + space + barWidth, m_CoordinateY + m_CoordinateHeight + axisWidth); + Vector3 prb = new Vector3(pX + space + barWidth, m_CoordinateY + axisWidth); if (serie.barType == BarType.Capsule) { var radius = barWidth / 2; diff --git a/Runtime/Internal/CoordinateChart_DrawHeatmap.cs b/Runtime/Internal/CoordinateChart_DrawHeatmap.cs index 18206655..08df943f 100644 --- a/Runtime/Internal/CoordinateChart_DrawHeatmap.cs +++ b/Runtime/Internal/CoordinateChart_DrawHeatmap.cs @@ -121,11 +121,11 @@ namespace XCharts var xAxis = m_XAxises[serie.axisIndex]; var xCount = xAxis.data.Count; var yCount = yAxis.data.Count; - var xWidth = coordinateWidth / xCount; - var yWidth = coordinateHeight / yCount; + var xWidth = m_CoordinateWidth / xCount; + var yWidth = m_CoordinateHeight / yCount; - var zeroX = coordinateX; - var zeroY = coordinateY; + var zeroX = m_CoordinateX; + var zeroY = m_CoordinateY; var dataList = serie.GetDataList(); var rangeMin = m_VisualMap.rangeMin; var rangeMax = m_VisualMap.rangeMax; @@ -175,7 +175,7 @@ namespace XCharts var rectWid = xWidth - 2 * borderWidth; var rectHig = yWidth - 2 * borderWidth; ChartDrawer.DrawPolygon(vh, pos, rectWid / 2, rectHig / 2, color); - if (borderWidth > 0 && borderColor != Color.clear) + if (borderWidth > 0 && !ChartHelper.IsClearColor(borderColor)) { ChartDrawer.DrawBorder(vh, pos, rectWid, rectHig, borderWidth, borderColor); } diff --git a/Runtime/Internal/CoordinateChart_DrawLine.cs b/Runtime/Internal/CoordinateChart_DrawLine.cs index ad83e1ee..633995a9 100644 --- a/Runtime/Internal/CoordinateChart_DrawLine.cs +++ b/Runtime/Internal/CoordinateChart_DrawLine.cs @@ -21,6 +21,7 @@ namespace XCharts for (int n = 0; n < m_Series.Count; n++) { var serie = m_Series.GetSerie(n); + if (serie.IsPerformanceMode()) continue; if (serie.type != SerieType.Line) continue; if (!serie.show || serie.symbol.type == SerieSymbolType.None) continue; var count = serie.dataPoints.Count; @@ -96,11 +97,11 @@ namespace XCharts Vector3 lp = Vector3.zero, np = Vector3.zero, llp = Vector3.zero, nnp = Vector3.zero; var yAxis = m_YAxises[serie.axisIndex]; var xAxis = m_XAxises[serie.axisIndex]; - var zeroPos = new Vector3(coordinateX, coordinateY + yAxis.runtimeZeroYOffset); + var zeroPos = new Vector3(m_CoordinateX, m_CoordinateY + yAxis.runtimeZeroYOffset); var isStack = m_Series.IsStack(serie.stack, SerieType.Line); if (!xAxis.show) xAxis = m_XAxises[(serie.axisIndex + 1) % m_XAxises.Count]; - float scaleWid = xAxis.GetDataWidth(coordinateWidth, showData.Count, m_DataZoom); - float startX = coordinateX + (xAxis.boundaryGap ? scaleWid / 2 : 0); + float scaleWid = xAxis.GetDataWidth(m_CoordinateWidth, showData.Count, m_DataZoom); + float startX = m_CoordinateX + (xAxis.boundaryGap ? scaleWid / 2 : 0); int maxCount = serie.maxShow > 0 ? (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) : showData.Count; @@ -114,7 +115,7 @@ namespace XCharts } int rate = 1; var sampleDist = serie.sampleDist; - if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (coordinateWidth / sampleDist)); + if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (m_CoordinateWidth / sampleDist)); if (rate < 1) rate = 1; var includeLastData = false; var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage : @@ -421,46 +422,46 @@ namespace XCharts if (xAxis.IsValue() || xAxis.IsLog()) { float xValue = i > showData.Count - 1 ? 0 : showData[i].GetData(0, xAxis.inverse); - float pX = coordinateX + xAxis.axisLine.width; - float pY = serieHig + coordinateY + xAxis.axisLine.width; + float pX = m_CoordinateX + xAxis.axisLine.width; + float pY = serieHig + m_CoordinateY + xAxis.axisLine.width; if (xAxis.IsLog()) { int minIndex = xAxis.runtimeMinLogIndex; float nowIndex = xAxis.GetLogValue(xValue); - xDataHig = (nowIndex - minIndex) / (xAxis.splitNumber - 1) * coordinateWidth; + xDataHig = (nowIndex - minIndex) / (xAxis.splitNumber - 1) * m_CoordinateWidth; } else { if ((xMaxValue - xMinValue) <= 0) xDataHig = 0; - else xDataHig = (xValue - xMinValue) / (xMaxValue - xMinValue) * coordinateWidth; + else xDataHig = (xValue - xMinValue) / (xMaxValue - xMinValue) * m_CoordinateWidth; } if (yAxis.IsLog()) { int minIndex = yAxis.runtimeMinLogIndex; float nowIndex = yAxis.GetLogValue(yValue); - yDataHig = (nowIndex - minIndex) / (yAxis.splitNumber - 1) * coordinateHeight; + yDataHig = (nowIndex - minIndex) / (yAxis.splitNumber - 1) * m_CoordinateHeight; } else { if ((yMaxValue - yMinValue) <= 0) yDataHig = 0; - else yDataHig = (yValue - yMinValue) / (yMaxValue - yMinValue) * coordinateHeight; + else yDataHig = (yValue - yMinValue) / (yMaxValue - yMinValue) * m_CoordinateHeight; } np = new Vector3(pX + xDataHig, pY + yDataHig); } else { float pX = startX + i * scaleWid; - float pY = serieHig + coordinateY + yAxis.axisLine.width; + float pY = serieHig + m_CoordinateY + yAxis.axisLine.width; if (yAxis.IsLog()) { int minIndex = yAxis.runtimeMinLogIndex; float nowIndex = yAxis.GetLogValue(yValue); - yDataHig = (nowIndex - minIndex) / (yAxis.splitNumber - 1) * coordinateHeight; + yDataHig = (nowIndex - minIndex) / (yAxis.splitNumber - 1) * m_CoordinateHeight; } else { if ((yMaxValue - yMinValue) <= 0) yDataHig = 0; - else yDataHig = (yValue - yMinValue) / (yMaxValue - yMinValue) * coordinateHeight; + else yDataHig = (yValue - yMinValue) / (yMaxValue - yMinValue) * m_CoordinateHeight; } np = new Vector3(pX, pY + yDataHig); } @@ -484,11 +485,11 @@ namespace XCharts Color areaColor, areaToColor; var xAxis = m_XAxises[serie.axisIndex]; var yAxis = m_YAxises[serie.axisIndex]; - var zeroPos = new Vector3(coordinateX + xAxis.runtimeZeroXOffset, coordinateY); + var zeroPos = new Vector3(m_CoordinateX + xAxis.runtimeZeroXOffset, m_CoordinateY); var isStack = m_Series.IsStack(serie.stack, SerieType.Line); if (!yAxis.show) yAxis = m_YAxises[(serie.axisIndex + 1) % m_YAxises.Count]; - float scaleWid = yAxis.GetDataWidth(coordinateHeight, showData.Count, m_DataZoom); - float startY = coordinateY + (yAxis.boundaryGap ? scaleWid / 2 : 0); + float scaleWid = yAxis.GetDataWidth(m_CoordinateHeight, showData.Count, m_DataZoom); + float startY = m_CoordinateY + (yAxis.boundaryGap ? scaleWid / 2 : 0); int maxCount = serie.maxShow > 0 ? (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) : showData.Count; @@ -502,7 +503,7 @@ namespace XCharts } int rate = 1; var sampleDist = serie.sampleDist; - if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (coordinateWidth / sampleDist)); + if (sampleDist > 0) rate = (int)((maxCount - serie.minShow) / (m_CoordinateWidth / sampleDist)); if (rate < 1) rate = 1; var dataChanging = false; float dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); @@ -516,17 +517,17 @@ namespace XCharts } float value = showData[i].GetCurrData(1, dataChangeDuration, xAxis.inverse); float pY = startY + i * scaleWid; - float pX = seriesHig[i] + coordinateX + yAxis.axisLine.width; + float pX = seriesHig[i] + m_CoordinateX + yAxis.axisLine.width; float dataHig = 0; if (xAxis.IsLog()) { int minIndex = xAxis.runtimeMinLogIndex; float nowIndex = xAxis.GetLogValue(value); - dataHig = (nowIndex - minIndex) / (xAxis.splitNumber - 1) * coordinateWidth; + dataHig = (nowIndex - minIndex) / (xAxis.splitNumber - 1) * m_CoordinateWidth; } else { - dataHig = (value - xMinValue) / (xMaxValue - xMinValue) * coordinateWidth; + dataHig = (value - xMinValue) / (xMaxValue - xMinValue) * m_CoordinateWidth; } np = new Vector3(pX + dataHig, pY); serie.dataPoints.Add(np); @@ -543,17 +544,17 @@ namespace XCharts seriesHig.Add(0); float value = showData[i].GetCurrData(1, dataChangeDuration, xAxis.inverse); float pY = startY + i * scaleWid; - float pX = seriesHig[i] + coordinateX + yAxis.axisLine.width; + float pX = seriesHig[i] + m_CoordinateX + yAxis.axisLine.width; float dataHig = 0; if (xAxis.IsLog()) { int minIndex = xAxis.runtimeMinLogIndex; float nowIndex = xAxis.GetLogValue(value); - dataHig = (nowIndex - minIndex) / (xAxis.splitNumber - 1) * coordinateWidth; + dataHig = (nowIndex - minIndex) / (xAxis.splitNumber - 1) * m_CoordinateWidth; } else { - dataHig = (value - xMinValue) / (xMaxValue - xMinValue) * coordinateWidth; + dataHig = (value - xMinValue) / (xMaxValue - xMinValue) * m_CoordinateWidth; } np = new Vector3(pX + dataHig, pY); serie.dataPoints.Add(np); @@ -848,7 +849,7 @@ namespace XCharts else { var points = ((isYAxis && lp.x < zeroPos.x) || (!isYAxis && lp.y < zeroPos.y)) ? smoothPoints : smoothDownPoints; - Vector3 aep = isYAxis ? new Vector3(zeroPos.x, zeroPos.y + coordinateHeight) : new Vector3(zeroPos.x + coordinateWidth, zeroPos.y); + Vector3 aep = isYAxis ? new Vector3(zeroPos.x, zeroPos.y + m_CoordinateHeight) : new Vector3(zeroPos.x + m_CoordinateWidth, zeroPos.y); var sindex = 0; var eindex = 0; var sp = GetStartPos(points, ref sindex); @@ -870,9 +871,9 @@ namespace XCharts var sp1 = smoothDownPoints[1]; var ep1 = smoothDownPoints[smoothDownPoints.Count - 2]; var axisUpStart = zeroPos + (isYAxis ? Vector3.right : Vector3.up) * axis.axisLine.width; - var axisUpEnd = axisUpStart + (isYAxis ? Vector3.up * coordinateHeight : Vector3.right * coordinateWidth); + var axisUpEnd = axisUpStart + (isYAxis ? Vector3.up * m_CoordinateHeight : Vector3.right * m_CoordinateWidth); var axisDownStart = zeroPos - (isYAxis ? Vector3.right : Vector3.up) * axis.axisLine.width; - var axisDownEnd = axisDownStart + (isYAxis ? Vector3.up * coordinateHeight : Vector3.right * coordinateWidth); + var axisDownEnd = axisDownStart + (isYAxis ? Vector3.up * m_CoordinateHeight : Vector3.right * m_CoordinateWidth); var luPos = ChartHelper.GetIntersection(sp1, ep1, axisUpStart, axisUpEnd); var ldPos = ChartHelper.GetIntersection(sp1, ep1, axisDownStart, axisDownEnd); sp1 = smoothPoints[1]; diff --git a/Runtime/Internal/CoordinateChart_DrawScatter.cs b/Runtime/Internal/CoordinateChart_DrawScatter.cs index 4a5200c7..e181c40b 100644 --- a/Runtime/Internal/CoordinateChart_DrawScatter.cs +++ b/Runtime/Internal/CoordinateChart_DrawScatter.cs @@ -36,10 +36,10 @@ namespace XCharts float xValue = serieData.GetCurrData(0, dataChangeDuration, xAxis.inverse); float yValue = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse); if (serieData.IsDataChanged()) dataChanging = true; - float pX = coordinateX + xAxis.axisLine.width; - float pY = coordinateY + yAxis.axisLine.width; - float xDataHig = (xValue - xAxis.runtimeMinValue) / (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * coordinateWidth; - float yDataHig = (yValue - yAxis.runtimeMinValue) / (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * coordinateHeight; + float pX = m_CoordinateX + xAxis.axisLine.width; + float pY = m_CoordinateY + yAxis.axisLine.width; + float xDataHig = (xValue - xAxis.runtimeMinValue) / (xAxis.runtimeMaxValue - xAxis.runtimeMinValue) * m_CoordinateWidth; + float yDataHig = (yValue - yAxis.runtimeMinValue) / (yAxis.runtimeMaxValue - yAxis.runtimeMinValue) * m_CoordinateHeight; var pos = new Vector3(pX + xDataHig, pY + yDataHig); serie.dataPoints.Add(pos); serieData.runtimePosition = pos; diff --git a/Runtime/Internal/ListPool.cs b/Runtime/Internal/ListPool.cs index e2605719..49b72c19 100644 --- a/Runtime/Internal/ListPool.cs +++ b/Runtime/Internal/ListPool.cs @@ -6,13 +6,24 @@ /******************************************/ using System.Collections.Generic; +using UnityEngine; namespace XCharts { internal static class ListPool { - private static readonly ObjectPool> s_ListPool = new ObjectPool>(null, Clear); - static void Clear(List l) { l.Clear(); } + private static readonly ObjectPool> s_ListPool = new ObjectPool>(OnGet, OnClear); + static void OnGet(List l) + { + if (l.Capacity < 50) + { + l.Capacity = 50; + } + } + static void OnClear(List l) + { + l.Clear(); + } public static List Get() { @@ -23,5 +34,10 @@ namespace XCharts { s_ListPool.Release(toRelease); } + + public static void ClearAll() + { + s_ListPool.ClearAll(); + } } } diff --git a/Runtime/Internal/ObjectPool.cs b/Runtime/Internal/ObjectPool.cs index be2bde7b..344331ef 100644 --- a/Runtime/Internal/ObjectPool.cs +++ b/Runtime/Internal/ObjectPool.cs @@ -52,5 +52,10 @@ namespace XCharts m_ActionOnRelease(element); m_Stack.Push(element); } + + public void ClearAll() + { + m_Stack.Clear(); + } } } diff --git a/Runtime/Internal/SerieDataPool.cs b/Runtime/Internal/SerieDataPool.cs index 3e42922a..f176f624 100644 --- a/Runtime/Internal/SerieDataPool.cs +++ b/Runtime/Internal/SerieDataPool.cs @@ -5,6 +5,8 @@ /* */ /******************************************/ +using UnityEngine; + namespace XCharts { internal static class SerieDataPool diff --git a/Runtime/Internal/SerieLabelPool.cs b/Runtime/Internal/SerieLabelPool.cs index e1afaad1..18f4c645 100644 --- a/Runtime/Internal/SerieLabelPool.cs +++ b/Runtime/Internal/SerieLabelPool.cs @@ -57,6 +57,7 @@ namespace XCharts public static void Release(GameObject element) { + if (element == null) return; ChartHelper.SetActive(element, false); if (!Application.isPlaying) return; if (!m_ReleaseDic.ContainsKey(element.GetInstanceID())) diff --git a/Runtime/Object.meta b/Runtime/Object.meta new file mode 100644 index 00000000..c0b6ac80 --- /dev/null +++ b/Runtime/Object.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 05690857746244b0ebec49f0b58b0f23 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Object/ChartObject.cs b/Runtime/Object/ChartObject.cs new file mode 100644 index 00000000..b23c4dba --- /dev/null +++ b/Runtime/Object/ChartObject.cs @@ -0,0 +1,22 @@ +/******************************************/ +/* */ +/* Copyright (c) 2018 monitor1394 */ +/* https://github.com/monitor1394 */ +/* */ +/******************************************/ + +using System; +using UnityEngine; + +namespace XCharts +{ + public class ChartObject + { + protected GameObject m_GameObject; + + public virtual void Destroy() + { + GameObject.Destroy(m_GameObject); + } + } +} \ No newline at end of file diff --git a/Runtime/Object/ChartObject.cs.meta b/Runtime/Object/ChartObject.cs.meta new file mode 100644 index 00000000..183b9e7a --- /dev/null +++ b/Runtime/Object/ChartObject.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0fe3102b0eea042938d30af910ca86d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Internal/LabelObject.cs b/Runtime/Object/LabelObject.cs similarity index 55% rename from Runtime/Internal/LabelObject.cs rename to Runtime/Object/LabelObject.cs index 988af098..e0101c7f 100644 --- a/Runtime/Internal/LabelObject.cs +++ b/Runtime/Object/LabelObject.cs @@ -10,17 +10,17 @@ using UnityEngine.UI; namespace XCharts { - public class LabelObject + public class LabelObject : ChartObject { - private GameObject m_GameObject; private bool m_LabelAutoSize = true; private float m_LabelPaddingLeftRight = 3f; private float m_LabelPaddingTopBottom = 3f; private Text m_LabelText; private RectTransform m_LabelRect; + private RectTransform m_IconRect; private Image m_IconImage; - // private RectTransform m_IconRect; + public GameObject gameObject { get { return m_GameObject; } } public Image icon { get { return m_IconImage; } } public Text label { get { return m_LabelText; } } @@ -43,7 +43,7 @@ namespace XCharts m_IconImage = image; if (image != null) { - // m_IconRect = m_IconImage.GetComponent(); + m_IconRect = m_IconImage.GetComponent(); } } @@ -54,12 +54,50 @@ namespace XCharts public void SetIconSize(float width, float height) { - if (m_LabelRect != null) m_LabelRect.sizeDelta = new Vector3(width, height); + if (m_IconRect != null) m_IconRect.sizeDelta = new Vector3(width, height); } - public void SetIconActive(bool flag) + public void UpdateIcon(IconStyle iconStyle) { - ChartHelper.SetActive(m_IconImage, flag); + if (m_IconImage == null) return; + if (iconStyle.show) + { + ChartHelper.SetActive(m_IconImage.gameObject, true); + m_IconImage.sprite = iconStyle.sprite; + m_IconImage.color = iconStyle.color; + m_IconRect.sizeDelta = new Vector2(iconStyle.width, iconStyle.height); + m_IconImage.transform.localPosition = iconStyle.offset; + if (iconStyle.layer == IconStyle.Layer.UnderLabel) + m_IconRect.SetSiblingIndex(0); + else + m_IconRect.SetSiblingIndex(m_GameObject.transform.childCount - 1); + } + else + { + ChartHelper.SetActive(m_IconImage.gameObject, false); + } + } + + public float GetLabelWidth() + { + if (m_LabelRect) return m_LabelRect.sizeDelta.x; + else return 0; + } + + public float GetLabelHeight() + { + if (m_LabelRect) return m_LabelRect.sizeDelta.y; + return 0; + } + + public void SetLabelColor(Color color) + { + if (m_LabelText) m_LabelText.color = color; + } + + public void SetLabelRotate(float rotate) + { + if (m_LabelText) m_LabelText.transform.localEulerAngles = new Vector3(0, 0, rotate); } public void SetPosition(Vector3 position) @@ -70,9 +108,22 @@ namespace XCharts } } + public void SetLabelPosition(Vector3 position) + { + if (m_LabelRect) m_LabelRect.localPosition = position; + } + public void SetActive(bool flag) { - ChartHelper.SetActive(m_GameObject, flag); + if (m_GameObject) ChartHelper.SetActive(m_GameObject, flag); + } + public void SetLabelActive(bool flag) + { + if (m_LabelText) ChartHelper.SetActive(m_LabelText, flag); + } + public void SetIconActive(bool flag) + { + if (m_IconImage) ChartHelper.SetActive(m_IconImage, flag); } public bool SetText(string text) diff --git a/Runtime/Internal/LabelObject.cs.meta b/Runtime/Object/LabelObject.cs.meta similarity index 83% rename from Runtime/Internal/LabelObject.cs.meta rename to Runtime/Object/LabelObject.cs.meta index 551ab4c5..ee6c0b32 100644 --- a/Runtime/Internal/LabelObject.cs.meta +++ b/Runtime/Object/LabelObject.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f4e7ef04b9a0e4526b49bf63967cfef4 +guid: 1277b7528331b42cfb61da7a2c762bee MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Runtime/PieChart.cs b/Runtime/PieChart.cs index 348be4e2..f8f4b85c 100644 --- a/Runtime/PieChart.cs +++ b/Runtime/PieChart.cs @@ -185,7 +185,7 @@ namespace XCharts private void DrawCenter(VertexHelper vh, Serie serie, ItemStyle itemStyle, float insideRadius) { - if (itemStyle.centerColor != Color.clear) + if (!ChartHelper.IsClearColor(itemStyle.centerColor)) { var radius = insideRadius - itemStyle.centerGap; ChartDrawer.DrawCricle(vh, serie.runtimeCenterPos, radius, itemStyle.centerColor, m_Settings.cicleSmoothness); @@ -242,7 +242,7 @@ namespace XCharts var outSideRadius = serieData.runtimePieOutsideRadius; var center = serie.runtimeCenterPos; var currAngle = serieData.runtimePieHalfAngle; - if (serieLabel.lineColor != Color.clear) color = serieLabel.lineColor; + if (!ChartHelper.IsClearColor(serieLabel.lineColor)) color = serieLabel.lineColor; else if (serieLabel.lineType == SerieLabel.LineType.HorizontalLine) color *= color; float currSin = Mathf.Sin(currAngle * Mathf.Deg2Rad); float currCos = Mathf.Cos(currAngle * Mathf.Deg2Rad); @@ -358,7 +358,7 @@ namespace XCharts private void DrawLabel(Serie serie, int dataIndex, SerieData serieData, Color serieColor) { - if (serieData.labelText == null) return; + if (serieData.labelObject == null) return; var currAngle = serieData.runtimePieHalfAngle; var isHighlight = (serieData.highlighted && serie.emphasis.label.show); var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); @@ -376,9 +376,9 @@ namespace XCharts Color color = serieColor; if (isHighlight) { - if (serie.emphasis.label.color != Color.clear) color = serie.emphasis.label.color; + if (!ChartHelper.IsClearColor(serie.emphasis.label.color)) color = serie.emphasis.label.color; } - else if (serieLabel.color != Color.clear) + else if (!ChartHelper.IsClearColor(serieLabel.color)) { color = serieLabel.color; } @@ -389,38 +389,37 @@ namespace XCharts var fontSize = isHighlight ? serie.emphasis.label.fontSize : serieLabel.fontSize; var fontStyle = isHighlight ? serie.emphasis.label.fontStyle : serieLabel.fontStyle; - serieData.labelText.color = color; - serieData.labelText.fontSize = fontSize; - serieData.labelText.fontStyle = fontStyle; - - serieData.labelRect.transform.localEulerAngles = new Vector3(0, 0, rotate); + serieData.labelObject.label.color = color; + serieData.labelObject.label.fontSize = fontSize; + serieData.labelObject.label.fontStyle = fontStyle; + serieData.labelObject.SetLabelRotate(rotate); UpdateLabelPostion(serie, serieData); if (!string.IsNullOrEmpty(serieLabel.formatter)) { var value = serieData.data[1]; var total = serie.yTotal; - var content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total, serieLabel); - if (serieData.SetLabelText(content)) RefreshChart(); + var content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, total, serieLabel); + if (serieData.labelObject.SetText(content)) RefreshChart(); } else { - if (serieData.SetLabelText(serieData.name)) RefreshChart(); + if (serieData.labelObject.SetText(serieData.name)) RefreshChart(); } - serieData.SetGameObjectPosition(serieData.labelPosition); - if (showLabel) serieData.SetLabelPosition(serieLabel.offset); + serieData.labelObject.SetPosition(serieData.labelPosition); + if (showLabel) serieData.labelObject.SetLabelPosition(serieLabel.offset); else serieData.SetLabelActive(false); } else { serieData.SetLabelActive(false); } - serieData.UpdateIcon(); + serieData.labelObject.UpdateIcon(serieData.iconStyle); } protected void UpdateLabelPostion(Serie serie, SerieData serieData) { - if (serieData.labelText == null) return; + if (serieData.labelObject == null) return; var currAngle = serieData.runtimePieHalfAngle; var currRad = currAngle * Mathf.Deg2Rad; var offsetRadius = serieData.runtimePieOffsetRadius; @@ -453,7 +452,7 @@ namespace XCharts } var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos * radius3, 2)) - currSin * radius3; r4 += serieLabel.lineLength1 + serieLabel.lineWidth * 4; - r4 += serieData.labelText.preferredWidth / 2; + r4 += serieData.labelObject.label.preferredWidth / 2; serieData.labelPosition = pos0 + (currAngle > 180 ? Vector3.left : Vector3.right) * r4; } else @@ -461,7 +460,7 @@ namespace XCharts labelRadius = serie.runtimeOutsideRadius + serieLabel.lineLength1; labelCenter = new Vector2(serie.runtimeCenterPos.x + labelRadius * Mathf.Sin(currRad), serie.runtimeCenterPos.y + labelRadius * Mathf.Cos(currRad)); - float labelWidth = serieData.labelText.preferredWidth; + float labelWidth = serieData.labelObject.label.preferredWidth; if (currAngle > 180) { serieData.labelPosition = new Vector2(labelCenter.x - serieLabel.lineLength2 - 5 - labelWidth / 2, labelCenter.y); diff --git a/Runtime/RadarChart.cs b/Runtime/RadarChart.cs index 1a43641d..58ae8486 100644 --- a/Runtime/RadarChart.cs +++ b/Runtime/RadarChart.cs @@ -125,7 +125,7 @@ namespace XCharts var pos = radar.GetIndicatorPosition(i); TextAnchor anchor = TextAnchor.MiddleCenter; var textStyle = indicator.textStyle; - var textColor = textStyle.color == Color.clear ? (Color)m_ThemeInfo.axisTextColor : textStyle.color; + var textColor = ChartHelper.IsClearColor(textStyle.color) ? (Color)m_ThemeInfo.axisTextColor : textStyle.color; var txt = ChartHelper.AddTextObject(INDICATOR_TEXT + "_" + n + "_" + i, transform, m_ThemeInfo.font, textColor, anchor, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(txtWid, txtHig), textStyle.fontSize, textStyle.rotate, textStyle.fontStyle, textStyle.lineSpacing); @@ -732,23 +732,24 @@ namespace XCharts for (int n = 0; n < serie.dataCount; n++) { var serieData = serie.data[n]; + if (serieData.labelObject == null) continue; var serieLabel = SerieHelper.GetSerieLabel(serie, serieData); var labelPos = serieData.labelPosition; if (serieLabel.margin != 0) { labelPos += serieLabel.margin * (labelPos - center).normalized; } - serieData.SetGameObjectPosition(labelPos); - serieData.UpdateIcon(); + serieData.labelObject.SetPosition(labelPos); + serieData.labelObject.UpdateIcon(serieData.iconStyle); if (serie.show && serieLabel.show && serieData.canShowLabel) { var value = serieData.GetCurrData(1); var max = radar.GetIndicatorMax(n); SerieLabelHelper.ResetLabel(serieData, serieLabel, themeInfo, i); serieData.SetLabelActive(serieData.labelPosition != Vector3.zero); - serieData.SetLabelPosition(serieLabel.offset); + serieData.labelObject.SetLabelPosition(serieLabel.offset); var content = SerieLabelHelper.GetFormatterContent(serie, serieData, value, max, serieLabel); - if (serieData.SetLabelText(content)) RefreshChart(); + if (serieData.labelObject.SetText(content)) RefreshChart(); } else { diff --git a/Runtime/RingChart.cs b/Runtime/RingChart.cs index a6e696e2..8a5f2339 100644 --- a/Runtime/RingChart.cs +++ b/Runtime/RingChart.cs @@ -151,7 +151,7 @@ namespace XCharts private void DrawCenter(VertexHelper vh, Serie serie, SerieData serieData, float insideRadius, bool last) { var itemStyle = SerieHelper.GetItemStyle(serie, serieData); - if (itemStyle.centerColor != Color.clear && last) + if (!ChartHelper.IsClearColor(itemStyle.centerColor) && last) { var radius = insideRadius - itemStyle.centerGap; var smoothness = m_Settings.cicleSmoothness; @@ -163,6 +163,7 @@ namespace XCharts float toAngle, float centerRadius) { if (!serie.label.show) return; + if (serieData.labelObject == null) return; switch (serie.label.position) { case SerieLabel.Position.Center: @@ -182,7 +183,7 @@ namespace XCharts serieData.labelPosition = serie.runtimeCenterPos + new Vector3(px2, py2); break; } - serieData.SetLabelPosition(serieData.labelPosition); + serieData.labelObject.SetLabelPosition(serieData.labelPosition); } private void DrawBackground(VertexHelper vh, Serie serie, SerieData serieData, int index, float insideRadius, float outsideRadius) @@ -207,7 +208,7 @@ namespace XCharts private void DrawBorder(VertexHelper vh, Serie serie, SerieData serieData, float insideRadius, float outsideRadius) { var itemStyle = SerieHelper.GetItemStyle(serie, serieData); - if (itemStyle.show && itemStyle.borderWidth > 0 && itemStyle.borderColor != Color.clear) + if (itemStyle.show && itemStyle.borderWidth > 0 && !ChartHelper.IsClearColor(itemStyle.borderColor)) { ChartDrawer.DrawDoughnut(vh, serie.runtimeCenterPos, outsideRadius, outsideRadius + itemStyle.borderWidth, itemStyle.borderColor, diff --git a/Runtime/Utility/ChartDrawer.cs b/Runtime/Utility/ChartDrawer.cs index 2a1f269c..adc16c0f 100644 --- a/Runtime/Utility/ChartDrawer.cs +++ b/Runtime/Utility/ChartDrawer.cs @@ -407,7 +407,7 @@ namespace XCharts public static void DrawBorder(VertexHelper vh, Vector3 center, float rectWidth, float rectHeight, float borderWidth, Color32 color, float rotate = 0, float[] cornerRadius = null) { - if (borderWidth == 0 || color == Color.clear) return; + if (borderWidth == 0 || ChartHelper.IsClearColor(color)) return; var halfWid = rectWidth / 2; var halfHig = rectHeight / 2; var lbIn = new Vector3(center.x - halfWid, center.y - halfHig); @@ -954,7 +954,7 @@ namespace XCharts p.y + outsideRadius * Mathf.Cos(currAngle)); p4 = new Vector3(p.x + insideRadius * Mathf.Sin(currAngle), p.y + insideRadius * Mathf.Cos(currAngle)); - if (emptyColor != Color.clear) DrawTriangle(vh, p, p1, p4, emptyColor); + if (!ChartHelper.IsClearColor(emptyColor)) DrawTriangle(vh, p, p1, p4, emptyColor); DrawPolygon(vh, p2, p3, p4, p1, color, toColor); p1 = p4; p2 = p3; diff --git a/Runtime/Utility/ChartHelper.cs b/Runtime/Utility/ChartHelper.cs index f11c5139..9d8a8d2b 100644 --- a/Runtime/Utility/ChartHelper.cs +++ b/Runtime/Utility/ChartHelper.cs @@ -145,7 +145,7 @@ namespace XCharts if (parent.Find(name)) { obj = parent.Find(name).gameObject; - obj.SetActive(true); + SetActive(obj, true); obj.transform.localPosition = Vector3.zero; obj.transform.localScale = Vector3.one; } @@ -423,6 +423,16 @@ namespace XCharts return true; } + public static bool IsClearColor(Color32 color) + { + return color.a == 0 && color.b == 0 && color.g == 0 && color.r == 0; + } + + public static bool IsClearColor(Color color) + { + return color.a == 0 && color.b == 0 && color.g == 0 && color.r == 0; + } + public static bool CopyList(List toList, List fromList) { if (toList == null || fromList == null) return false;