diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 3ca0e081..e28e2a04 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -78,11 +78,12 @@ slug: /changelog * 增加`Axis`的对数轴子刻度的支持 * 增加`MarkLine`的`onTop`设置是否显示在最上层 * 增加`UITable`表格组件的轮播功能,重构`UITable` -* 完善注释和文档 +* 完善代码注释和手册文档 * 修复若干问题 日志详情: +* (2023.11.28) 修复`Tooltip`在对数轴时指示不准确的问题 * (2023.11.24) 修复`Chart`的`UpdateData()`接口返回值不准确的问题 * (2023.11.24) 修复`Axis`的更新数据时效果不顺畅的问题 * (2023.11.23) 增加`Axis`的`Animation`支持动画效果 diff --git a/Runtime/Component/Axis/Axis.cs b/Runtime/Component/Axis/Axis.cs index 738351b5..2f7cc9d2 100644 --- a/Runtime/Component/Axis/Axis.cs +++ b/Runtime/Component/Axis/Axis.cs @@ -727,6 +727,13 @@ public float GetDistance(double value, float axisLength) var each = axisLength / data.Count; return (float)(each * (value + 0.5f)); } + else if (IsLog()) + { + var logValue = GetLogValue(value); + var logMin = GetLogValue(context.minValue); + var logMax = GetLogValue(context.maxValue); + return axisLength * (float)((logValue - logMin) / (logMax - logMin)); + } else { return axisLength * (float)((value - context.minValue) / context.minMaxRange); diff --git a/Runtime/Component/Axis/AxisHandler.cs b/Runtime/Component/Axis/AxisHandler.cs index 878c1a1b..e09bdd9f 100644 --- a/Runtime/Component/Axis/AxisHandler.cs +++ b/Runtime/Component/Axis/AxisHandler.cs @@ -109,11 +109,23 @@ protected virtual void UpdatePointerValue(Axis axis) } else { - var xRate = axis.context.minMaxRange / grid.context.width; - var xValue = xRate * (chart.pointerPos.x - grid.context.x - axis.context.offset); - if (axis.context.minValue > 0) - xValue += axis.context.minValue; - + double xValue; + if (axis.IsLog()) + { + var logBase = axis.logBase; + var minLog = Math.Log(axis.context.minValue, logBase); + var maxLog = Math.Log(axis.context.maxValue, logBase); + var logRange = maxLog - minLog; + var pointerLog = minLog + logRange * (chart.pointerPos.x - grid.context.x - axis.context.offset) / grid.context.width; + xValue = Math.Pow(logBase, pointerLog); + } + else + { + var xRate = axis.context.minMaxRange / grid.context.width; + xValue = xRate * (chart.pointerPos.x - grid.context.x - axis.context.offset); + if (axis.context.minValue > 0) + xValue += axis.context.minValue; + } var labelY = axis.GetLabelObjectPosition(0).y; axis.context.pointerValue = xValue; axis.context.pointerLabelPosition = new Vector3(chart.pointerPos.x, labelY); @@ -153,7 +165,7 @@ internal void UpdateAxisMinMaxValue(int axisIndex, Axis axis, bool updateChart = else dataZoom.SetYAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue); } - + if (tempMinValue != axis.context.destMinValue || tempMaxValue != axis.context.destMaxValue || m_LastInterval != axis.interval || @@ -898,7 +910,7 @@ protected void DrawAxisSplit(VertexHelper vh, AxisTheme theme, DataZoom dataZoom if (isLogAxis) { var count = 0; - var logRange = (axis.logBase - 1f); + var logRange = axis.logBase - 1f; minorTickDistance = scaleWidth * axis.GetLogValue(1 + (count + 1) * logRange / minorTickSplitNumber); var tickTotal = lastSplitX + minorTickDistance; while (tickTotal < current && count < minorTickSplitNumber - 1) diff --git a/Runtime/Component/Tooltip/TooltipHandler.cs b/Runtime/Component/Tooltip/TooltipHandler.cs index 2aaa016e..884807b0 100644 --- a/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Runtime/Component/Tooltip/TooltipHandler.cs @@ -18,6 +18,11 @@ public override void InitComponent() InitTooltip(component); } + public override void BeforceSerieUpdate() + { + UpdateTooltipData(component); + } + public override void Update() { UpdateTooltip(component); @@ -86,8 +91,9 @@ private ChartLabel GetIndicatorLabel(Axis axis) } } - private void UpdateTooltip(Tooltip tooltip) + private void UpdateTooltipData(Tooltip tooltip) { + showTooltip = false; if (tooltip.trigger == Tooltip.Trigger.None) return; if (!chart.isPointerInChart || !tooltip.show) { @@ -98,7 +104,28 @@ private void UpdateTooltip(Tooltip tooltip) } return; } - var showTooltip = false; + for (int i = chart.series.Count - 1; i >= 0; i--) + { + var serie = chart.series[i]; + if (!(serie is INeedSerieContainer)) + { + showTooltip = true; + return; + } + } + containerSeries = ListPool.Get(); + UpdatePointerContainerAndSeriesAndTooltip(tooltip, ref containerSeries); + if (containerSeries.Count > 0) + { + showTooltip = true; + } + } + + private bool showTooltip; + private List containerSeries; + private void UpdateTooltip(Tooltip tooltip) + { + if (!showTooltip) return; for (int i = chart.series.Count - 1; i >= 0; i--) { var serie = chart.series[i]; @@ -106,20 +133,19 @@ private void UpdateTooltip(Tooltip tooltip) { if (SetSerieTooltip(tooltip, serie)) { - showTooltip = true; chart.RefreshTopPainter(); return; } } } - var containerSeries = ListPool.Get(); - UpdatePointerContainerAndSeriesAndTooltip(tooltip, ref containerSeries); - if (containerSeries.Count > 0) + if (containerSeries != null) { - if (SetSerieTooltip(tooltip, containerSeries)) - showTooltip = true; + if (!SetSerieTooltip(tooltip, containerSeries)) + { + showTooltip = false; + } + ListPool.Release(containerSeries); } - ListPool.Release(containerSeries); if (!showTooltip) { if (tooltip.context.type == Tooltip.Type.Corss && m_PointerContainer != null && m_PointerContainer.IsPointerEnter()) @@ -138,10 +164,6 @@ private void UpdateTooltip(Tooltip tooltip) } } - private void UpdateTooltipTypeAndTrigger(Tooltip tootip) - { - } - private void UpdateTooltipIndicatorLabelText(Tooltip tooltip) { if (!tooltip.show) return; diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 8c1625e4..e5afa1c3 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -194,6 +194,7 @@ protected override void Update() CheckRefreshChart(); Internal_CheckAnimation(); foreach (var handler in m_SerieHandlers) handler.BeforeUpdate(); + foreach (var handler in m_ComponentHandlers) handler.BeforceSerieUpdate(); foreach (var handler in m_SerieHandlers) handler.Update(); foreach (var handler in m_ComponentHandlers) handler.Update(); foreach (var handler in m_SerieHandlers) handler.AfterUpdate(); diff --git a/Runtime/Internal/Basic/MainComponent.cs b/Runtime/Internal/Basic/MainComponent.cs index 202831e1..d36f9a87 100644 --- a/Runtime/Internal/Basic/MainComponent.cs +++ b/Runtime/Internal/Basic/MainComponent.cs @@ -94,6 +94,7 @@ public abstract class MainComponentHandler public virtual void InitComponent() { } public virtual void RemoveComponent() { } public virtual void CheckComponent(StringBuilder sb) { } + public virtual void BeforceSerieUpdate() { } public virtual void Update() { } public virtual void DrawBase(VertexHelper vh) { } public virtual void DrawUpper(VertexHelper vh) { } diff --git a/Runtime/Internal/Utilities/ChartCached.cs b/Runtime/Internal/Utilities/ChartCached.cs index d376421a..cda8bbb8 100644 --- a/Runtime/Internal/Utilities/ChartCached.cs +++ b/Runtime/Internal/Utilities/ChartCached.cs @@ -22,6 +22,7 @@ public static class ChartCached private static Dictionary> s_NumberToStr = new Dictionary>(); private static Dictionary> s_PrecisionToStr = new Dictionary>(); + private static Dictionary> s_StringIntDict = new Dictionary>(); public static string FloatToStr(double value, string numericFormatter = "F", int precision = 0) { @@ -113,6 +114,19 @@ public static string GetSerieLabelName(string prefix, int i, int j) } } + public static string GetString(string prefix, int suffix) + { + if (!s_StringIntDict.ContainsKey(prefix)) + { + s_StringIntDict[prefix] = new Dictionary(); + } + if (!s_StringIntDict[prefix].ContainsKey(suffix)) + { + s_StringIntDict[prefix][suffix] = prefix + suffix; + } + return s_StringIntDict[prefix][suffix]; + } + internal static string GetComponentObjectName(MainComponent component) { Dictionary dict; diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index 940984da..2b21fd59 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -438,7 +438,8 @@ public static ChartLabel AddChartLabel2(string name, Transform parent, LabelStyl label.color = (!labelStyle.background.autoColor || autoColor == Color.clear) ? labelStyle.background.color : autoColor; label.sprite = labelStyle.background.sprite; - label.type = labelStyle.background.type; + if(label.type != labelStyle.background.type) + label.type = labelStyle.background.type; } else {