From 81da3af9c4fa25dc38f01ad102e65913a5c72acd Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sun, 13 Sep 2020 20:17:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9D=90=E6=A0=87=E8=BD=B4?= =?UTF-8?q?=E5=88=BB=E5=BA=A6=E5=92=8C=E6=95=B0=E6=8D=AE=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/PropertyDrawers/AxisDrawer.cs | 20 ++++--- Runtime/Component/Main/Axis.cs | 6 +- Runtime/Internal/CoordinateChart.cs | 23 +++++--- Runtime/Internal/Helper/AxisHelper.cs | 85 +++++++++++++++------------ 4 files changed, 78 insertions(+), 56 deletions(-) diff --git a/Editor/PropertyDrawers/AxisDrawer.cs b/Editor/PropertyDrawers/AxisDrawer.cs index 6a244a62..eaa80b80 100644 --- a/Editor/PropertyDrawers/AxisDrawer.cs +++ b/Editor/PropertyDrawers/AxisDrawer.cs @@ -96,10 +96,16 @@ namespace XCharts } EditorGUI.PropertyField(drawRect, m_SplitNumber); drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - EditorGUI.PropertyField(drawRect, m_Interval); - drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - EditorGUI.PropertyField(drawRect, m_BoundaryGap); - drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + if (type == Axis.AxisType.Category) + { + EditorGUI.PropertyField(drawRect, m_BoundaryGap); + drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + } + else + { + EditorGUI.PropertyField(drawRect, m_Interval); + drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + } DrawExtended(ref drawRect, prop); EditorGUI.PropertyField(drawRect, m_AxisLine); drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; @@ -170,7 +176,7 @@ namespace XCharts } else { - height += 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing; + height += 0 * EditorGUIUtility.singleLineHeight + 0 * EditorGUIUtility.standardVerticalSpacing; } if (m_ShowJsonDataArea) { @@ -179,7 +185,7 @@ namespace XCharts } else if (type == Axis.AxisType.Value) { - height += 3 * EditorGUIUtility.singleLineHeight + 2 * EditorGUIUtility.standardVerticalSpacing; + height += 2 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing; SerializedProperty m_MinMaxType = prop.FindPropertyRelative("m_MinMaxType"); if (m_MinMaxType.enumValueIndex == (int)Axis.AxisMinMaxType.Custom) { @@ -188,7 +194,7 @@ namespace XCharts } else if (type == Axis.AxisType.Log) { - height += 2 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing; + height += 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing; SerializedProperty m_MinMaxType = prop.FindPropertyRelative("m_MinMaxType"); if (m_MinMaxType.enumValueIndex == (int)Axis.AxisMinMaxType.Custom) { diff --git a/Runtime/Component/Main/Axis.cs b/Runtime/Component/Main/Axis.cs index 92890f3b..18bd4c56 100644 --- a/Runtime/Component/Main/Axis.cs +++ b/Runtime/Component/Main/Axis.cs @@ -154,12 +154,12 @@ namespace XCharts set { if (PropertyUtility.SetStruct(ref m_Interval, value)) SetAllDirty(); } } /// - /// The boundary gap on both sides of a coordinate axis. - /// 坐标轴两边是否留白。 + /// The boundary gap on both sides of a coordinate axis, which is valid only for category axis with type: 'Category'. + /// 坐标轴两边是否留白。只对类目轴有效。 /// public bool boundaryGap { - get { return m_BoundaryGap; } + get { return IsCategory() ? m_BoundaryGap : false; } set { if (PropertyUtility.SetStruct(ref m_BoundaryGap, value)) SetAllDirty(); } } /// diff --git a/Runtime/Internal/CoordinateChart.cs b/Runtime/Internal/CoordinateChart.cs index edada83f..12def7f9 100644 --- a/Runtime/Internal/CoordinateChart.cs +++ b/Runtime/Internal/CoordinateChart.cs @@ -527,8 +527,10 @@ namespace XCharts var labelColor = ChartHelper.IsClearColor(yAxis.axisLabel.color) ? (Color)m_ThemeInfo.axisTextColor : yAxis.axisLabel.color; - int splitNumber = AxisHelper.GetSplitNumber(yAxis, m_CoordinateHeight, m_DataZoom); + int splitNumber = AxisHelper.GetScaleNumber(yAxis, m_CoordinateHeight, m_DataZoom); float totalWidth = 0; + float eachWidth = AxisHelper.GetEachWidth(yAxis, m_CoordinateHeight, m_DataZoom); + float gapWidth = yAxis.boundaryGap ? eachWidth / 2 : 0; for (int i = 0; i < splitNumber; i++) { Text txt; @@ -550,7 +552,7 @@ namespace XCharts float labelWidth = AxisHelper.GetScaleWidth(yAxis, 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); + txt.transform.localPosition = GetLabelYPosition(totalWidth + gapWidth, i, yAxisIndex, yAxis); var isPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar); txt.text = AxisHelper.GetLabelName(yAxis, m_CoordinateHeight, i, yAxis.runtimeMinValue, yAxis.runtimeMaxValue, m_DataZoom, isPercentStack); @@ -633,8 +635,10 @@ namespace XCharts var labelColor = ChartHelper.IsClearColor(xAxis.axisLabel.color) ? (Color)m_ThemeInfo.axisTextColor : xAxis.axisLabel.color; - int splitNumber = AxisHelper.GetSplitNumber(xAxis, m_CoordinateWidth, m_DataZoom); + int splitNumber = AxisHelper.GetScaleNumber(xAxis, m_CoordinateWidth, m_DataZoom); float totalWidth = 0; + float eachWidth = AxisHelper.GetEachWidth(xAxis, m_CoordinateWidth, m_DataZoom); + float gapWidth = xAxis.boundaryGap ? eachWidth / 2 : 0; for (int i = 0; i < splitNumber; i++) { float labelWidth = AxisHelper.GetScaleWidth(xAxis, m_CoordinateWidth, i, m_DataZoom); @@ -644,7 +648,7 @@ namespace XCharts new Vector2(0, 1), new Vector2(1, 0.5f), new Vector2(labelWidth, 20), xAxis.axisLabel.fontSize, xAxis.axisLabel.rotate, xAxis.axisLabel.fontStyle); if (i == 0) xAxis.axisLabel.SetRelatedText(txt, labelWidth); - txt.transform.localPosition = GetLabelXPosition(totalWidth + (xAxis.boundaryGap ? labelWidth : labelWidth / 2), + txt.transform.localPosition = GetLabelXPosition(totalWidth + labelWidth / 2 + gapWidth, i, xAxisIndex, xAxis); totalWidth += labelWidth; var isPercentStack = SeriesHelper.IsPercentStack(m_Series, SerieType.Bar); @@ -1083,8 +1087,11 @@ namespace XCharts { pY += startY - xAxis.axisTick.length; } - ChartDrawer.DrawLine(vh, new Vector3(pX, startY), new Vector3(pX, pY), - AxisHelper.GetTickWidth(xAxis), m_ThemeInfo.axisLineColor); + if (pX <= m_CoordinateX + m_CoordinateWidth + yAxis.axisLine.width) + { + ChartDrawer.DrawLine(vh, new Vector3(pX, startY), new Vector3(pX, pY), + AxisHelper.GetTickWidth(xAxis), m_ThemeInfo.axisLineColor); + } } totalWidth += scaleWidth; } @@ -1229,7 +1236,7 @@ namespace XCharts var xAxis = m_XAxises[i]; var yAxis = m_YAxises[i]; if (!xAxis.show) continue; - if(m_Tooltip.runtimeXValues[i] < 0) continue; + if (m_Tooltip.runtimeXValues[i] < 0) continue; float splitWidth = AxisHelper.GetDataWidth(xAxis, m_CoordinateWidth, dataCount, m_DataZoom); switch (m_Tooltip.type) { @@ -1275,7 +1282,7 @@ namespace XCharts var yAxis = m_YAxises[i]; var xAxis = m_XAxises[i]; if (!yAxis.show) continue; - if(m_Tooltip.runtimeYValues[i] < 0) continue; + if (m_Tooltip.runtimeYValues[i] < 0) continue; float splitWidth = AxisHelper.GetDataWidth(yAxis, m_CoordinateHeight, dataCount, m_DataZoom); switch (m_Tooltip.type) { diff --git a/Runtime/Internal/Helper/AxisHelper.cs b/Runtime/Internal/Helper/AxisHelper.cs index 4fb3591f..2951cd91 100644 --- a/Runtime/Internal/Helper/AxisHelper.cs +++ b/Runtime/Internal/Helper/AxisHelper.cs @@ -58,12 +58,22 @@ namespace XCharts { return axis.splitNumber; } - int dataCount = axis.GetDataList(dataZoom).Count; - if (axis.splitNumber <= 0) return dataCount; - if (dataCount > 2 * axis.splitNumber || dataCount <= 0) - return axis.splitNumber; - else - return dataCount; + else if (axis.type == Axis.AxisType.Category) + { + int dataCount = axis.GetDataList(dataZoom).Count; + if (dataCount <= 0) return 0; + if (axis.splitNumber <= 0) return dataCount; + if (dataCount >= 2 * axis.splitNumber) + { + int tick = dataCount / axis.splitNumber; + return (int)dataCount / tick; + } + else + { + return dataCount; + } + } + return 0; } /// @@ -146,20 +156,12 @@ namespace XCharts var showData = axis.GetDataList(dataZoom); int dataCount = showData.Count; if (dataCount <= 0) return ""; - - if (index == split - 1 && !axis.boundaryGap) - { - return axis.axisLabel.GetFormatterContent(showData[dataCount - 1]); - } - else - { - float rate = dataCount / split; - if (rate < 1) rate = 1; - int offset = axis.boundaryGap ? (int)(rate / 2) : 0; - int newIndex = (int)(index * rate >= dataCount - 1 ? - dataCount - 1 : offset + index * rate); - return axis.axisLabel.GetFormatterContent(showData[newIndex]); - } + if (split == 1) return axis.axisLabel.GetFormatterContent(showData[0]); + int rate = dataCount / (split - (axis.boundaryGap ? 0 : 1)); + if (rate < 1) rate = 1; + int newIndex = index * rate; + if (newIndex > dataCount - 1) return string.Empty; + else return axis.axisLabel.GetFormatterContent(showData[newIndex]); } /// @@ -169,21 +171,8 @@ namespace XCharts /// internal static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null) { - if (axis.type == Axis.AxisType.Value || axis.type == Axis.AxisType.Log) - { - int splitNum = GetSplitNumber(axis, coordinateWidth, dataZoom); - return axis.boundaryGap ? splitNum + 1 : splitNum; - } - else - { - var showData = axis.GetDataList(dataZoom); - int dataCount = showData.Count; - if (axis.splitNumber <= 0) return axis.boundaryGap ? dataCount + 1 : dataCount; - if (dataCount > 2 * axis.splitNumber || dataCount <= 0) - return axis.boundaryGap ? axis.splitNumber + 1 : axis.splitNumber; - else - return axis.boundaryGap ? dataCount + 1 : dataCount; - } + int splitNum = GetSplitNumber(axis, coordinateWidth, dataZoom); + return axis.boundaryGap ? splitNum + 1 : splitNum; } /// @@ -198,12 +187,32 @@ namespace XCharts if (num <= 0) num = 1; if (axis.type == Axis.AxisType.Value && axis.interval > 0) { - if (index == num - 1) return coordinateWidth - (num - 1) * axis.interval * coordinateWidth / axis.runtimeMinMaxRange; - else return axis.interval * coordinateWidth / axis.runtimeMinMaxRange; + return axis.interval * coordinateWidth / axis.runtimeMinMaxRange; } else { - return coordinateWidth / num; + if (axis.data.Count > 0) + { + int tick = axis.data.Count / num; + var count = axis.boundaryGap ? axis.data.Count : axis.data.Count - 1; + var each = coordinateWidth / count; + return each * tick; + } + else return coordinateWidth / num; + } + } + + internal static float GetEachWidth(Axis axis, float coordinateWidth, DataZoom dataZoom = null) + { + if (axis.data.Count > 0) + { + var count = axis.boundaryGap ? axis.data.Count : axis.data.Count - 1; + return count > 0 ? coordinateWidth / count : coordinateWidth; + } + else + { + int num = GetScaleNumber(axis, coordinateWidth, dataZoom) - 1; + return num > 0 ? coordinateWidth / num : coordinateWidth; } }