diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index e939a50c..89e77704 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -204,6 +204,7 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver |CanAddChartComponent()||public bool CanAddChartComponent(Type type)| |CanAddSerie()||public bool CanAddSerie(Type type)| |CanAddSerie<T>()||public bool CanAddSerie<T>() where T : Serie| +|CancelTooltip()|v3.7.0|public void CancelTooltip()
cancel tooltip. | |CanMultipleComponent()||public bool CanMultipleComponent(Type type)| |ClampInChart()||public void ClampInChart(ref Vector3 pos)| |ClampInGrid()||public Vector3 ClampInGrid(GridCoord grid, Vector3 pos)| @@ -319,6 +320,8 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver |SetSeriePainterMaterial()||public void SetSeriePainterMaterial(Material material)
设置Serie Painter的材质球 | |SetTopPainterMaterial()||public void SetTopPainterMaterial(Material material)
设置Top Painter的材质球 | |SetUpperPainterMaterial()||public void SetUpperPainterMaterial(Material material)
设置Upper Painter的材质球 | +|TriggerTooltip()|v3.7.0|public bool TriggerTooltip(int dataIndex)
trigger tooltip by data index. | +|TriggerTooltip()|v3.7.0|public bool TriggerTooltip(Vector3 localPosition)
trigger tooltip by chart local position. | |TryAddChartComponent()||public bool TryAddChartComponent(Type type)| |TryAddChartComponent<T>()||public bool TryAddChartComponent<T>() where T : MainComponent| |TryAddChartComponent<T>()||public bool TryAddChartComponent<T>(out T component) where T : MainComponent| @@ -355,6 +358,8 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandle |onPointerUp||public Action<PointerEventData, BaseGraph> onPointerUp
鼠标弹起回调。 | |onScroll||public Action<PointerEventData, BaseGraph> onScroll
鼠标滚动回调。 | |CheckWarning()||public string CheckWarning()
检测警告信息。 | +|LocalPointToScreenPoint()|v3.7.0|public Vector2 LocalPointToScreenPoint(Vector2 localPoint)
chart local point to screen point. | +|LocalPointToWorldPoint()|v3.7.0|public Vector2 LocalPointToWorldPoint(Vector2 localPoint)
chart local point to world point. | |OnBeginDrag()||public virtual void OnBeginDrag(PointerEventData eventData)| |OnDrag()||public virtual void OnDrag(PointerEventData eventData)| |OnEndDrag()||public virtual void OnEndDrag(PointerEventData eventData)| diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 0b1b60b7..0efaac1a 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -204,6 +204,7 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver |CanAddChartComponent()||public bool CanAddChartComponent(Type type)| |CanAddSerie()||public bool CanAddSerie(Type type)| |CanAddSerie<T>()||public bool CanAddSerie<T>() where T : Serie| +|CancelTooltip()|v3.7.0|public void CancelTooltip()
取消Tooltip. | |CanMultipleComponent()||public bool CanMultipleComponent(Type type)| |ClampInChart()||public void ClampInChart(ref Vector3 pos)| |ClampInGrid()||public Vector3 ClampInGrid(GridCoord grid, Vector3 pos)| @@ -319,6 +320,8 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver |SetSeriePainterMaterial()||public void SetSeriePainterMaterial(Material material)
设置Serie Painter的材质球 | |SetTopPainterMaterial()||public void SetTopPainterMaterial(Material material)
设置Top Painter的材质球 | |SetUpperPainterMaterial()||public void SetUpperPainterMaterial(Material material)
设置Upper Painter的材质球 | +|TriggerTooltip()|v3.7.0|public bool TriggerTooltip(int dataIndex)
尝试触发指定数据项的Tooltip. | +|TriggerTooltip()|v3.7.0|public bool TriggerTooltip(Vector3 localPosition)
在指定的位置尝试触发Tooltip. | |TryAddChartComponent()||public bool TryAddChartComponent(Type type)| |TryAddChartComponent<T>()||public bool TryAddChartComponent<T>() where T : MainComponent| |TryAddChartComponent<T>()||public bool TryAddChartComponent<T>(out T component) where T : MainComponent| @@ -355,6 +358,8 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandle |onPointerUp||public Action<PointerEventData, BaseGraph> onPointerUp
鼠标弹起回调。 | |onScroll||public Action<PointerEventData, BaseGraph> onScroll
鼠标滚动回调。 | |CheckWarning()||public string CheckWarning()
检测警告信息。 | +|LocalPointToScreenPoint()|v3.7.0|public Vector2 LocalPointToScreenPoint(Vector2 localPoint)
图表内坐标转屏幕坐标。 | +|LocalPointToWorldPoint()|v3.7.0|public Vector2 LocalPointToWorldPoint(Vector2 localPoint)
图表内坐标转世界坐标。 | |OnBeginDrag()||public virtual void OnBeginDrag(PointerEventData eventData)| |OnDrag()||public virtual void OnDrag(PointerEventData eventData)| |OnEndDrag()||public virtual void OnEndDrag(PointerEventData eventData)| diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index ceed1398..5c3e5963 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -66,6 +66,7 @@ slug: /changelog ## master +* (2023.04.14) 增加`BaseChart`的`TriggerTooltip()`接口尝试触发`ToolTip` * (2023.04.12) 优化`RadarCood`设置`startAngle`时文本也跟随调整位置 * (2023.04.12) 增加`Radar`对通配符`{b}`的支持 * (2023.04.11) 修复动态添加组件时`Inspector`可能异常的问题 diff --git a/Runtime/Internal/BaseChart.API.cs b/Runtime/Internal/BaseChart.API.cs index fb8cf4d0..e999614b 100644 --- a/Runtime/Internal/BaseChart.API.cs +++ b/Runtime/Internal/BaseChart.API.cs @@ -667,5 +667,64 @@ namespace XCharts.Runtime SerieHelper.GetItemColor(out color, out toColor, serie, null, m_Theme); return color; } + + /// + /// trigger tooltip by data index. + /// |尝试触发指定数据项的Tooltip. + /// + /// 数据项索引 + /// + [Since("v3.7.0")] + public bool TriggerTooltip(int dataIndex) + { + var serie = GetSerie(0); + if (serie == null) return false; + var dataPoints = serie.context.dataPoints; + var dataPoint = Vector3.zero; + if (dataPoints.Count == 0) + { + if (serie.dataCount == 0) return false; + dataIndex = dataIndex % serie.dataCount; + var serieData = serie.GetSerieData(dataIndex); + if (serieData == null) return false; + dataPoint = serie.GetSerieData(dataIndex).context.position; + } + else + { + dataIndex = dataIndex % dataPoints.Count; + dataPoint = dataPoints[dataIndex]; + } + return TriggerTooltip(dataPoint); + } + + /// + /// trigger tooltip by chart local position. + /// |在指定的位置尝试触发Tooltip. + /// + /// + /// + [Since("v3.7.0")] + public bool TriggerTooltip(Vector3 localPosition) + { + var screenPoint = LocalPointToScreenPoint(localPosition); + var eventData = new PointerEventData(EventSystem.current); + eventData.position = screenPoint; + OnPointerEnter(eventData); + return true; + } + + /// + /// cancel tooltip. + /// |取消Tooltip. + /// + [Since("v3.7.0")] + public void CancelTooltip() + { + var tooltip = GetChartComponent(); + if (tooltip != null) + { + tooltip.SetActive(false); + } + } } } \ No newline at end of file diff --git a/Runtime/Internal/BaseGraph.API.cs b/Runtime/Internal/BaseGraph.API.cs index 499c24b1..553249f9 100644 --- a/Runtime/Internal/BaseGraph.API.cs +++ b/Runtime/Internal/BaseGraph.API.cs @@ -173,6 +173,32 @@ namespace XCharts.Runtime return true; } + /// + /// chart local point to screen point. + /// |图表内坐标转屏幕坐标。 + /// + /// 图表内的坐标 + /// 屏幕坐标 + [Since("v3.7.0")] + public Vector2 LocalPointToScreenPoint(Vector2 localPoint) + { + var cam = canvas.renderMode == RenderMode.ScreenSpaceOverlay ? null : canvas.worldCamera; + var wordPoint = rectTransform.TransformPoint(localPoint); + return RectTransformUtility.WorldToScreenPoint(cam, wordPoint); + } + + /// + /// chart local point to world point. + /// |图表内坐标转世界坐标。 + /// + /// 图表内的坐标 + /// 世界坐标 + [Since("v3.7.0")] + public Vector2 LocalPointToWorldPoint(Vector2 localPoint) + { + return rectTransform.TransformPoint(localPoint); + } + /// /// 保存图表为图片。 /// diff --git a/Runtime/Serie/Pie/PieHandler.cs b/Runtime/Serie/Pie/PieHandler.cs index 45bf20cf..c568a1e6 100644 --- a/Runtime/Serie/Pie/PieHandler.cs +++ b/Runtime/Serie/Pie/PieHandler.cs @@ -233,10 +233,12 @@ namespace XCharts.Runtime serieData.context.currentAngle = serieData.context.toAngle; } var halfDegree = (serieData.context.toAngle - startDegree) / 2; + var halfRadius = serie.context.insideRadius + (serieData.context.outsideRadius - serie.context.insideRadius) / 2; serieData.context.halfAngle = startDegree + halfDegree; serieData.context.angle = startDegree + halfDegree; serieData.context.offsetCenter = serie.context.center; serieData.context.insideRadius = serie.context.insideRadius; + serieData.context.position = ChartHelper.GetPosition(serie.context.center, serieData.context.halfAngle, halfRadius); if (offset > 0) { var currRad = serieData.context.halfAngle * Mathf.Deg2Rad;