From d5fbd33534fdc13987f890dcdcfd6f116916b37a Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Tue, 16 Jul 2024 23:03:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96`Axis`=E4=B8=BA`Time`?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E8=BD=B4=E6=97=B6=E7=9A=84`Tooltip`=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 5 +-- Runtime/Component/Tooltip/TooltipHandler.cs | 37 ++++++++++++++++----- Runtime/Utilities/DateTimeUtil.cs | 24 +++++++++++-- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index a54e4067..43e8d2bc 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -75,8 +75,9 @@ slug: /changelog ## master -* (2024.07.14) 优化`Axis`的`Time`时间轴的`splitNumber`为0时的表现 -* (2024.07.14) 优化`Axis`的`Time`时间轴的滚动表现 +* (2024.07.16) 优化`Axis`为`Time`时间轴时的`Tooltip`默认效果 +* (2024.07.15) 优化`Axis`为`Time`时间轴时的分割效果 +* (2024.07.14) 优化`Axis`为`Time`时间轴时的移动表现 * (2024.07.12) 优化`Label`显示体验 * (2024.07.06) 修复`Chart`在动态创建时背景没有自适应的问题 (#323) diff --git a/Runtime/Component/Tooltip/TooltipHandler.cs b/Runtime/Component/Tooltip/TooltipHandler.cs index 1d28d5bc..17d9aa46 100644 --- a/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Runtime/Component/Tooltip/TooltipHandler.cs @@ -571,11 +571,13 @@ namespace XCharts.Runtime var isTriggerByAxis = false; var isTriggerByItem = tooltip.context.trigger == Tooltip.Trigger.Item; var dataIndex = -1; + var timestamp = -1; + double axisRange = 0; tooltip.context.data.param.Clear(); tooltip.context.pointer = GetTooltipPointerPos(); if (m_PointerContainer is GridCoord) { - GetAxisCategory(m_PointerContainer.index, ref dataIndex, ref category); + GetAxisCategory(m_PointerContainer.index, ref dataIndex, ref category, ref timestamp, ref axisRange); if (tooltip.context.trigger == Tooltip.Trigger.Axis) { isTriggerByAxis = true; @@ -585,7 +587,9 @@ namespace XCharts.Runtime tooltip.context.data.title = series[0].serieName; } else + { tooltip.context.data.title = category; + } } else if (tooltip.context.trigger == Tooltip.Trigger.Item) { @@ -604,6 +608,15 @@ namespace XCharts.Runtime serie.context.isTriggerByAxis = isTriggerByAxis; if (isTriggerByAxis && dataIndex >= 0 && serie.context.pointerItemDataIndex < 0) serie.context.pointerItemDataIndex = dataIndex; + if (timestamp >= 0) + { + showCategory = false; + var serieData = serie.GetSerieData(serie.context.pointerItemDataIndex); + if (serieData != null) + { + tooltip.context.data.title = DateTimeUtil.GetDefaultDateTimeString((int)serieData.GetData(0), axisRange); + } + } serie.handler.UpdateTooltipSerieParams(dataIndex, showCategory, category, tooltip.marker, tooltip.itemFormatter, tooltip.numericFormatter, tooltip.ignoreDataDefaultContent, @@ -626,20 +639,28 @@ namespace XCharts.Runtime return false; } - private bool GetAxisCategory(int gridIndex, ref int dataIndex, ref string category) + private bool GetAxisCategory(int gridIndex, ref int dataIndex, ref string category, ref int timestamp, ref double axisRange) { foreach (var component in chart.components) { if (component is Axis) { var axis = component as Axis; - if (axis.gridIndex == gridIndex && axis.IsCategory()) + if (axis.gridIndex == gridIndex) { - dataIndex = double.IsNaN(axis.context.pointerValue) - ? axis.context.dataZoomStartIndex - : axis.context.dataZoomStartIndex + (int)axis.context.axisTooltipValue; - category = axis.GetData(dataIndex); - return true; + if (axis.IsCategory()) + { + dataIndex = double.IsNaN(axis.context.pointerValue) + ? axis.context.dataZoomStartIndex + : axis.context.dataZoomStartIndex + (int)axis.context.axisTooltipValue; + category = axis.GetData(dataIndex); + return true; + } + else if (axis.IsTime()) + { + timestamp = (int)axis.context.pointerValue; + axisRange = axis.context.minMaxRange; + } } } } diff --git a/Runtime/Utilities/DateTimeUtil.cs b/Runtime/Utilities/DateTimeUtil.cs index d785daac..6e0fb424 100644 --- a/Runtime/Utilities/DateTimeUtil.cs +++ b/Runtime/Utilities/DateTimeUtil.cs @@ -59,6 +59,21 @@ namespace XCharts.Runtime return k_DateTime1970.AddSeconds(timestamp); } + public static string GetDefaultDateTimeString(int timestamp, double range = 0) + { + var dateString = String.Empty; + var dateTime = GetDateTime(timestamp); + if (range <= 0 || range >= DateTimeUtil.ONE_DAY) + { + dateString = dateTime.ToString("yyyy-MM-dd"); + } + else + { + dateString = dateTime.ToString(s_SecondDateFormatter); + } + return dateString; + } + internal static string GetDateTimeFormatString(DateTime dateTime, double range) { var dateString = String.Empty; @@ -143,19 +158,22 @@ namespace XCharts.Runtime else if (range >= ONE_HOUR * MIN_TIME_SPLIT_NUMBER) { tick = GetTickSecond(range, splitNumber, ONE_HOUR); - var startTimestamp = (minTimestamp - minTimestamp % tick) + tick; + var let = minTimestamp % tick; + var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick; AddTickTimestamp(list, startTimestamp, maxTimestamp, tick); } else if (range >= ONE_MINUTE * MIN_TIME_SPLIT_NUMBER) { tick = GetTickSecond(range, splitNumber, ONE_MINUTE); - var startTimestamp = (minTimestamp - minTimestamp % tick) + tick; + var let = minTimestamp % tick; + var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick; AddTickTimestamp(list, startTimestamp, maxTimestamp, tick); } else { tick = GetTickSecond(range, splitNumber, ONE_SECOND); - var startTimestamp = (minTimestamp - minTimestamp % tick) + tick; + var let = minTimestamp % tick; + var startTimestamp = let == 0 ? minTimestamp : (minTimestamp - let) + tick; AddTickTimestamp(list, startTimestamp, maxTimestamp, tick); } return tick;