diff --git a/CHANGELOG.md b/CHANGELOG.md index 12a3831e..9c4b7644 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # 更新日志 +* (2020.05.16) 增加部分鼠标事件回调 * (2020.05.15) 优化自带例子,`Demo`改名为`Example` * (2020.05.13) 增加`Serie`的`large`和`largeThreshold`参数配置折线图和柱状图的性能模式 * (2020.05.13) 完善Demo,增加性能演示Demo diff --git a/Documentation/XChartsAPI.md b/Documentation/XChartsAPI.md index 3b01237c..a04e61d0 100644 --- a/Documentation/XChartsAPI.md +++ b/Documentation/XChartsAPI.md @@ -13,7 +13,17 @@ * `BaseChart.series`:系列列表`Series`。 * `BaseChart.chartWidth`:图表的宽。 * `BaseChart.chartHeight`:图表的高。 -* `BaseChart.customDrawCallback`:自定义绘制回调函数。 +* `BaseChart.forceOpenRaycastTarget`:强制开启鼠标事件检测。一般不用手动设置,内部会自动判断是否需要检测。 +* `BaseChart.onCustomDraw`:自定义绘制回调。 +* `BaseChart.onPointerClick`:鼠标点击回调。 +* `BaseChart.onPointerDown`:鼠标按下回调。 +* `BaseChart.onPointerUp`:鼠标弹起回调。 +* `BaseChart.onPointerEnter`:鼠标进入图表回调。 +* `BaseChart.onPointerExit`:鼠标退出图表回调。 +* `BaseChart.onBeginDrag`:鼠标开始拖拽回调。 +* `BaseChart.onDrag`:鼠标拖拽回调。 +* `BaseChart.onEndDrag`:鼠标结束拖拽回调。 +* `BaseChart.onScroll`:鼠标滚动回调。 * `BaseChart.SetSize(float width, float height)`: 设置图表的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform)。 * `BaseChart.ClearData()`:清除所有数据,系列列表会保留,只是移除列表中系列的数据。 * `BaseChart.RemoveData()`:清除所有系列和图例数据,系列列表也会被清除。 @@ -49,6 +59,8 @@ * `BaseChart.AnimationResume()`:继续动画。 * `BaseChart.AnimationReset()`:重置动画。 * `BaseChart.ClickLegendButton(int legendIndex, string legendName, bool show)`:点击图例按钮。 +* `BaseChart.IsInChart(Vector2 local)`:坐标是否在图表范围内。 +* `BaseChart.IsInChart(float x, float y)`:坐标是否在图表范围内。 ## `CoordinateChart` @@ -70,6 +82,14 @@ * `CoordinateChart.IsValue()`:是否是纯数值坐标。 * `CoordinateChart.RefreshDataZoom()`:在下一帧刷新DataZoom组件。 * `CoordinateChart.RefreshAxisMinMaxValue()`:立即刷新数值坐标轴的最大最小值(更新坐标轴标签并触发重绘)。 +* `CoordinateChart.IsInCooridate(Vector2 local)`:坐标是否在坐标轴内。 +* `CoordinateChart.IsInCooridate(Vector3 local)`:坐标是否在坐标轴内。 +* `CoordinateChart.IsInCooridate(float x, float y)`:坐标是否在坐标轴内。 +* `CoordinateChart.IsInCooridate(Vector2 local)`:坐标是否在坐标轴内。 +* `CoordinateChart.ClampInCoordinate(Vector3 pos)`:将坐标限制在坐标系内。 +* `CoordinateChart.CovertXYAxis(int index)`:转换X轴和Y轴的配置。 +* `CoordinateChart.UpdateCoordinate()`:更新坐标系原点和宽高。一般内部会自动更新,也可强制更新。 +* `CoordinateChart.SetMaxCache(int maxCache)`:设置可缓存的最大数据量。当数据量超过该值时,会自动删除第一个值再加入最新值。 ## `LineChart` diff --git a/Examples/Runtime/Example02_ChartEvent.cs b/Examples/Runtime/Example02_ChartEvent.cs new file mode 100644 index 00000000..dd98e25e --- /dev/null +++ b/Examples/Runtime/Example02_ChartEvent.cs @@ -0,0 +1,65 @@ +/******************************************/ +/* */ +/* Copyright (c) 2018 monitor1394 */ +/* https://github.com/monitor1394 */ +/* */ +/******************************************/ + +using UnityEngine; +using UnityEngine.EventSystems; + +namespace XCharts.Examples +{ + [DisallowMultipleComponent] + [ExecuteInEditMode] + public class Example02_ChartEvent : MonoBehaviour + { + private float updateTime = 0; + BaseChart chart; + + void Awake() + { + chart = gameObject.GetComponent(); + if (chart == null) + { + chart = gameObject.AddComponent(); + } + chart.onPointerEnter = OnPointerEnter; + chart.onPointerExit = OnPointerExit; + chart.onPointerDown = OnPointerDown; + chart.onPointerUp = OnPointerUp; + chart.onPointerClick = OnPointerClick; + chart.onScroll = OnScroll; + } + + void OnPointerEnter(BaseChart chart, PointerEventData eventData) + { + //Debug.LogError("enter:" + chart); + } + + void OnPointerExit(BaseChart chart, PointerEventData eventData) + { + //Debug.LogError("exit:" + chart); + } + + void OnPointerDown(BaseChart chart, PointerEventData eventData) + { + //Debug.LogError("down:" + chart); + } + + void OnPointerUp(BaseChart chart, PointerEventData eventData) + { + //Debug.LogError("up:" + chart); + } + + void OnPointerClick(BaseChart chart, PointerEventData eventData) + { + //Debug.LogError("click:" + chart); + } + + void OnScroll(BaseChart chart, PointerEventData eventData) + { + //Debug.LogError("scroll:" + chart); + } + } +} \ No newline at end of file diff --git a/Examples/Runtime/Example02_ChartEvent.cs.meta b/Examples/Runtime/Example02_ChartEvent.cs.meta new file mode 100644 index 00000000..a57357ad --- /dev/null +++ b/Examples/Runtime/Example02_ChartEvent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c549dc496cd86467e8286252906562cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/Runtime/Example12_CustomDrawing.cs b/Examples/Runtime/Example12_CustomDrawing.cs index 6688e5c1..e8c88e12 100644 --- a/Examples/Runtime/Example12_CustomDrawing.cs +++ b/Examples/Runtime/Example12_CustomDrawing.cs @@ -21,7 +21,7 @@ namespace XCharts.Examples chart = gameObject.GetComponent(); if (chart == null) return; - chart.customDrawCallback = delegate (VertexHelper vh) + chart.onCustomDraw = delegate (VertexHelper vh) { var dataPoints = chart.series.list[0].dataPoints; if (dataPoints.Count > 0) diff --git a/Runtime/API/BaseChart_API.cs b/Runtime/API/BaseChart_API.cs index f88085dd..2a165d5c 100644 --- a/Runtime/API/BaseChart_API.cs +++ b/Runtime/API/BaseChart_API.cs @@ -9,6 +9,7 @@ using UnityEngine; using System.Collections.Generic; using System; using UnityEngine.UI; +using UnityEngine.EventSystems; namespace XCharts { @@ -88,7 +89,6 @@ namespace XCharts /// The position of chart. /// 图表的左下角起始坐标。 /// - /// public Vector3 chartPosition { get { return m_ChartPosition; } } public Rect chartRect { get { return m_ChartRect; } } /// @@ -97,13 +97,53 @@ namespace XCharts /// public Vector2 pointerPos { get; protected set; } /// - /// 自定义绘制回调。 - /// - public Action customDrawCallback { set { m_CustomDrawCallback = value; } } - /// /// 警告信息。 /// public string warningInfo { get; protected set; } + /// + /// 强制开启鼠标事件检测。 + /// + public bool forceOpenRaycastTarget { get { return m_ForceOpenRaycastTarget; } set { m_ForceOpenRaycastTarget = value; } } + /// + /// 自定义绘制回调。 + /// + public Action onCustomDraw { set { m_OnCustomDrawCallback = value; } } + /// + /// 鼠标点击回调。 + /// + public Action onPointerClick { set { m_OnPointerClick = value; m_ForceOpenRaycastTarget = true; } } + /// + /// 鼠标按下回调。 + /// + public Action onPointerDown { set { m_OnPointerDown = value; m_ForceOpenRaycastTarget = true; } } + /// + /// 鼠标弹起回调。 + /// + public Action onPointerUp { set { m_OnPointerUp = value; m_ForceOpenRaycastTarget = true; } } + /// + /// 鼠标进入回调。 + /// + public Action onPointerEnter { set { m_OnPointerEnter = value; m_ForceOpenRaycastTarget = true; } } + /// + /// 鼠标退出回调。 + /// + public Action onPointerExit { set { m_OnPointerExit = value; m_ForceOpenRaycastTarget = true; } } + /// + /// 鼠标开始拖拽回调。 + /// + public Action onBeginDrag { set { m_OnBeginDrag = value; m_ForceOpenRaycastTarget = true; } } + /// + /// 鼠标拖拽回调。 + /// + public Action onDrag { set { m_OnDrag = value; m_ForceOpenRaycastTarget = true; } } + /// + /// 鼠标结束拖拽回调。 + /// + public Action onEndDrag { set { m_OnEndDrag = value; m_ForceOpenRaycastTarget = true; } } + /// + /// 鼠标滚动回调。 + /// + public Action onScroll { set { m_OnScroll = value; m_ForceOpenRaycastTarget = true; } } /// /// 设置图表的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform) @@ -704,5 +744,8 @@ namespace XCharts [Obsolete("Use BaseChart.AnimationFadeOut() instead.", true)] public void MissAnimationStart() { } + + [Obsolete("Use onCustomDraw instead.", false)] + public Action customDrawCallback { set { m_OnCustomDrawCallback = value; } } } } diff --git a/Runtime/API/CoordinateChart_API.cs b/Runtime/API/CoordinateChart_API.cs index 60d3cb30..07eeb910 100644 --- a/Runtime/API/CoordinateChart_API.cs +++ b/Runtime/API/CoordinateChart_API.cs @@ -140,7 +140,6 @@ namespace XCharts /// reutrn true when all the show axis is `Value` type. /// 纯数值坐标轴(数值轴或对数轴)。 /// - /// public bool IsValue() { foreach (var axis in m_XAxises) @@ -154,6 +153,9 @@ namespace XCharts return true; } + /// + /// 纯类目轴。 + /// public bool IsCategory() { foreach (var axis in m_XAxises) @@ -167,6 +169,9 @@ namespace XCharts return true; } + /// + /// 坐标是否在坐标轴内。 + /// public bool IsInCooridate(Vector2 local) { return IsInCooridate(local.x, local.y); @@ -253,7 +258,7 @@ namespace XCharts } /// - /// 设置可缓存的最大数据量。 + /// 设置可缓存的最大数据量。当数据量超过该值时,会自动删除第一个值再加入最新值。 /// public void SetMaxCache(int maxCache) { diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 5d63a45c..ea9c7ceb 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -31,7 +31,7 @@ namespace XCharts } public partial class BaseChart : MaskableGraphic, IPointerDownHandler, IPointerUpHandler, - IPointerEnterHandler, IPointerExitHandler, IBeginDragHandler, + IPointerEnterHandler, IPointerExitHandler, IBeginDragHandler, IPointerClickHandler, IDragHandler, IEndDragHandler, IScrollHandler { protected static readonly string s_TitleObjectName = "title"; @@ -53,9 +53,20 @@ namespace XCharts [SerializeField] protected Series m_Series = Series.defaultSeries; [SerializeField] protected Settings m_Settings = new Settings(); [SerializeField] protected float m_Large = 1; - [SerializeField] protected Action m_CustomDrawCallback; [SerializeField] protected string m_DebugInfo = ""; + [SerializeField] protected Action m_OnCustomDrawCallback; + [SerializeField] protected Action m_OnPointerClick; + [SerializeField] protected Action m_OnPointerDown; + [SerializeField] protected Action m_OnPointerUp; + [SerializeField] protected Action m_OnPointerEnter; + [SerializeField] protected Action m_OnPointerExit; + [SerializeField] protected Action m_OnBeginDrag; + [SerializeField] protected Action m_OnDrag; + [SerializeField] protected Action m_OnEndDrag; + [SerializeField] protected Action m_OnScroll; + + [NonSerialized] private Theme m_CheckTheme = 0; [NonSerialized] protected Vector3 m_ChartPosition = Vector3.zero; [NonSerialized] protected Vector2 m_ChartMinAnchor; @@ -72,6 +83,7 @@ namespace XCharts [NonSerialized] protected bool m_IsPlayingAnimation = false; [NonSerialized] protected List m_LegendRealShowName = new List(); [NonSerialized] protected GameObject m_SerieLabelRoot; + [NonSerialized] protected bool m_ForceOpenRaycastTarget; protected Vector2 chartAnchorMax { get { return m_ChartMinAnchor; } } protected Vector2 chartAnchorMin { get { return m_ChartMaxAnchor; } } @@ -528,6 +540,7 @@ namespace XCharts private void CheckPointerPos() { + if (m_ForceOpenRaycastTarget) raycastTarget = true; var needCheck = (m_Tooltip.show && m_Tooltip.runtimeInited) || raycastTarget; if (needCheck) @@ -737,9 +750,9 @@ namespace XCharts vh.Clear(); DrawBackground(vh); DrawChart(vh); - if (m_CustomDrawCallback != null) + if (m_OnCustomDrawCallback != null) { - m_CustomDrawCallback(vh); + m_OnCustomDrawCallback(vh); } DrawTooltip(vh); m_RefreshLabel = true; @@ -886,36 +899,49 @@ namespace XCharts } } + public virtual void OnPointerClick(PointerEventData eventData) + { + if (m_OnPointerClick != null) m_OnPointerClick(this, eventData); + } + public virtual void OnPointerDown(PointerEventData eventData) { + if (m_OnPointerDown != null) m_OnPointerDown(this, eventData); } public virtual void OnPointerUp(PointerEventData eventData) { + if (m_OnPointerUp != null) m_OnPointerUp(this, eventData); } public virtual void OnPointerEnter(PointerEventData eventData) { + if (m_OnPointerEnter != null) m_OnPointerEnter(this, eventData); } public virtual void OnPointerExit(PointerEventData eventData) { + if (m_OnPointerExit != null) m_OnPointerExit(this, eventData); } public virtual void OnBeginDrag(PointerEventData eventData) { + if (m_OnBeginDrag != null) m_OnBeginDrag(this, eventData); } public virtual void OnEndDrag(PointerEventData eventData) { + if (m_OnEndDrag != null) m_OnEndDrag(this, eventData); } public virtual void OnDrag(PointerEventData eventData) { + if (m_OnDrag != null) m_OnDrag(this, eventData); } public virtual void OnScroll(PointerEventData eventData) { + if (m_OnScroll != null) m_OnScroll(this, eventData); } } } diff --git a/Runtime/Internal/CoordinateChart.cs b/Runtime/Internal/CoordinateChart.cs index 5908b222..463f45f3 100644 --- a/Runtime/Internal/CoordinateChart.cs +++ b/Runtime/Internal/CoordinateChart.cs @@ -1505,6 +1505,7 @@ namespace XCharts public override void OnBeginDrag(PointerEventData eventData) { + base.OnBeginDrag(eventData); if (Input.touchCount > 1) return; Vector2 pos; if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, @@ -1539,6 +1540,7 @@ namespace XCharts public override void OnDrag(PointerEventData eventData) { + base.OnDrag(eventData); if (Input.touchCount > 1) return; float deltaX = eventData.delta.x; float deltaPercent = deltaX / m_CoordinateWidth * 100; @@ -1634,6 +1636,7 @@ namespace XCharts public override void OnEndDrag(PointerEventData eventData) { + base.OnEndDrag(eventData); if (m_DataZoomDrag || m_DataZoomStartDrag || m_DataZoomEndDrag || m_DataZoomCoordinateDrag) { RefreshChart(); @@ -1647,6 +1650,7 @@ namespace XCharts public override void OnPointerDown(PointerEventData eventData) { + base.OnPointerDown(eventData); if (Input.touchCount > 1) return; Vector2 localPos; if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, @@ -1686,6 +1690,7 @@ namespace XCharts public override void OnScroll(PointerEventData eventData) { + base.OnScroll(eventData); if (Input.touchCount > 1) return; if (!m_DataZoom.enable || m_DataZoom.zoomLock) return; Vector2 pos; diff --git a/Runtime/PieChart.cs b/Runtime/PieChart.cs index f8f4b85c..9049559b 100644 --- a/Runtime/PieChart.cs +++ b/Runtime/PieChart.cs @@ -573,6 +573,8 @@ namespace XCharts public override void OnPointerDown(PointerEventData eventData) { + base.OnPointerDown(eventData); + Vector2 local; if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, canvas.worldCamera, out local))