From da360693e620eacf6d0f69bbf8d5cee6cb091c11 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Thu, 27 Mar 2025 08:31:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`Axis`=E7=9A=84`onLabelClick`?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Component/Axis/Axis.cs | 7 +++++ Runtime/Component/Axis/AxisHandler.cs | 28 +++++++++++++++++ Runtime/Internal/Object/ChartLabel.cs | 45 +++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index ff3bd9a4..c84e891d 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -80,6 +80,7 @@ slug: /changelog ## master +* (2025.03.27) 增加`Axis`的`onLabelClick`回调事件 * (2025.03.26) 增加`Animation`的`Exchange`排序交换动画 * (2025.03.22) 增加`Comment`的`layer`设置层级 * (2025.03.21) 优化`Comment`的坐标刷新 diff --git a/Runtime/Component/Axis/Axis.cs b/Runtime/Component/Axis/Axis.cs index 0d048a1c..c3e24d24 100644 --- a/Runtime/Component/Axis/Axis.cs +++ b/Runtime/Component/Axis/Axis.cs @@ -115,6 +115,13 @@ namespace XCharts.Runtime public AxisContext context = new AxisContext(); + private Action m_OnLabelClick; + /// + /// Callback function when click on the label. Parameters: clickPos, labelIndex, labelName. + /// ||点击文本标签回调函数。参数:clickPos, labelIndex, labelName。 + /// + [Since("v3.15.0")] + public Action onLabelClick { internal get { return m_OnLabelClick; } set { m_OnLabelClick = value; } } /// /// Whether to show axis. /// ||是否显示坐标轴。 diff --git a/Runtime/Component/Axis/AxisHandler.cs b/Runtime/Component/Axis/AxisHandler.cs index 793435ab..117afdda 100644 --- a/Runtime/Component/Axis/AxisHandler.cs +++ b/Runtime/Component/Axis/AxisHandler.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using UnityEngine; +using UnityEngine.EventSystems; using UnityEngine.UI; using XCharts.Runtime; using XUGL; @@ -32,6 +33,33 @@ namespace XCharts protected virtual Orient orient { get; set; } + public override void OnPointerClick(PointerEventData eventData) + { + if (component.onLabelClick == null) return; + var labelObjects = component.context.labelObjectList; + for (int i = 0; i < labelObjects.Count; i++) + { + var label = labelObjects[i]; + if (label == null) continue; + if (label.InRect(chart.pointerPos)) + { + component.onLabelClick.Invoke(chart.pointerPos, i, label.text.text.text); + break; + } + } + } + + // public override void DrawTop(VertexHelper vh) + // { + // var color = Color.red; + // color.a = 0.5f; + // foreach (var label in component.context.labelObjectList) + // { + // if (label == null) continue; + // UGL.DrawRectangle(vh, label.rect, color); + // } + // } + protected virtual void UpdatePointerValue(Axis axis) { var grid = chart.GetChartComponent(axis.gridIndex); diff --git a/Runtime/Internal/Object/ChartLabel.cs b/Runtime/Internal/Object/ChartLabel.cs index c43a6c91..06addfbd 100644 --- a/Runtime/Internal/Object/ChartLabel.cs +++ b/Runtime/Internal/Object/ChartLabel.cs @@ -53,6 +53,11 @@ namespace XCharts.Runtime } } + public bool InRect(Vector2 local) + { + return rect.Contains(local); + } + protected override void Awake() { raycastTarget = false; @@ -183,6 +188,7 @@ namespace XCharts.Runtime public void SetPosition(Vector3 position) { transform.localPosition = position; + UpdateRect(); } public void SetRectPosition(Vector3 position) @@ -264,6 +270,45 @@ namespace XCharts.Runtime m_Width = sizeDelta.x + m_PaddingLeft + m_PaddingRight; m_Height = sizeDelta.y + m_PaddingTop + m_PaddingBottom; objectRect.sizeDelta = new Vector2(m_Width, m_Height); + UpdateRect(); + } + } + + private void UpdateRect() + { + if (m_TextRect == null) return; + switch (text.alignment) + { + case TextAnchor.LowerLeft: + rect = new Rect(transform.localPosition.x, transform.localPosition.y, m_Width, m_Height); + break; + case TextAnchor.UpperLeft: + rect = new Rect(transform.localPosition.x, transform.localPosition.y - m_Height, m_Width, m_Height); + break; + case TextAnchor.MiddleLeft: + rect = new Rect(transform.localPosition.x, transform.localPosition.y - m_Height / 2, m_Width, m_Height); + break; + case TextAnchor.LowerRight: + rect = new Rect(transform.localPosition.x - m_Width, transform.localPosition.y, m_Width, m_Height); + break; + case TextAnchor.UpperRight: + rect = new Rect(transform.localPosition.x - m_Width, transform.localPosition.y - m_Height, m_Width, m_Height); + break; + case TextAnchor.MiddleRight: + rect = new Rect(transform.localPosition.x - m_Width, transform.localPosition.y - m_Height / 2, m_Width, m_Height); + break; + case TextAnchor.LowerCenter: + rect = new Rect(transform.localPosition.x - m_Width / 2, transform.localPosition.y, m_Width, m_Height); + break; + case TextAnchor.UpperCenter: + rect = new Rect(transform.localPosition.x - m_Width / 2, transform.localPosition.y - m_Height, m_Width, m_Height); + break; + case TextAnchor.MiddleCenter: + rect = new Rect(transform.localPosition.x - m_Width / 2, transform.localPosition.y - m_Height / 2, m_Width, m_Height); + break; + default: + rect = new Rect(transform.localPosition.x - m_Width / 2, transform.localPosition.y - m_Height / 2, m_Width, m_Height); + break; } }