From d67a922a74114f1f986e609539461a4f650499bd Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Wed, 7 Dec 2022 13:16:06 +0800 Subject: [PATCH 01/55] =?UTF-8?q?=E6=95=B4=E7=90=86=E5=92=8C=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Utilities/ChartEditorHelper.cs | 2 +- Editor/Widgets.meta | 8 ---- Editor/Widgets/ProgressBarEditor.cs | 51 ---------------------- Editor/Widgets/ProgressBarEditor.cs.meta | 11 ----- Editor/Windows/XChartsEditor.cs | 28 +++++++----- Runtime/Component/Background/Background.cs | 5 +-- Runtime/Internal/BaseChart.cs | 3 ++ Runtime/Internal/BaseGraph.API.cs | 5 +++ Runtime/Internal/BaseGraph.cs | 18 +++----- Runtime/Widgets/ProgressBar.cs | 51 ---------------------- Runtime/Widgets/ProgressBar.cs.meta | 11 ----- 11 files changed, 33 insertions(+), 160 deletions(-) delete mode 100644 Editor/Widgets.meta delete mode 100644 Editor/Widgets/ProgressBarEditor.cs delete mode 100644 Editor/Widgets/ProgressBarEditor.cs.meta delete mode 100644 Runtime/Widgets/ProgressBar.cs delete mode 100644 Runtime/Widgets/ProgressBar.cs.meta diff --git a/Editor/Utilities/ChartEditorHelper.cs b/Editor/Utilities/ChartEditorHelper.cs index 647e7166..859b5a9e 100644 --- a/Editor/Utilities/ChartEditorHelper.cs +++ b/Editor/Utilities/ChartEditorHelper.cs @@ -539,7 +539,7 @@ namespace XCharts.Editor return HEADER_HEIGHT; } - internal static bool DrawHeader(string title, bool state, bool drawBackground, SerializedProperty activeField, + public static bool DrawHeader(string title, bool state, bool drawBackground, SerializedProperty activeField, Action drawCallback, params HeaderMenuInfo[] menus) { var rect = GUILayoutUtility.GetRect(1f, HEADER_HEIGHT); diff --git a/Editor/Widgets.meta b/Editor/Widgets.meta deleted file mode 100644 index cd483900..00000000 --- a/Editor/Widgets.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b92d575a960f54e9a9417cca092d1e11 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Editor/Widgets/ProgressBarEditor.cs b/Editor/Widgets/ProgressBarEditor.cs deleted file mode 100644 index 112269b4..00000000 --- a/Editor/Widgets/ProgressBarEditor.cs +++ /dev/null @@ -1,51 +0,0 @@ -using UnityEditor; -using XCharts.Runtime; - -namespace XCharts.Editor -{ - [CustomEditor(typeof(ProgressBar), false)] - public class ProgressBarEditor : UnityEditor.Editor - { - - [MenuItem("XCharts/ProgressBar", priority = 200)] - [MenuItem("GameObject/XCharts/ProgressBar", priority = 200)] - public static void AddPyramidChart() - { - XChartsEditor.AddChart("ProgressBar"); - } - - protected SerializedProperty m_Script; - protected SerializedProperty m_Value; - protected SerializedProperty m_BackgroundColor; - protected SerializedProperty m_StartColor; - protected SerializedProperty m_EndColor; - protected SerializedProperty m_CornerRadius; - - protected virtual void OnEnable() - { - m_Script = serializedObject.FindProperty("m_Script"); - m_Value = serializedObject.FindProperty("m_Value"); - m_BackgroundColor = serializedObject.FindProperty("m_BackgroundColor"); - m_StartColor = serializedObject.FindProperty("m_StartColor"); - m_EndColor = serializedObject.FindProperty("m_EndColor"); - m_CornerRadius = serializedObject.FindProperty("m_CornerRadius"); - } - - public override void OnInspectorGUI() - { - serializedObject.Update(); - OnStartInspectorGUI(); - serializedObject.ApplyModifiedProperties(); - } - - protected virtual void OnStartInspectorGUI() - { - EditorGUILayout.PropertyField(m_Script); - EditorGUILayout.PropertyField(m_BackgroundColor); - EditorGUILayout.PropertyField(m_StartColor); - EditorGUILayout.PropertyField(m_EndColor); - EditorGUILayout.PropertyField(m_Value); - EditorGUILayout.PropertyField(m_CornerRadius); - } - } -} \ No newline at end of file diff --git a/Editor/Widgets/ProgressBarEditor.cs.meta b/Editor/Widgets/ProgressBarEditor.cs.meta deleted file mode 100644 index 37bbd287..00000000 --- a/Editor/Widgets/ProgressBarEditor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 17cd5e3604edc43e5b7b6bfc3c71857b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Editor/Windows/XChartsEditor.cs b/Editor/Windows/XChartsEditor.cs index ed33ec98..d72e84ff 100644 --- a/Editor/Windows/XChartsEditor.cs +++ b/Editor/Windows/XChartsEditor.cs @@ -56,24 +56,30 @@ namespace XCharts.Editor } public static T AddChart(string chartName) where T : BaseChart + { + XCThemeMgr.CheckReloadTheme(); + return AddGraph(chartName); + } + + public static T AddGraph(string graphName) where T : BaseGraph { var parent = GetParent(); if (parent == null) return null; XCThemeMgr.CheckReloadTheme(); - var chart = new GameObject(); - chart.name = GetName(parent, chartName); - chart.layer = LayerMask.NameToLayer("UI"); - var t = chart.AddComponent(); - chart.transform.SetParent(parent); - chart.transform.localScale = Vector3.one; - chart.transform.localPosition = Vector3.zero; - chart.transform.localRotation = Quaternion.Euler(0, 0, 0); - var rect = chart.GetComponent(); + var obj = new GameObject(); + obj.name = GetName(parent, graphName); + obj.layer = LayerMask.NameToLayer("UI"); + var t = obj.AddComponent(); + obj.transform.SetParent(parent); + obj.transform.localScale = Vector3.one; + obj.transform.localPosition = Vector3.zero; + obj.transform.localRotation = Quaternion.Euler(0, 0, 0); + var rect = obj.GetComponent(); rect.anchorMin = new Vector2(0.5f, 0.5f); rect.anchorMax = new Vector2(0.5f, 0.5f); rect.pivot = new Vector2(0.5f, 0.5f); - Selection.activeGameObject = chart; - EditorUtility.SetDirty(chart); + Selection.activeGameObject = obj; + EditorUtility.SetDirty(obj); return t; } diff --git a/Runtime/Component/Background/Background.cs b/Runtime/Component/Background/Background.cs index 68f212ce..bd230cf4 100644 --- a/Runtime/Component/Background/Background.cs +++ b/Runtime/Component/Background/Background.cs @@ -6,8 +6,7 @@ namespace XCharts.Runtime { /// /// Background component. - /// | - /// 背景组件。 + /// |背景组件。 /// [Serializable] [DisallowMultipleComponent] @@ -27,7 +26,7 @@ namespace XCharts.Runtime public bool show { get { return m_Show; } - internal set { if (PropertyUtil.SetStruct(ref m_Show, value)) SetComponentDirty(); } + set { if (PropertyUtil.SetStruct(ref m_Show, value)) SetComponentDirty(); } } /// /// the image of background. diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 7f1afd17..0815e8dc 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -18,6 +18,7 @@ namespace XCharts.Runtime [SerializeField] protected string m_ChartName; [SerializeField] protected ThemeStyle m_Theme = new ThemeStyle(); [SerializeField] protected Settings m_Settings; + [SerializeField] protected DebugInfo m_DebugInfo = new DebugInfo(); #pragma warning disable 0414 [SerializeField][ListForComponent(typeof(AngleAxis))] private List m_AngleAxes = new List(); @@ -67,6 +68,8 @@ namespace XCharts.Runtime public List components { get { return m_Components; } } public List series { get { return m_Series; } } + public DebugInfo debug { get { return m_DebugInfo; } } + public override HideFlags chartHideFlags { get { return m_DebugInfo.showAllChartObject ? HideFlags.None : HideFlags.HideInHierarchy; } } protected float m_ChartWidth; protected float m_ChartHeight; diff --git a/Runtime/Internal/BaseGraph.API.cs b/Runtime/Internal/BaseGraph.API.cs index f2c9c945..dae4f8da 100644 --- a/Runtime/Internal/BaseGraph.API.cs +++ b/Runtime/Internal/BaseGraph.API.cs @@ -36,6 +36,11 @@ namespace XCharts.Runtime /// public Vector3 graphPosition { get { return m_GraphPosition; } } public Rect graphRect { get { return m_GraphRect; } } + public Vector2 graphSizeDelta { get { return m_GraphSizeDelta; } } + public Vector2 graphPivot { get { return m_GraphPivot; } } + public Vector2 graphMinAnchor { get { return m_GraphMinAnchor; } } + public Vector2 graphMaxAnchor { get { return m_GraphMaxAnchor; } } + public Vector2 graphAnchoredPosition { get { return m_GraphAnchoredPosition; } } /// /// The postion of pointer. /// |鼠标位置。 diff --git a/Runtime/Internal/BaseGraph.cs b/Runtime/Internal/BaseGraph.cs index f5e52e10..a74da86a 100644 --- a/Runtime/Internal/BaseGraph.cs +++ b/Runtime/Internal/BaseGraph.cs @@ -10,9 +10,7 @@ namespace XCharts.Runtime IPointerEnterHandler, IPointerExitHandler, IBeginDragHandler, IPointerClickHandler, IDragHandler, IEndDragHandler, IScrollHandler { - [SerializeField] protected bool m_EnableTextMeshPro = false; - [SerializeField] protected DebugInfo m_DebugInfo = new DebugInfo(); protected Painter m_Painter; protected int m_SiblingIndex; @@ -45,11 +43,8 @@ namespace XCharts.Runtime protected Action m_OnEndDrag; protected Action m_OnScroll; - protected Vector2 graphAnchorMax { get { return m_GraphMinAnchor; } } - protected Vector2 graphAnchorMin { get { return m_GraphMaxAnchor; } } - protected Vector2 graphPivot { get { return m_GraphPivot; } } - public HideFlags chartHideFlags { get { return m_DebugInfo.showAllChartObject ? HideFlags.None : HideFlags.HideInHierarchy; } } - public DebugInfo debug { get { return m_DebugInfo; } } + public virtual HideFlags chartHideFlags { get { return HideFlags.None; } } + private ScrollRect m_ScrollRect; public Painter painter { get { return m_Painter; } } @@ -128,8 +123,7 @@ namespace XCharts.Runtime } #if UNITY_EDITOR - protected override void Reset() - { } + protected override void Reset() { } protected override void OnValidate() { @@ -253,16 +247,14 @@ namespace XCharts.Runtime m_RefreshChart = true; } - protected virtual void OnLocalPositionChanged() - { } + protected virtual void OnLocalPositionChanged() { } protected virtual void OnDrawPainterBase(VertexHelper vh, Painter painter) { DrawPainterBase(vh); } - protected virtual void DrawPainterBase(VertexHelper vh) - { } + protected virtual void DrawPainterBase(VertexHelper vh) { } public virtual void OnPointerClick(PointerEventData eventData) { diff --git a/Runtime/Widgets/ProgressBar.cs b/Runtime/Widgets/ProgressBar.cs deleted file mode 100644 index 8efac8a0..00000000 --- a/Runtime/Widgets/ProgressBar.cs +++ /dev/null @@ -1,51 +0,0 @@ -using UnityEngine; -using UnityEngine.UI; -using XUGL; - -namespace XCharts.Runtime -{ - [ExecuteInEditMode] - [RequireComponent(typeof(RectTransform))] - [DisallowMultipleComponent] - public class ProgressBar : BaseChart - { - [SerializeField][Range(0f, 1f)] private float m_Value = 0.5f; - [SerializeField] private Color m_BackgroundColor = new Color32(255, 233, 233, 255); - [SerializeField] private Color m_StartColor = Color.blue; - [SerializeField] private Color m_EndColor = Color.red; - [SerializeField] private float[] m_CornerRadius = new float[] { 0, 0, 0, 0 }; - - public float value { get { return m_Value; } set { m_Value = value; SetVerticesDirty(); } } - public Color32 backgroundColor { get { return m_BackgroundColor; } set { m_BackgroundColor = value; SetVerticesDirty(); } } - public Color32 startColor { get { return m_StartColor; } set { m_StartColor = value; SetVerticesDirty(); } } - public Color32 endColor { get { return m_EndColor; } set { m_EndColor = value; SetVerticesDirty(); } } - public float[] cornerRadius { get { return m_CornerRadius; } set { m_CornerRadius = value; SetVerticesDirty(); } } - -#if UNITY_EDITOR - protected override void Reset() - { - base.Reset(); - var title = GetOrAddChartComponent(); - title.text = "ProgressBar"; - title.show = false; - SetSize(580, 4); - RemoveData(); - } -#endif - - protected override void OnDrawPainterBase(VertexHelper vh, Painter painter) - { - vh.Clear(); - var centerPos = new Vector3(chartPosition.x + m_ChartWidth / 2, chartPosition.y + m_ChartHeight / 2); - UGL.DrawRoundRectangle(vh, centerPos, m_ChartWidth, m_ChartHeight, m_BackgroundColor, m_BackgroundColor, - 0, m_CornerRadius, true); - - var valueWidth = m_Value * m_ChartWidth; - var valuePos = new Vector3(chartPosition.x + valueWidth / 2, centerPos.y); - var endColor = Color.Lerp(m_StartColor, m_EndColor, m_Value); - UGL.DrawRoundRectangle(vh, valuePos, valueWidth, m_ChartHeight, m_StartColor, endColor, 0, - m_CornerRadius, true); - } - - } -} \ No newline at end of file diff --git a/Runtime/Widgets/ProgressBar.cs.meta b/Runtime/Widgets/ProgressBar.cs.meta deleted file mode 100644 index 1b34a707..00000000 --- a/Runtime/Widgets/ProgressBar.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cd18af5634e604a3c97fb1ff0fc5d682 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 927644fb1022a0b9b140c0ab58e855535ec1adba Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Wed, 7 Dec 2022 13:19:06 +0800 Subject: [PATCH 02/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`Formatter`=E7=9A=84?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E9=80=9A=E9=85=8D=E7=AC=A6`{h}`=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=AE=BE=E7=BD=AE=E5=BD=93=E5=89=8D=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Component/Tooltip/Tooltip.cs | 2 ++ Runtime/Helper/FormatterHelper.cs | 23 +++++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Runtime/Component/Tooltip/Tooltip.cs b/Runtime/Component/Tooltip/Tooltip.cs index 08a0b423..9a823d71 100644 --- a/Runtime/Component/Tooltip/Tooltip.cs +++ b/Runtime/Component/Tooltip/Tooltip.cs @@ -184,6 +184,7 @@ namespace XCharts.Runtime /// {c}为当前所指示或index为0的serie的y维(dimesion为1)的数值。<br/> /// {d}为当前所指示或index为0的serie的y维(dimesion为1)百分比值,注意不带%号。<br/> /// {e}为当前所指示或index为0的serie的数据项serieData的name。<br/> + /// {h}为当前所指示或index为0的serie的数据项serieData的十六进制颜色值。<br/> /// {f}为数据总和。<br/> /// {g}为数据总个数。<br/> /// {.1}表示指定index为1的serie对应颜色的圆点。<br/> @@ -224,6 +225,7 @@ namespace XCharts.Runtime /// {e}为当前所指示的serie或数据项的数据项serieData的name。<br/> /// {f}为当前所指示的serie的默认维度的数据总和。<br/> /// {g}为当前所指示的serie的数据总个数。<br/> + /// {h}为当前所指示的serie的十六进制颜色值。<br/> /// {c0}表示当前数据项维度为0的数据。<br/> /// {c1}表示当前数据项维度为1的数据。<br/> /// {d3}表示维度3的数据的百分比。它的分母是默认维度(一般是1维度)数据。<br/> diff --git a/Runtime/Helper/FormatterHelper.cs b/Runtime/Helper/FormatterHelper.cs index 02ddaea8..c91491a7 100644 --- a/Runtime/Helper/FormatterHelper.cs +++ b/Runtime/Helper/FormatterHelper.cs @@ -8,7 +8,7 @@ namespace XCharts.Runtime public static class FormatterHelper { public const string PH_NN = "\n"; - private static Regex s_Regex = new Regex(@"{([a-g|.]\d*)(:\d+(-\d+)?)?(:[c-g|x|p|r]\d*|:0\.#*)?}", RegexOptions.IgnoreCase); + private static Regex s_Regex = new Regex(@"{([a-h|.]\d*)(:\d+(-\d+)?)?(:[c-g|x|p|r]\d*|:0\.#*)?}", RegexOptions.IgnoreCase); private static Regex s_RegexSub = new Regex(@"(0\.#*)|(\d+-\d+)|(\w+)|(\.)", RegexOptions.IgnoreCase); private static Regex s_RegexN = new Regex(@"^\d+", RegexOptions.IgnoreCase); private static Regex s_RegexN_N = new Regex(@"\d+-\d+", RegexOptions.IgnoreCase); @@ -16,8 +16,8 @@ namespace XCharts.Runtime private static Regex s_RegexNewLine = new Regex(@"[\\|/]+n|</br>|<br>|<br/>", RegexOptions.IgnoreCase); private static Regex s_RegexForAxisLabel = new Regex(@"{value(:[c-g|x|p|r]\d*)?}", RegexOptions.IgnoreCase); private static Regex s_RegexSubForAxisLabel = new Regex(@"(value)|([c-g|x|p|r]\d*)", RegexOptions.IgnoreCase); - private static Regex s_RegexForSerieLabel = new Regex(@"{[a-g|\.]\d*(:[c-g|x|p|r]\d*)?}", RegexOptions.IgnoreCase); - private static Regex s_RegexSubForSerieLabel = new Regex(@"(\.)|([a-g]\d*)|([c-g|x|p|r]\d*)", RegexOptions.IgnoreCase); + private static Regex s_RegexForSerieLabel = new Regex(@"{[a-h|\.]\d*(:[c-g|x|p|r]\d*)?}", RegexOptions.IgnoreCase); + private static Regex s_RegexSubForSerieLabel = new Regex(@"(\.)|([a-h]\d*)|([c-g|x|p|r]\d*)", RegexOptions.IgnoreCase); public static bool NeedFormat(string content) { @@ -64,7 +64,7 @@ namespace XCharts.Runtime targetIndex = 0; } if (serie == null) continue; - if (p == '.') + if (p == '.' || p == 'h' || p == 'H') { var bIndex = targetIndex; if (argsCount >= 2) @@ -72,8 +72,15 @@ namespace XCharts.Runtime var args1Str = args[1].ToString(); if (s_RegexN.IsMatch(args1Str)) bIndex = int.Parse(args1Str); } - content = content.Replace(old, ChartCached.ColorToDotStr(chart.theme.GetColor(bIndex))); - foundDot = true; + if (p == '.') + { + content = content.Replace(old, ChartCached.ColorToDotStr(chart.theme.GetColor(bIndex))); + foundDot = true; + } + else + { + content = content.Replace(old, "#" + ChartCached.ColorToStr(chart.theme.GetColor(bIndex))); + } } else if (p == 'a' || p == 'A') { @@ -225,6 +232,10 @@ namespace XCharts.Runtime { content = content.Replace(old, ChartCached.NumberToStr(dataCount, numericFormatter)); } + else if (p == 'h' || p == 'H') + { + content = content.Replace(old, "#" + ChartCached.ColorToStr(color)); + } } content = TrimAndReplaceLine(content); } From d4a3886530e33bbad72a595b3971fa0166da074d Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 8 Dec 2022 07:32:33 +0800 Subject: [PATCH 03/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`AreaStyle`=E7=9A=84`to?= =?UTF-8?q?Top`=E5=8F=82=E6=95=B0=E5=8F=AF=E8=AE=BE=E7=BD=AE=E6=8A=98?= =?UTF-8?q?=E7=BA=BF=E5=9B=BE=E6=B8=90=E5=8F=98=E8=89=B2=E6=98=AF=E5=88=B0?= =?UTF-8?q?=E9=A1=B6=E9=83=A8=E8=BF=98=E6=98=AF=E5=88=B0=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/en/api.md | 35 +++++++++----------- Documentation~/en/configuration.md | 1 + Documentation~/zh/api.md | 35 +++++++++----------- Documentation~/zh/changelog.md | 3 ++ Documentation~/zh/configuration.md | 3 +- Editor/ChildComponents/AreaStyleDrawer.cs | 1 + Runtime/Component/Child/AreaStyle.cs | 11 +++++++ Runtime/Serie/Line/LineHelper.cs | 40 ++++++++++++++--------- Runtime/Serie/SerieHelper.cs | 9 +++-- 9 files changed, 79 insertions(+), 59 deletions(-) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index 167b4455..1e402b2a 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -24,22 +24,21 @@ slug: /api |[ListForSerie](#listforserie)|[MainComponentContext](#maincomponentcontext)|[MainComponentHandler](#maincomponenthandler)| |[MainComponentHandler<T>](#maincomponenthandlert)|[MathUtil](#mathutil)|[Painter](#painter)| |[ParallelChart](#parallelchart)|[ParallelCoordContext](#parallelcoordcontext)|[PieChart](#piechart)| -|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)|[ProgressBar](#progressbar)| -|[PropertyUtil](#propertyutil)|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)| -|[ReflectionUtil](#reflectionutil)|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)| -|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)| -|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)| -|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)| -|[SerieHandler<T>](#seriehandlert)|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)| -|[SerieLabelHelper](#serielabelhelper)|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)| -|[SeriesHelper](#serieshelper)|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)| -|[SimplifiedLineChart](#simplifiedlinechart)|[Since](#since)|[SVG](#svg)| -|[SVGImage](#svgimage)|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)| -|[TooltipContext](#tooltipcontext)|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)| -|[TooltipView](#tooltipview)|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)| -|[UGLExample](#uglexample)|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)| -|[VisualMapHelper](#visualmaphelper)|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)| -|[XCThemeMgr](#xcthememgr)| +|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)|[PropertyUtil](#propertyutil)| +|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)|[ReflectionUtil](#reflectionutil)| +|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)|[RuntimeUtil](#runtimeutil)| +|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)|[SerieConvertAttribute](#serieconvertattribute)| +|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)| +|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)|[SerieHandler<T>](#seriehandlert)| +|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)|[SerieLabelHelper](#serielabelhelper)| +|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)|[SeriesHelper](#serieshelper)| +|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)|[SimplifiedLineChart](#simplifiedlinechart)| +|[Since](#since)|[SVG](#svg)|[SVGImage](#svgimage)| +|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)|[TooltipContext](#tooltipcontext)| +|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)|[TooltipView](#tooltipview)| +|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)|[UGLExample](#uglexample)| +|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)|[VisualMapHelper](#visualmaphelper)| +|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)|[XCThemeMgr](#xcthememgr)| ## AnimationStyleHelper @@ -670,10 +669,6 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [MainComponentContext](#maincomponentcontext) -## ProgressBar - -Inherits or Implemented: [BaseChart](#basechart) - ## PropertyUtil |public method|description| diff --git a/Documentation~/en/configuration.md b/Documentation~/en/configuration.md index 8c744ced..dd4154e5 100644 --- a/Documentation~/en/configuration.md +++ b/Documentation~/en/configuration.md @@ -128,6 +128,7 @@ The style of area. |toColor|||Gradient color, start color to toColor. |opacity|0.6f||Opacity of the component. Supports value from 0 to 1, and the component will not be drawn when set to 0. |innerFill||v3.2.0|Whether to fill only polygonal areas. Currently, only convex polygons are supported. +|toTop|true|v3.6.0|Whether to fill the gradient color to the top. The default is true, which means that the gradient color is filled to the top. If it is false, the gradient color is filled to the actual position. ## ArrowStyle diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 50828bf4..0406800f 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -24,22 +24,21 @@ slug: /api |[ListForSerie](#listforserie)|[MainComponentContext](#maincomponentcontext)|[MainComponentHandler](#maincomponenthandler)| |[MainComponentHandler<T>](#maincomponenthandlert)|[MathUtil](#mathutil)|[Painter](#painter)| |[ParallelChart](#parallelchart)|[ParallelCoordContext](#parallelcoordcontext)|[PieChart](#piechart)| -|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)|[ProgressBar](#progressbar)| -|[PropertyUtil](#propertyutil)|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)| -|[ReflectionUtil](#reflectionutil)|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)| -|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)| -|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)| -|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)| -|[SerieHandler<T>](#seriehandlert)|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)| -|[SerieLabelHelper](#serielabelhelper)|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)| -|[SeriesHelper](#serieshelper)|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)| -|[SimplifiedLineChart](#simplifiedlinechart)|[Since](#since)|[SVG](#svg)| -|[SVGImage](#svgimage)|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)| -|[TooltipContext](#tooltipcontext)|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)| -|[TooltipView](#tooltipview)|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)| -|[UGLExample](#uglexample)|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)| -|[VisualMapHelper](#visualmaphelper)|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)| -|[XCThemeMgr](#xcthememgr)| +|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)|[PropertyUtil](#propertyutil)| +|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)|[ReflectionUtil](#reflectionutil)| +|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)|[RuntimeUtil](#runtimeutil)| +|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)|[SerieConvertAttribute](#serieconvertattribute)| +|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)| +|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)|[SerieHandler<T>](#seriehandlert)| +|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)|[SerieLabelHelper](#serielabelhelper)| +|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)|[SeriesHelper](#serieshelper)| +|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)|[SimplifiedLineChart](#simplifiedlinechart)| +|[Since](#since)|[SVG](#svg)|[SVGImage](#svgimage)| +|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)|[TooltipContext](#tooltipcontext)| +|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)|[TooltipView](#tooltipview)| +|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)|[UGLExample](#uglexample)| +|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)|[VisualMapHelper](#visualmaphelper)| +|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)|[XCThemeMgr](#xcthememgr)| ## AnimationStyleHelper @@ -670,10 +669,6 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [MainComponentContext](#maincomponentcontext) -## ProgressBar - -Inherits or Implemented: [BaseChart](#basechart) - ## PropertyUtil |public method|description| diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 653a6225..063431a8 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,9 @@ slug: /changelog ## master +* (2022.12.08) 增加`AreaStyle`的`toTop`参数可设置折线图渐变色是到顶部还是到实际位置 +* (2022.12.07) 增加`Formatter`的文本通配符`{h}`支持设置当前颜色值 + ## v3.5.0 版本要点: diff --git a/Documentation~/zh/configuration.md b/Documentation~/zh/configuration.md index c7719f26..6a2ef671 100644 --- a/Documentation~/zh/configuration.md +++ b/Documentation~/zh/configuration.md @@ -128,6 +128,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent |toColor|||渐变色的终点颜色。 |opacity|0.6f||图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。 |innerFill||v3.2.0|是否只填充多边形区域。目前只支持凸多边形。 +|toTop|true|v3.6.0|渐变色是到顶部还是到实际位置。默认为true到顶部。 ## ArrowStyle @@ -1364,7 +1365,7 @@ Inherits or Implemented: [MainComponent](#maincomponent) |trigger|||触发类型。<br/>`Tooltip.Trigger`:<br/>- `Item`: 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用。<br/>- `Axis`: 坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。<br/>- `None`: 什么都不触发。<br/>| |position||v3.3.0|显示位置类型。<br/>`Tooltip.Position`:<br/>- `Auto`: 自适应。移动平台靠顶部显示,非移动平台跟随鼠标位置。<br/>- `Custom`: 自定义。完全自定义显示位置(x,y)。<br/>- `FixedX`: 只固定坐标X。Y跟随鼠标位置。<br/>- `FixedY`: <br/>| |itemFormatter|||提示框单个serie或数据项内容的字符串模版格式器。支持用 \n 换行。用 -|titleFormatter|||提示框标题内容的字符串模版格式器。支持用 \n 换行。可以单独设置占位符{i}表示忽略不显示title。 模板变量有{.}、{a}、{b}、{c}、{d}、{e}、{f}、{g}。<br/> {.}为当前所指示或index为0的serie的对应颜色的圆点。<br/> {a}为当前所指示或index为0的serie的系列名name。<br/> {b}为当前所指示或index为0的serie的数据项serieData的name,或者类目值(如折线图的X轴)。<br/> {c}为当前所指示或index为0的serie的y维(dimesion为1)的数值。<br/> {d}为当前所指示或index为0的serie的y维(dimesion为1)百分比值,注意不带%号。<br/> {e}为当前所指示或index为0的serie的数据项serieData的name。<br/> {f}为数据总和。<br/> {g}为数据总个数。<br/> {.1}表示指定index为1的serie对应颜色的圆点。<br/> {a1}、{b1}、{c1}中的1表示指定index为1的serie。<br/> {c1:2}表示索引为1的serie的当前指示数据项的第3个数据(一个数据项有多个数据,index为2表示第3个数据)。<br/> {c1:2-2}表示索引为1的serie的第3个数据项的第3个数据(也就是要指定第几个数据项时必须要指定第几个数据)。<br/> {d1:2:f2}表示单独指定了数值的格式化字符串为f2(不指定时用numericFormatter)。<br/> {d:0.##} 表示单独指定了数值的格式化字符串为 0.## (用于百分比,保留2位有效数同时又能避免使用 f2 而出现的类似于"100.00%"的情况 )。<br/> 示例:"{a}:{c}"、"{a1}:{c1:f1}"、"{a1}:{c1:0:f1}"、"{a1}:{c1:1-1:f1}" +|titleFormatter|||提示框标题内容的字符串模版格式器。支持用 \n 换行。可以单独设置占位符{i}表示忽略不显示title。 模板变量有{.}、{a}、{b}、{c}、{d}、{e}、{f}、{g}。<br/> {.}为当前所指示或index为0的serie的对应颜色的圆点。<br/> {a}为当前所指示或index为0的serie的系列名name。<br/> {b}为当前所指示或index为0的serie的数据项serieData的name,或者类目值(如折线图的X轴)。<br/> {c}为当前所指示或index为0的serie的y维(dimesion为1)的数值。<br/> {d}为当前所指示或index为0的serie的y维(dimesion为1)百分比值,注意不带%号。<br/> {e}为当前所指示或index为0的serie的数据项serieData的name。<br/> {h}为当前所指示或index为0的serie的数据项serieData的十六进制颜色值。<br/> {f}为数据总和。<br/> {g}为数据总个数。<br/> {.1}表示指定index为1的serie对应颜色的圆点。<br/> {a1}、{b1}、{c1}中的1表示指定index为1的serie。<br/> {c1:2}表示索引为1的serie的当前指示数据项的第3个数据(一个数据项有多个数据,index为2表示第3个数据)。<br/> {c1:2-2}表示索引为1的serie的第3个数据项的第3个数据(也就是要指定第几个数据项时必须要指定第几个数据)。<br/> {d1:2:f2}表示单独指定了数值的格式化字符串为f2(不指定时用numericFormatter)。<br/> {d:0.##} 表示单独指定了数值的格式化字符串为 0.## (用于百分比,保留2位有效数同时又能避免使用 f2 而出现的类似于"100.00%"的情况 )。<br/> 示例:"{a}:{c}"、"{a1}:{c1:f1}"、"{a1}:{c1:0:f1}"、"{a1}:{c1:1-1:f1}" |marker|||serie的符号标志。 |fixedWidth|0||固定宽度。比 minWidth 优先。 |fixedHeight|0||固定高度。比 minHeight 优先。 diff --git a/Editor/ChildComponents/AreaStyleDrawer.cs b/Editor/ChildComponents/AreaStyleDrawer.cs index d26457fd..e5e8c80c 100644 --- a/Editor/ChildComponents/AreaStyleDrawer.cs +++ b/Editor/ChildComponents/AreaStyleDrawer.cs @@ -18,6 +18,7 @@ namespace XCharts.Editor PropertyField(prop, "m_Color"); PropertyField(prop, "m_ToColor"); PropertyField(prop, "m_Opacity"); + PropertyField(prop, "m_ToTop"); PropertyField(prop, "m_InnerFill"); --EditorGUI.indentLevel; } diff --git a/Runtime/Component/Child/AreaStyle.cs b/Runtime/Component/Child/AreaStyle.cs index 66984923..ddfcc5ce 100644 --- a/Runtime/Component/Child/AreaStyle.cs +++ b/Runtime/Component/Child/AreaStyle.cs @@ -38,6 +38,7 @@ namespace XCharts.Runtime [SerializeField] private Color32 m_ToColor; [SerializeField][Range(0, 1)] private float m_Opacity = 0.6f; [SerializeField][Since("v3.2.0")] private bool m_InnerFill; + [SerializeField][Since("v3.6.0")] private bool m_ToTop = true; /// <summary> /// Set this to false to prevent the areafrom showing. @@ -93,6 +94,16 @@ namespace XCharts.Runtime get { return m_InnerFill; } set { if (PropertyUtil.SetStruct(ref m_InnerFill, value)) SetVerticesDirty(); } } + /// <summary> + /// Whether to fill the gradient color to the top. The default is true, which means that the gradient color is filled to the top. + /// If it is false, the gradient color is filled to the actual position. + /// |渐变色是到顶部还是到实际位置。默认为true到顶部。 + /// </summary> + public bool toTop + { + get { return m_ToTop; } + set { if (PropertyUtil.SetStruct(ref m_ToTop, value)) SetVerticesDirty(); } + } public Color32 GetColor() { diff --git a/Runtime/Serie/Line/LineHelper.cs b/Runtime/Serie/Line/LineHelper.cs index 2998d5a5..45871a0e 100644 --- a/Runtime/Serie/Line/LineHelper.cs +++ b/Runtime/Serie/Line/LineHelper.cs @@ -25,8 +25,8 @@ namespace XCharts.Runtime ThemeStyle theme, VisualMap visualMap, bool isY, Axis axis, Axis relativedAxis, GridCoord grid) { Color32 areaColor, areaToColor; - bool innerFill; - if (!SerieHelper.GetAreaColor(out areaColor, out areaToColor, out innerFill, serie, null, theme, serie.context.colorIndex)) + bool innerFill, toTop; + if (!SerieHelper.GetAreaColor(out areaColor, out areaToColor, out innerFill, out toTop, serie, null, theme, serie.context.colorIndex)) { return; } @@ -47,7 +47,8 @@ namespace XCharts.Runtime visualMap, axis, relativedAxis, - grid); + grid, + toTop); } else { @@ -57,13 +58,14 @@ namespace XCharts.Runtime gridXY + (isY ? grid.context.width : grid.context.height), areaColor, areaToColor, - visualMap); + visualMap, + toTop); } } private static void DrawSerieLineNormalArea(VertexHelper vh, Serie serie, bool isY, float zero, float min, float max, Color32 areaColor, Color32 areaToColor, - VisualMap visualMap, Axis axis, Axis relativedAxis, GridCoord grid) + VisualMap visualMap, Axis axis, Axis relativedAxis, GridCoord grid, bool toTop) { var points = serie.context.drawPoints; var count = points.Count; @@ -117,7 +119,7 @@ namespace XCharts.Runtime if (UGLHelper.GetIntersection(lp, tp, zsp, zep, ref ip)) { if (lerp) - AddVertToVertexHelperWithLerpColor(vh, ip, ip, color, toColor, isY, min, max, i > 0); + AddVertToVertexHelperWithLerpColor(vh, ip, ip, color, toColor, isY, min, max, i > 0, toTop); else { if (lastDataIsIgnore) @@ -133,7 +135,7 @@ namespace XCharts.Runtime } if (lerp) - AddVertToVertexHelperWithLerpColor(vh, tp, zp, color, toColor, isY, min, max, i > 0); + AddVertToVertexHelperWithLerpColor(vh, tp, zp, color, toColor, isY, min, max, i > 0, toTop); else { if (lastDataIsIgnore) @@ -152,7 +154,7 @@ namespace XCharts.Runtime } private static void DrawSerieLineStackArea(VertexHelper vh, Serie serie, Serie lastStackSerie, bool isY, - float zero, float min, float max, Color32 color, Color32 toColor, VisualMap visualMap) + float zero, float min, float max, Color32 color, Color32 toColor, VisualMap visualMap, bool toTop) { if (lastStackSerie == null) return; @@ -170,7 +172,7 @@ namespace XCharts.Runtime var lbp = downPoints[0].position; if (lerp) - AddVertToVertexHelperWithLerpColor(vh, ltp, lbp, color, toColor, isY, min, max, false); + AddVertToVertexHelperWithLerpColor(vh, ltp, lbp, color, toColor, isY, min, max, false, toTop); else UGL.AddVertToVertexHelper(vh, ltp, lbp, color, false); @@ -216,7 +218,7 @@ namespace XCharts.Runtime } if (lerp) - AddVertToVertexHelperWithLerpColor(vh, tp, bp, color, toColor, isY, min, max, true); + AddVertToVertexHelperWithLerpColor(vh, tp, bp, color, toColor, isY, min, max, true, toTop); else UGL.AddVertToVertexHelper(vh, tp, bp, color, true); u++; @@ -234,12 +236,20 @@ namespace XCharts.Runtime } private static void AddVertToVertexHelperWithLerpColor(VertexHelper vh, Vector3 tp, Vector3 bp, - Color32 color, Color32 toColor, bool isY, float min, float max, bool needTriangle) + Color32 color, Color32 toColor, bool isY, float min, float max, bool needTriangle, bool toTop) { - var range = max - min; - var color1 = Color32.Lerp(color, toColor, ((isY ? tp.x : tp.y) - min) / range); - var color2 = Color32.Lerp(color, toColor, ((isY ? bp.x : bp.y) - min) / range); - UGL.AddVertToVertexHelper(vh, tp, bp, color1, color2, needTriangle); + if (toTop) + { + var range = max - min; + var color1 = Color32.Lerp(color, toColor, ((isY ? tp.x : tp.y) - min) / range); + var color2 = Color32.Lerp(color, toColor, ((isY ? bp.x : bp.y) - min) / range); + + UGL.AddVertToVertexHelper(vh, tp, bp, color1, color2, needTriangle); + } + else + { + UGL.AddVertToVertexHelper(vh, tp, bp, toColor, color, needTriangle); + } } internal static void DrawSerieLine(VertexHelper vh, ThemeStyle theme, Serie serie, VisualMap visualMap, diff --git a/Runtime/Serie/SerieHelper.cs b/Runtime/Serie/SerieHelper.cs index 3e4e52c5..674c6cad 100644 --- a/Runtime/Serie/SerieHelper.cs +++ b/Runtime/Serie/SerieHelper.cs @@ -542,16 +542,17 @@ namespace XCharts.Runtime public static bool GetAreaColor(out Color32 color, out Color32 toColor, Serie serie, SerieData serieData, ThemeStyle theme, int index) { - bool fill; - return GetAreaColor(out color, out toColor, out fill, serie, serieData, theme, index); + bool fill, toTop; + return GetAreaColor(out color, out toColor, out fill, out toTop, serie, serieData, theme, index); } public static bool GetAreaColor(out Color32 color, out Color32 toColor, out bool innerFill, - Serie serie, SerieData serieData, ThemeStyle theme, int index) + out bool toTop, Serie serie, SerieData serieData, ThemeStyle theme, int index) { color = ChartConst.clearColor32; toColor = ChartConst.clearColor32; innerFill = false; + toTop = true; var state = GetSerieState(serie, serieData); var stateStyle = GetStateStyle(serie, serieData, state); if (stateStyle == null) @@ -559,6 +560,7 @@ namespace XCharts.Runtime var areaStyle = GetAreaStyle(serie, serieData); if (areaStyle == null || !areaStyle.show) return false; innerFill = areaStyle.innerFill; + toTop = areaStyle.toTop; GetColor(ref color, areaStyle.color, serie.itemStyle.color, areaStyle.opacity, theme, index); GetColor(ref toColor, areaStyle.toColor, color, areaStyle.opacity, theme, index); switch (state) @@ -584,6 +586,7 @@ namespace XCharts.Runtime if (stateStyle.areaStyle.show) { innerFill = stateStyle.areaStyle.innerFill; + toTop = stateStyle.areaStyle.toTop; GetColor(ref color, stateStyle.areaStyle.color, stateStyle.itemStyle.color, stateStyle.areaStyle.opacity, theme, index); GetColor(ref color, stateStyle.areaStyle.toColor, color, stateStyle.areaStyle.opacity, theme, index); } From a3a25fe7c61ac60d79f85fed8fb94e5298e61930 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 12 Dec 2022 07:29:30 +0800 Subject: [PATCH 04/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Legend`=E7=9A=84`forma?= =?UTF-8?q?tter`=E8=AE=BE=E7=BD=AE=E4=B8=BA=E5=9B=BA=E5=AE=9A=E5=80=BC?= =?UTF-8?q?=E6=97=B6=E6=98=BE=E7=A4=BA=E4=B8=8D=E6=AD=A3=E5=B8=B8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Component/Legend/LegendHandler.cs | 6 ++-- Runtime/Internal/Utilities/ChartHelper.cs | 41 +++++++++++++++++++++-- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 063431a8..e6b92415 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2022.12.12) 修复`Legend`的`formatter`设置为固定值时显示不正常的问题 * (2022.12.08) 增加`AreaStyle`的`toTop`参数可设置折线图渐变色是到顶部还是到实际位置 * (2022.12.07) 增加`Formatter`的文本通配符`{h}`支持设置当前颜色值 diff --git a/Runtime/Component/Legend/LegendHandler.cs b/Runtime/Component/Legend/LegendHandler.cs index 52951bd8..64161d6c 100644 --- a/Runtime/Component/Legend/LegendHandler.cs +++ b/Runtime/Component/Legend/LegendHandler.cs @@ -55,6 +55,7 @@ namespace XCharts.Runtime chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta); legend.gameObject = legendObject; legendObject.hideFlags = chart.chartHideFlags; + //ChartHelper.DestoryGameObjectByMatch(legendObject.transform, "_"); SeriesHelper.UpdateSerieNameList(chart, ref chart.m_LegendRealShowName); legend.context.background = ChartHelper.AddIcon("background", legendObject.transform, 0, 0); legend.context.background.transform.SetSiblingIndex(0); @@ -85,13 +86,14 @@ namespace XCharts.Runtime for (int i = 0; i < datas.Count; i++) { if (!SeriesHelper.IsLegalLegendName(datas[i])) continue; - string legendName = GetFormatterContent(legend, i, datas[i]); + string legendName = datas[i]; + var legendContent = GetFormatterContent(legend, i, datas[i]); var readIndex = chart.m_LegendRealShowName.IndexOf(datas[i]); var active = chart.IsActiveByLegend(datas[i]); var bgColor = LegendHelper.GetIconColor(chart, legend, readIndex, datas[i], active); bgColor.a = legend.itemOpacity; var item = LegendHelper.AddLegendItem(chart, legend, i, datas[i], legendObject.transform, chart.theme, - legendName, bgColor, active, readIndex); + legendContent, bgColor, active, readIndex); legend.SetButton(legendName, item, totalLegend); ChartHelper.ClearEventListener(item.button.gameObject); ChartHelper.AddEventListener(item.button.gameObject, EventTriggerType.PointerDown, (data) => diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index 6d600da7..cc76d08a 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -123,14 +123,14 @@ namespace XCharts.Runtime GameObject.DestroyImmediate(go.gameObject, true); } } - public static void DestoryGameObjectByMatch(Transform parent, string match) + public static void DestoryGameObjectByMatch(Transform parent, string containString) { if (parent == null) return; var childCount = parent.childCount; for (int i = childCount - 1; i >= 0; i--) { var go = parent.GetChild(i); - if (go != null && go.name.StartsWith(match)) + if (go != null && go.name.Contains(containString)) { GameObject.DestroyImmediate(go.gameObject, true); } @@ -281,7 +281,7 @@ namespace XCharts.Runtime return chartText; } - internal static Painter AddPainterObject(string name, Transform parent, Vector2 anchorMin, Vector2 anchorMax, + public static Painter AddPainterObject(string name, Transform parent, Vector2 anchorMin, Vector2 anchorMax, Vector2 pivot, Vector2 sizeDelta, HideFlags hideFlags, int siblingIndex) { var painterObj = ChartHelper.AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); @@ -381,6 +381,41 @@ namespace XCharts.Runtime return label; } + public static ChartLabel AddChartLabel2(string name, Transform parent, LabelStyle labelStyle, + ComponentTheme theme, string content, Color autoColor, TextAnchor autoAlignment = TextAnchor.MiddleCenter) + { + Vector2 anchorMin, anchorMax, pivot; + var sizeDelta = new Vector2(labelStyle.width, labelStyle.height); + var textStyle = labelStyle.textStyle; + var alignment = textStyle.GetAlignment(autoAlignment); + UpdateAnchorAndPivotByTextAlignment(alignment, out anchorMin, out anchorMax, out pivot); + var vector0_5 = new Vector2(0.5f, 0.5f); + var labelObj = AddObject(name, parent, vector0_5, vector0_5, vector0_5, sizeDelta); + var label = GetOrAddComponent<ChartLabel>(labelObj); + label.text = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, + sizeDelta, textStyle, theme, autoColor, autoAlignment, label.text); + label.icon = ChartHelper.AddIcon("Icon", label.gameObject.transform, labelStyle.icon); + label.SetSize(labelStyle.width, labelStyle.height); + label.SetTextPadding(labelStyle.textPadding); + label.SetText(content); + label.UpdateIcon(labelStyle.icon); + if (labelStyle.background.show) + { + label.color = (!labelStyle.background.autoColor || autoColor == Color.clear) ? + labelStyle.background.color : autoColor; + label.sprite = labelStyle.background.sprite; + label.type = labelStyle.background.type; + } + else + { + label.color = Color.clear; + label.sprite = null; + } + label.transform.localEulerAngles = new Vector3(0, 0, labelStyle.rotate); + label.transform.localPosition = labelStyle.offset; + return label; + } + private static void UpdateAnchorAndPivotByTextAlignment(TextAnchor alignment, out Vector2 anchorMin, out Vector2 anchorMax, out Vector2 pivot) { From ce1691e1cec1405b5dc4f2c1f037cc3770a28c42 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 12 Dec 2022 13:15:29 +0800 Subject: [PATCH 05/55] =?UTF-8?q?=E4=BC=98=E5=8C=96`Legend`=E7=9A=84`forma?= =?UTF-8?q?tter`=E6=94=AF=E6=8C=81`{h}`=E9=80=9A=E9=85=8D=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Component/Legend/LegendHandler.cs | 2 +- Runtime/Helper/FormatterHelper.cs | 20 +++++++++++--------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index e6b92415..625ae1c7 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2022.12.12) 优化`Legend`的`formatter`支持`{h}`通配符 * (2022.12.12) 修复`Legend`的`formatter`设置为固定值时显示不正常的问题 * (2022.12.08) 增加`AreaStyle`的`toTop`参数可设置折线图渐变色是到顶部还是到实际位置 * (2022.12.07) 增加`Formatter`的文本通配符`{h}`支持设置当前颜色值 diff --git a/Runtime/Component/Legend/LegendHandler.cs b/Runtime/Component/Legend/LegendHandler.cs index 64161d6c..21f0e81f 100644 --- a/Runtime/Component/Legend/LegendHandler.cs +++ b/Runtime/Component/Legend/LegendHandler.cs @@ -156,7 +156,7 @@ namespace XCharts.Runtime var content = legend.formatter.Replace("{name}", category); content = content.Replace("{value}", category); var serie = chart.GetSerie(0); - FormatterHelper.ReplaceContent(ref content, dataIndex, legend.numericFormatter, serie, chart); + FormatterHelper.ReplaceContent(ref content, dataIndex, legend.numericFormatter, serie, chart, category); return content; } } diff --git a/Runtime/Helper/FormatterHelper.cs b/Runtime/Helper/FormatterHelper.cs index c91491a7..45a5087e 100644 --- a/Runtime/Helper/FormatterHelper.cs +++ b/Runtime/Helper/FormatterHelper.cs @@ -25,7 +25,7 @@ namespace XCharts.Runtime } /// <summary> - /// 替换字符串中的通配符,支持的通配符有{.}、{a}、{b}、{c}、{d}、{e}、{f}、{g}。 + /// 替换字符串中的通配符,支持的通配符有{.}、{a}、{b}、{c}、{d}、{e}、{f}、{g}、{h}。 /// </summary> /// <param name="content">要替换的字符串</param> /// <param name="dataIndex">选中的数据项serieData索引</param> @@ -34,10 +34,9 @@ namespace XCharts.Runtime /// <param name="series">所有serie</param> /// <param name="theme">用来获取指定index的颜色</param> /// <param name="category">选中的类目,一般用在折线图和柱状图</param> - /// <param name="dataZoom">dataZoom</param> /// <returns></returns> public static bool ReplaceContent(ref string content, int dataIndex, string numericFormatter, Serie serie, - BaseChart chart, DataZoom dataZoom = null) + BaseChart chart, string colorName = null) { var foundDot = false; var mc = s_Regex.Matches(content); @@ -66,20 +65,23 @@ namespace XCharts.Runtime if (serie == null) continue; if (p == '.' || p == 'h' || p == 'H') { - var bIndex = targetIndex; + var bIndex = dataIndex; if (argsCount >= 2) { var args1Str = args[1].ToString(); if (s_RegexN.IsMatch(args1Str)) bIndex = int.Parse(args1Str); } + var color = string.IsNullOrEmpty(colorName) ? + (Color) chart.GetMarkColor(serie, serie.GetSerieData(bIndex)) : + SeriesHelper.GetNameColor(chart, bIndex, colorName); if (p == '.') { - content = content.Replace(old, ChartCached.ColorToDotStr(chart.theme.GetColor(bIndex))); + content = content.Replace(old, ChartCached.ColorToDotStr(color)); foundDot = true; } else { - content = content.Replace(old, "#" + ChartCached.ColorToStr(chart.theme.GetColor(bIndex))); + content = content.Replace(old, "#" + ChartCached.ColorToStr(color)); } } else if (p == 'a' || p == 'A') @@ -100,12 +102,12 @@ namespace XCharts.Runtime var needCategory = (p != 'e' && p != 'E') && (serie is Line || serie is Bar); if (needCategory) { - var category = chart.GetTooltipCategory(dataIndex, serie, dataZoom); + var category = chart.GetTooltipCategory(dataIndex, serie); content = content.Replace(old, category); } else { - var serieData = serie.GetSerieData(bIndex, dataZoom); + var serieData = serie.GetSerieData(bIndex); content = content.Replace(old, serieData.name); } } @@ -151,7 +153,7 @@ namespace XCharts.Runtime { numericFormatter = SerieHelper.GetNumericFormatter(serie, serie.GetSerieData(bIndex), ""); } - var value = serie.GetData(bIndex, dimensionIndex, dataZoom); + var value = serie.GetData(bIndex, dimensionIndex); if (isPercent) { var total = serie.GetDataTotal(dimensionIndex, serie.GetSerieData(bIndex)); From a5aa630b747904f6ecfced91ca88273b3670cf6c Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 12 Dec 2022 13:41:04 +0800 Subject: [PATCH 06/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Axis`=E7=9A=84`Value`?= =?UTF-8?q?=E8=BD=B4=E5=9C=A8=E6=9F=90=E4=BA=9B=E6=83=85=E5=86=B5=E4=B8=8B?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E6=95=B0=E5=80=BC=E8=8C=83=E5=9B=B4=E4=B8=8D?= =?UTF-8?q?=E5=87=86=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Internal/Utilities/ChartHelper.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 625ae1c7..f89fac30 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2022.12.12) 修复`Axis`的`Value`轴在某些情况下计算数值范围不准确的问题 * (2022.12.12) 优化`Legend`的`formatter`支持`{h}`通配符 * (2022.12.12) 修复`Legend`的`formatter`设置为固定值时显示不正常的问题 * (2022.12.08) 增加`AreaStyle`的`toTop`参数可设置折线图渐变色是到顶部还是到实际位置 diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index cc76d08a..2b8a88f8 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -713,7 +713,7 @@ namespace XCharts.Runtime } if (ceilRate == 0) { - var bigger = Math.Floor(Math.Abs(min)); + var bigger = min < 0 ? Math.Ceiling(Math.Abs(min)) : Math.Floor(Math.Abs(min)); int n = 1; while (bigger / (Mathf.Pow(10, n)) > 10) { From d7cfda2521a80d73cfd7a674c0a8df2d8a5a2ddb Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 22 Dec 2022 21:51:08 +0800 Subject: [PATCH 07/55] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Internal/BaseChart.API.cs | 10 ---------- Runtime/Internal/BaseChart.cs | 6 ------ Runtime/Internal/BaseGraph.API.cs | 17 +++++++++++++++++ Runtime/Internal/Object/ChartLabel.cs | 1 + Runtime/Internal/Painter.cs | 2 +- Runtime/Internal/Utilities/ChartHelper.cs | 6 ++++++ 6 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Runtime/Internal/BaseChart.API.cs b/Runtime/Internal/BaseChart.API.cs index 84847cca..f51f8a5b 100644 --- a/Runtime/Internal/BaseChart.API.cs +++ b/Runtime/Internal/BaseChart.API.cs @@ -631,15 +631,5 @@ namespace XCharts.Runtime SerieHelper.GetItemColor(out color, out toColor, serie, null, m_Theme); return color; } - - /// <summary> - /// 保存图表为图片。 - /// </summary> - /// <param name="imageType">type of image: png, jpg, exr</param> - /// <param name="savePath">save path</param> - public void SaveAsImage(string imageType = "png", string savePath = "") - { - StartCoroutine(SaveAsImageSync(imageType, savePath)); - } } } \ No newline at end of file diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 0815e8dc..10499ebb 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -746,11 +746,5 @@ namespace XCharts.Runtime InitComponentHandlers(); InitSerieHandlers(); } - - private IEnumerator SaveAsImageSync(string imageType, string path) - { - yield return new WaitForEndOfFrame(); - ChartHelper.SaveAsImage(rectTransform, canvas, imageType, path); - } } } \ No newline at end of file diff --git a/Runtime/Internal/BaseGraph.API.cs b/Runtime/Internal/BaseGraph.API.cs index dae4f8da..d15276ff 100644 --- a/Runtime/Internal/BaseGraph.API.cs +++ b/Runtime/Internal/BaseGraph.API.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using UnityEngine; using UnityEngine.EventSystems; @@ -170,5 +171,21 @@ namespace XCharts.Runtime } return true; } + + /// <summary> + /// 保存图表为图片。 + /// </summary> + /// <param name="imageType">type of image: png, jpg, exr</param> + /// <param name="savePath">save path</param> + public void SaveAsImage(string imageType = "png", string savePath = "") + { + StartCoroutine(SaveAsImageSync(imageType, savePath)); + } + + private IEnumerator SaveAsImageSync(string imageType, string path) + { + yield return new WaitForEndOfFrame(); + ChartHelper.SaveAsImage(rectTransform, canvas, imageType, path); + } } } \ No newline at end of file diff --git a/Runtime/Internal/Object/ChartLabel.cs b/Runtime/Internal/Object/ChartLabel.cs index 746e17fb..bf609c64 100644 --- a/Runtime/Internal/Object/ChartLabel.cs +++ b/Runtime/Internal/Object/ChartLabel.cs @@ -40,6 +40,7 @@ namespace XCharts.Runtime public bool hideIconIfTextEmpty { set { m_HideIconIfTextEmpty = value; } } public bool isIconActive { get; private set; } public bool isAnimationEnd { get; internal set; } + public Rect rect { get; set; } internal RectTransform objectRect { diff --git a/Runtime/Internal/Painter.cs b/Runtime/Internal/Painter.cs index c60041a9..b1ac47b4 100644 --- a/Runtime/Internal/Painter.cs +++ b/Runtime/Internal/Painter.cs @@ -51,7 +51,7 @@ namespace XCharts.Runtime Init(); } - internal void CheckRefresh() + public void CheckRefresh() { if (m_Refresh && gameObject.activeSelf) { diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index 2b8a88f8..8f3b7d6f 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -324,14 +324,20 @@ namespace XCharts.Runtime if (background == null) return; if (imageStyle.show) { + background.gameObject.SetActive(true); background.sprite = imageStyle.sprite; background.color = imageStyle.color; background.type = imageStyle.type; + if (imageStyle.width > 0 && imageStyle.height > 0) + { + background.rectTransform.sizeDelta = new Vector2(imageStyle.width, imageStyle.height); + } } else { background.sprite = null; background.color = Color.clear; + background.gameObject.SetActive(false); } } From d9053db2e38eb260c252fe1d26eda94a81fb681f Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 22 Dec 2022 22:15:58 +0800 Subject: [PATCH 08/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Covert=20XY=20Axis`?= =?UTF-8?q?=E5=90=8EY=E8=BD=B4=E7=9A=84`Label`=E6=98=BE=E7=A4=BA=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Component/Axis/AxisHelper.cs | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index f89fac30..20a467e2 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2022.12.22) 修复`Covert XY Axis`后Y轴的`Label`显示异常的问题 * (2022.12.12) 修复`Axis`的`Value`轴在某些情况下计算数值范围不准确的问题 * (2022.12.12) 优化`Legend`的`formatter`支持`{h}`通配符 * (2022.12.12) 修复`Legend`的`formatter`设置为固定值时显示不正常的问题 diff --git a/Runtime/Component/Axis/AxisHelper.cs b/Runtime/Component/Axis/AxisHelper.cs index ea78584a..a5ec4df7 100644 --- a/Runtime/Component/Axis/AxisHelper.cs +++ b/Runtime/Component/Axis/AxisHelper.cs @@ -65,8 +65,9 @@ namespace XCharts.Runtime if (axis.splitNumber <= 0) { var eachWid = coordinateWid / dataCount; - if (eachWid > 80) return dataCount; - var tick = Mathf.CeilToInt(80 / eachWid); + var min = axis is YAxis ? 20 : 80; + if (eachWid > min) return dataCount; + var tick = Mathf.CeilToInt(min / eachWid); return (int) (dataCount / tick); } else From bc6c387db3335bb452a00ec40130591fc1b41577 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 22 Dec 2022 22:26:10 +0800 Subject: [PATCH 09/55] =?UTF-8?q?=E8=B0=83=E6=95=B4`Covert`=E9=87=8D?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E4=B8=BA`Convert`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/en/api.md | 11 ++++++----- Documentation~/en/changelog.md | 2 +- Documentation~/zh/api.md | 11 ++++++----- Documentation~/zh/changelog.md | 5 +++-- Editor/Charts/BaseChartEditor.cs | 6 +++--- Editor/Series/SerieListEditor.cs | 12 ++++++------ Runtime/Internal/BaseChart.API.cs | 2 +- Runtime/Internal/BaseChart.Serie.cs | 10 +++++----- Runtime/Serie/Bar/Bar.cs | 2 +- Runtime/Serie/Bar/SimplifiedBar.cs | 2 +- Runtime/Serie/Candlestick/SimplifiedCandlestick.cs | 2 +- Runtime/Serie/Line/Line.cs | 2 +- Runtime/Serie/Line/SimplifiedLine.cs | 2 +- Runtime/Serie/Pie/Pie.cs | 2 +- 14 files changed, 37 insertions(+), 34 deletions(-) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index 1e402b2a..6b53b7ce 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -129,9 +129,9 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver | ClearData() |public virtual void ClearData()<br/>Clear all components and series data. Note: serie only empties the data and does not remove serie. | | ClearSerieData() |public virtual void ClearSerieData()<br/>Clear the data of all series. | | ClickLegendButton() |public void ClickLegendButton(int legendIndex, string legendName, bool show)<br/>点击图例按钮 | -| CovertSerie() |public bool CovertSerie(Serie serie, Type type)| -| CovertSerie<T>() |public bool CovertSerie<T>(Serie serie) where T : Serie| -| CovertXYAxis() |public void CovertXYAxis(int index)<br/>转换X轴和Y轴的配置 | +| ConvertSerie() |public bool ConvertSerie(Serie serie, Type type)| +| ConvertSerie<T>() |public bool ConvertSerie<T>(Serie serie) where T : Serie| +| ConvertXYAxis() |public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | | GenerateDefaultSerieName() |public string GenerateDefaultSerieName()| | GetAllSerieDataCount() |public int GetAllSerieDataCount()| | GetChartBackgroundColor() |public Color32 GetChartBackgroundColor()| @@ -227,7 +227,6 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver | RemoveSerie<T>() |public void RemoveSerie<T>() where T : Serie| | ReplaceSerie() |public bool ReplaceSerie(Serie oldSerie, Serie newSerie)| | ResetDataIndex() |public bool ResetDataIndex(int serieIndex)<br/>重置serie的数据项索引。避免数据项索引异常。 | -| SaveAsImage() |public void SaveAsImage(string imageType = "png", string savePath = "")<br/>保存图表为图片。 | | SetBasePainterMaterial() |public void SetBasePainterMaterial(Material material)<br/>设置Base Painter的材质球 | | SetMaxCache() |public void SetMaxCache(int maxCache)<br/>设置可缓存的最大数据量。当数据量超过该值时,会自动删除第一个值再加入最新值。 | | SetPainterActive() |public void SetPainterActive(int index, bool flag)| @@ -276,6 +275,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandle | RebuildChartObject() |public void RebuildChartObject()<br/>移除并重新创建所有图表的Object。 | | RefreshAllComponent() |public void RefreshAllComponent()| | RefreshGraph() |public virtual void RefreshGraph()<br/>Redraw graph in next frame. | +| SaveAsImage() |public void SaveAsImage(string imageType = "png", string savePath = "")<br/>保存图表为图片。 | | ScreenPointToChartPoint() |public bool ScreenPointToChartPoint(Vector2 screenPoint, out Vector2 chartPoint)| | SetPainterDirty() |public void SetPainterDirty()<br/>重新初始化Painter | | SetSize() |public virtual void SetSize(float width, float height)<br/>设置图形的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform) | @@ -312,7 +312,7 @@ Inherits or Implemented: [BaseChart](#basechart) | CopyList<T>() |public static bool CopyList<T>(List<T> toList, List<T> fromList)| | DestoryGameObject() |public static void DestoryGameObject(GameObject go)| | DestoryGameObject() |public static void DestoryGameObject(Transform parent, string childName)| -| DestoryGameObjectByMatch() |public static void DestoryGameObjectByMatch(Transform parent, string match)| +| DestoryGameObjectByMatch() |public static void DestoryGameObjectByMatch(Transform parent, string containString)| | DestroyAllChildren() |public static void DestroyAllChildren(Transform parent)| | GetActualValue() |public static float GetActualValue(float valueOrRate, float total, float maxRate = 1.5f)| | GetAngle360() |public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | @@ -645,6 +645,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) |public method|description| |--|--| +| CheckRefresh() |public void CheckRefresh()| | Init() |public void Init()| | Refresh() |public void Refresh()| | SetActive() |public void SetActive(bool flag, bool isDebugMode = false)| diff --git a/Documentation~/en/changelog.md b/Documentation~/en/changelog.md index e353fe6b..d8b1a28a 100644 --- a/Documentation~/en/changelog.md +++ b/Documentation~/en/changelog.md @@ -610,7 +610,7 @@ Details: * (2020.04.19) 优化`LineChart`折线图的区域填充渐变效果 * (2020.04.19) 增加`AxisLabel`的`onZero`参数可将`Label`显示在`0`刻度上 * (2020.04.19) 增加`Serie`和`AxisLabel`的`showAsPositiveNumber`参数将负数数值显示为正数 -* (2020.04.18) 增加`Covert XY Axis`互换XY轴配置 +* (2020.04.18) 增加`Convert XY Axis`互换XY轴配置 * (2020.04.17) 增加`Axis`可通过`inverse`参数设置坐标轴反转 * (2020.04.16) 修复`Check warning`在`Unity2019.3`上的显示问题 * (2020.04.16) 修复`PieChart`在设置`Space`参数后动画绘制异常的问题 diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 0406800f..4d722bc6 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -129,9 +129,9 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver | ClearData() |public virtual void ClearData()<br/>清空所有组件和Serie的数据。注意:Serie只是清空数据,不会移除Serie。 | | ClearSerieData() |public virtual void ClearSerieData()<br/>清空所有serie的数据。 | | ClickLegendButton() |public void ClickLegendButton(int legendIndex, string legendName, bool show)<br/>点击图例按钮 | -| CovertSerie() |public bool CovertSerie(Serie serie, Type type)| -| CovertSerie<T>() |public bool CovertSerie<T>(Serie serie) where T : Serie| -| CovertXYAxis() |public void CovertXYAxis(int index)<br/>转换X轴和Y轴的配置 | +| ConvertSerie() |public bool ConvertSerie(Serie serie, Type type)| +| ConvertSerie<T>() |public bool ConvertSerie<T>(Serie serie) where T : Serie| +| ConvertXYAxis() |public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | | GenerateDefaultSerieName() |public string GenerateDefaultSerieName()| | GetAllSerieDataCount() |public int GetAllSerieDataCount()| | GetChartBackgroundColor() |public Color32 GetChartBackgroundColor()| @@ -227,7 +227,6 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver | RemoveSerie<T>() |public void RemoveSerie<T>() where T : Serie| | ReplaceSerie() |public bool ReplaceSerie(Serie oldSerie, Serie newSerie)| | ResetDataIndex() |public bool ResetDataIndex(int serieIndex)<br/>重置serie的数据项索引。避免数据项索引异常。 | -| SaveAsImage() |public void SaveAsImage(string imageType = "png", string savePath = "")<br/>保存图表为图片。 | | SetBasePainterMaterial() |public void SetBasePainterMaterial(Material material)<br/>设置Base Painter的材质球 | | SetMaxCache() |public void SetMaxCache(int maxCache)<br/>设置可缓存的最大数据量。当数据量超过该值时,会自动删除第一个值再加入最新值。 | | SetPainterActive() |public void SetPainterActive(int index, bool flag)| @@ -276,6 +275,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandle | RebuildChartObject() |public void RebuildChartObject()<br/>移除并重新创建所有图表的Object。 | | RefreshAllComponent() |public void RefreshAllComponent()| | RefreshGraph() |public virtual void RefreshGraph()<br/>在下一帧刷新图形。 | +| SaveAsImage() |public void SaveAsImage(string imageType = "png", string savePath = "")<br/>保存图表为图片。 | | ScreenPointToChartPoint() |public bool ScreenPointToChartPoint(Vector2 screenPoint, out Vector2 chartPoint)| | SetPainterDirty() |public void SetPainterDirty()<br/>重新初始化Painter | | SetSize() |public virtual void SetSize(float width, float height)<br/>设置图形的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform) | @@ -312,7 +312,7 @@ Inherits or Implemented: [BaseChart](#basechart) | CopyList<T>() |public static bool CopyList<T>(List<T> toList, List<T> fromList)| | DestoryGameObject() |public static void DestoryGameObject(GameObject go)| | DestoryGameObject() |public static void DestoryGameObject(Transform parent, string childName)| -| DestoryGameObjectByMatch() |public static void DestoryGameObjectByMatch(Transform parent, string match)| +| DestoryGameObjectByMatch() |public static void DestoryGameObjectByMatch(Transform parent, string containString)| | DestroyAllChildren() |public static void DestroyAllChildren(Transform parent)| | GetActualValue() |public static float GetActualValue(float valueOrRate, float total, float maxRate = 1.5f)| | GetAngle360() |public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | @@ -645,6 +645,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) |public method|description| |--|--| +| CheckRefresh() |public void CheckRefresh()| | Init() |public void Init()| | Refresh() |public void Refresh()| | SetActive() |public void SetActive(bool flag, bool isDebugMode = false)| diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 20a467e2..d17fed35 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,7 +65,8 @@ slug: /changelog ## master -* (2022.12.22) 修复`Covert XY Axis`后Y轴的`Label`显示异常的问题 +* (2022.12.22) 调整`Covert`重命名为`Convert`,涉及的接口有:`ConvertXYAxis()`,`CovertSerie()`等 +* (2022.12.22) 修复`Convert XY Axis`后Y轴的`Label`显示异常的问题 * (2022.12.12) 修复`Axis`的`Value`轴在某些情况下计算数值范围不准确的问题 * (2022.12.12) 优化`Legend`的`formatter`支持`{h}`通配符 * (2022.12.12) 修复`Legend`的`formatter`设置为固定值时显示不正常的问题 @@ -680,7 +681,7 @@ slug: /changelog * (2020.04.19) 优化`LineChart`折线图的区域填充渐变效果 * (2020.04.19) 增加`AxisLabel`的`onZero`参数可将`Label`显示在`0`刻度上 * (2020.04.19) 增加`Serie`和`AxisLabel`的`showAsPositiveNumber`参数将负数数值显示为正数 -* (2020.04.18) 增加`Covert XY Axis`互换XY轴配置 +* (2020.04.18) 增加`Convert XY Axis`互换XY轴配置 * (2020.04.17) 增加`Axis`可通过`inverse`参数设置坐标轴反转 * (2020.04.16) 修复`Check warning`在`Unity2019.3`上的显示问题 * (2020.04.16) 修复`PieChart`在设置`Space`参数后动画绘制异常的问题 diff --git a/Editor/Charts/BaseChartEditor.cs b/Editor/Charts/BaseChartEditor.cs index fc9f39d7..665e78f7 100644 --- a/Editor/Charts/BaseChartEditor.cs +++ b/Editor/Charts/BaseChartEditor.cs @@ -14,7 +14,7 @@ namespace XCharts.Editor { public static readonly GUIContent btnAddSerie = new GUIContent("Add Serie", ""); public static readonly GUIContent btnAddComponent = new GUIContent("Add Main Component", ""); - public static readonly GUIContent btnCovertXYAxis = new GUIContent("Covert XY Axis", ""); + public static readonly GUIContent btnConvertXYAxis = new GUIContent("Convert XY Axis", ""); public static readonly GUIContent btnRebuildChartObject = new GUIContent("Rebuild Chart Object", ""); public static readonly GUIContent btnSaveAsImage = new GUIContent("Save As Image", ""); public static readonly GUIContent btnCheckWarning = new GUIContent("Check Warning", ""); @@ -273,8 +273,8 @@ namespace XCharts.Editor { if (m_Chart.HasChartComponent<XAxis>() && m_Chart.HasChartComponent<YAxis>()) { - if (GUILayout.Button(Styles.btnCovertXYAxis)) - m_Chart.CovertXYAxis(0); + if (GUILayout.Button(Styles.btnConvertXYAxis)) + m_Chart.ConvertXYAxis(0); } if (GUILayout.Button(Styles.btnRebuildChartObject)) { diff --git a/Editor/Series/SerieListEditor.cs b/Editor/Series/SerieListEditor.cs index 02e39e86..4ad75d3f 100644 --- a/Editor/Series/SerieListEditor.cs +++ b/Editor/Series/SerieListEditor.cs @@ -169,11 +169,11 @@ namespace XCharts.Editor RefreshEditors(); } })); - foreach (var type in GetCovertToSerie(editor.serie.GetType())) + foreach (var type in GetConvertToSerie(editor.serie.GetType())) { - editor.menus.Add(new HeaderMenuInfo("Covert to " + type.Name, () => + editor.menus.Add(new HeaderMenuInfo("Convert to " + type.Name, () => { - CovertSerie(editor.serie, type); + ConvertSerie(editor.serie, type); })); } if (editor.serie.GetType().IsDefined(typeof(SerieExtraComponentAttribute), false)) @@ -224,9 +224,9 @@ namespace XCharts.Editor AssetDatabase.Refresh(); } - public void CovertSerie(Serie serie, Type type) + public void ConvertSerie(Serie serie, Type type) { - chart.CovertSerie(serie, type); + chart.ConvertSerie(serie, type); m_SeriesProperty = m_BaseEditor.RefreshSeries(); RefreshEditors(); } @@ -254,7 +254,7 @@ namespace XCharts.Editor AssetDatabase.Refresh(); } - private List<Type> GetCovertToSerie(Type serie) + private List<Type> GetConvertToSerie(Type serie) { var list = new List<Type>(); var typeMap = RuntimeUtil.GetAllTypesDerivedFrom<Serie>(); diff --git a/Runtime/Internal/BaseChart.API.cs b/Runtime/Internal/BaseChart.API.cs index f51f8a5b..856f0687 100644 --- a/Runtime/Internal/BaseChart.API.cs +++ b/Runtime/Internal/BaseChart.API.cs @@ -464,7 +464,7 @@ namespace XCharts.Runtime /// 转换X轴和Y轴的配置 /// </summary> /// <param name="index">坐标轴索引,0或1</param> - public void CovertXYAxis(int index) + public void ConvertXYAxis(int index) { List<MainComponent> m_XAxes; List<MainComponent> m_YAxes; diff --git a/Runtime/Internal/BaseChart.Serie.cs b/Runtime/Internal/BaseChart.Serie.cs index 99ec7bc4..27e39bc9 100644 --- a/Runtime/Internal/BaseChart.Serie.cs +++ b/Runtime/Internal/BaseChart.Serie.cs @@ -179,23 +179,23 @@ namespace XCharts.Runtime RefreshChart(); } - public bool CovertSerie<T>(Serie serie) where T : Serie + public bool ConvertSerie<T>(Serie serie) where T : Serie { - return CovertSerie(serie, typeof(T)); + return ConvertSerie(serie, typeof(T)); } - public bool CovertSerie(Serie serie, Type type) + public bool ConvertSerie(Serie serie, Type type) { try { - var newSerie = type.InvokeMember("CovertSerie", + var newSerie = type.InvokeMember("ConvertSerie", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, new object[] { serie }) as Serie; return ReplaceSerie(serie, newSerie); } catch { - Debug.LogError(string.Format("CovertSerie Failed: can't found {0}.CovertSerie(Serie serie)", type.Name)); + Debug.LogError(string.Format("ConvertSerie Failed: can't found {0}.ConvertSerie(Serie serie)", type.Name)); return false; } } diff --git a/Runtime/Serie/Bar/Bar.cs b/Runtime/Serie/Bar/Bar.cs index bd3c1031..0074102d 100644 --- a/Runtime/Serie/Bar/Bar.cs +++ b/Runtime/Serie/Bar/Bar.cs @@ -23,7 +23,7 @@ namespace XCharts.Runtime return serie; } - public static Bar CovertSerie(Serie serie) + public static Bar ConvertSerie(Serie serie) { var newSerie = SerieHelper.CloneSerie<Bar>(serie); return newSerie; diff --git a/Runtime/Serie/Bar/SimplifiedBar.cs b/Runtime/Serie/Bar/SimplifiedBar.cs index 3eed9ff7..8a6c2a0b 100644 --- a/Runtime/Serie/Bar/SimplifiedBar.cs +++ b/Runtime/Serie/Bar/SimplifiedBar.cs @@ -32,7 +32,7 @@ namespace XCharts.Runtime return serie; } - public static SimplifiedBar CovertSerie(Serie serie) + public static SimplifiedBar ConvertSerie(Serie serie) { var newSerie = serie.Clone<SimplifiedBar>(); return newSerie; diff --git a/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs b/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs index 4a8ca1a2..8bddbe28 100644 --- a/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs +++ b/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs @@ -30,7 +30,7 @@ namespace XCharts.Runtime return serie; } - public static SimplifiedCandlestick CovertSerie(Serie serie) + public static SimplifiedCandlestick ConvertSerie(Serie serie) { var newSerie = serie.Clone<SimplifiedCandlestick>(); return newSerie; diff --git a/Runtime/Serie/Line/Line.cs b/Runtime/Serie/Line/Line.cs index 3b13b9ef..a86c32e0 100644 --- a/Runtime/Serie/Line/Line.cs +++ b/Runtime/Serie/Line/Line.cs @@ -38,7 +38,7 @@ namespace XCharts.Runtime return serie; } - public static Line CovertSerie(Serie serie) + public static Line ConvertSerie(Serie serie) { var newSerie = serie.Clone<Line>(); return newSerie; diff --git a/Runtime/Serie/Line/SimplifiedLine.cs b/Runtime/Serie/Line/SimplifiedLine.cs index 94470d90..3401218c 100644 --- a/Runtime/Serie/Line/SimplifiedLine.cs +++ b/Runtime/Serie/Line/SimplifiedLine.cs @@ -32,7 +32,7 @@ namespace XCharts.Runtime return serie; } - public static SimplifiedLine CovertSerie(Serie serie) + public static SimplifiedLine ConvertSerie(Serie serie) { var newSerie = serie.Clone<SimplifiedLine>(); return newSerie; diff --git a/Runtime/Serie/Pie/Pie.cs b/Runtime/Serie/Pie/Pie.cs index a86fc07f..5d89a5dc 100644 --- a/Runtime/Serie/Pie/Pie.cs +++ b/Runtime/Serie/Pie/Pie.cs @@ -21,7 +21,7 @@ namespace XCharts.Runtime return serie; } - public static Pie CovertSerie(Serie serie) + public static Pie ConvertSerie(Serie serie) { var newSerie = SerieHelper.CloneSerie<Pie>(serie); return newSerie; From 317ffc4d999c942828e7d8c275777c24f9af98dd Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Wed, 28 Dec 2022 18:17:56 +0800 Subject: [PATCH 10/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Pie`=E5=8F=AA=E6=9C=89?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=95=B0=E6=8D=AE=E6=97=B6=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?`border`=E5=90=8E=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20(#237)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/XUGL/UGL.cs | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index d17fed35..7963a82e 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2022.12.28) 修复`Pie`只有一个数据时设置`border`后显示异常的问题 (#237) * (2022.12.22) 调整`Covert`重命名为`Convert`,涉及的接口有:`ConvertXYAxis()`,`CovertSerie()`等 * (2022.12.22) 修复`Convert XY Axis`后Y轴的`Label`显示异常的问题 * (2022.12.12) 修复`Axis`的`Value`轴在某些情况下计算数值范围不准确的问题 diff --git a/Runtime/XUGL/UGL.cs b/Runtime/XUGL/UGL.cs index 92de53bb..b35a9820 100644 --- a/Runtime/XUGL/UGL.cs +++ b/Runtime/XUGL/UGL.cs @@ -1323,7 +1323,8 @@ namespace XUGL float smoothness, int gradientType = 0, bool isYAxis = false) { if (radius == 0) return; - if (gap > 0 && Mathf.Abs(toDegree - startDegree) >= 360) gap = 0; + var isCircle = Mathf.Abs(toDegree - startDegree) >= 360; + if (gap > 0 && isCircle) gap = 0; radius -= borderWidth; smoothness = (smoothness < 0 ? 2f : smoothness); int segments = (int) ((2 * Mathf.PI * radius) * (Mathf.Abs(toDegree - startDegree) / 360) / smoothness); @@ -1363,7 +1364,7 @@ namespace XUGL if (realToAngle < realStartAngle) realToAngle = realStartAngle; p2 = UGLHelper.GetPos(center, radius, realStartAngle); } - if (needBorder) + if (needBorder && !isCircle) { borderDiff = borderLineWidth / Mathf.Sin(halfAngle); realCenter += borderDiff * middleDire; @@ -1514,6 +1515,7 @@ namespace XUGL insideRadius += borderWidth; smoothness = smoothness < 0 ? 2f : smoothness; Vector3 p1, p2, p3, p4, e1, e2; + var isCircle = Mathf.Abs(toDegree - startDegree) >= 360; var needBorder = borderWidth != 0; var needSpace = gap != 0; var diffAngle = Mathf.Abs(toDegree - startDegree) * Mathf.Deg2Rad; @@ -1581,7 +1583,7 @@ namespace XUGL p2 = UGLHelper.GetPos(center, outsideRadius, realStartOutAngle, false); e2 = UGLHelper.GetPos(center, outsideRadius, realToOutAngle, false); } - if (needBorder) + if (needBorder && !isCircle) { var borderDiff = borderWidth / Mathf.Sin(halfAngle); realCenter += Mathf.Abs(borderDiff) * middleDire; From c17d83ae6d6ea0f1b00a64428613b237cc1cb69a Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 29 Dec 2022 20:57:56 +0800 Subject: [PATCH 11/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`UpdateXYData()`?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=BD=B1=E5=93=8D=E6=95=B0=E6=8D=AE=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=E7=9A=84=E9=97=AE=E9=A2=98=20(#238)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Serie/Serie.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 7963a82e..ef1b27bb 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2022.12.29) 修复`UpdateXYData()`接口影响数据精度的问题 (#238) * (2022.12.28) 修复`Pie`只有一个数据时设置`border`后显示异常的问题 (#237) * (2022.12.22) 调整`Covert`重命名为`Convert`,涉及的接口有:`ConvertXYAxis()`,`CovertSerie()`等 * (2022.12.22) 修复`Convert XY Axis`后Y轴的`Label`显示异常的问题 diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index 5cabe856..e0d1696e 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -1658,7 +1658,7 @@ namespace XCharts.Runtime /// <param name="index"></param> /// <param name="xValue"></param> /// <param name="yValue"></param> - public bool UpdateXYData(int index, float xValue, float yValue) + public bool UpdateXYData(int index, double xValue, double yValue) { var flag1 = UpdateData(index, 0, xValue); var flag2 = UpdateData(index, 1, yValue); From d90a0d69b20ed9035e73418e9f4042eee963b81b Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Fri, 30 Dec 2022 22:13:03 +0800 Subject: [PATCH 12/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`Editor`=E5=AF=B9`List`?= =?UTF-8?q?=E7=9A=84`+`=E6=B7=BB=E5=8A=A0=E7=BC=96=E8=BE=91=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Editor/Utilities/ChartEditorHelper.cs | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index ef1b27bb..7dfe3e2c 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2022.12.29) 增加`Editor`对`List`的`+`添加编辑功能 * (2022.12.29) 修复`UpdateXYData()`接口影响数据精度的问题 (#238) * (2022.12.28) 修复`Pie`只有一个数据时设置`border`后显示异常的问题 (#237) * (2022.12.22) 调整`Covert`重命名为`Convert`,涉及的接口有:`ConvertXYAxis()`,`CovertSerie()`等 diff --git a/Editor/Utilities/ChartEditorHelper.cs b/Editor/Utilities/ChartEditorHelper.cs index 859b5a9e..0c0aeb64 100644 --- a/Editor/Utilities/ChartEditorHelper.cs +++ b/Editor/Utilities/ChartEditorHelper.cs @@ -318,8 +318,8 @@ namespace XCharts.Editor { EditorGUI.indentLevel++; var listSize = listProp.arraySize; - var iconWidth = 14; - var iconGap = 3f; + var iconWidth = 10; + var iconGap = 0f; if (showSize) { @@ -383,20 +383,25 @@ namespace XCharts.Editor var isSerie = "Serie".Equals(element.type); var elementRect = isSerie ? new Rect(drawRect.x, drawRect.y, drawRect.width + INDENT_WIDTH - 2 * iconGap, drawRect.height) : - new Rect(drawRect.x, drawRect.y, drawRect.width - 3 * iconWidth, drawRect.height); + new Rect(drawRect.x, drawRect.y, drawRect.width - 4 * iconWidth, drawRect.height); EditorGUI.PropertyField(elementRect, element, new GUIContent("Element " + i)); - var iconRect = new Rect(drawRect.width - 3 * iconWidth + temp, drawRect.y, iconWidth, drawRect.height); + var iconRect = new Rect(drawRect.width - 4 * iconWidth + temp, drawRect.y, iconWidth, drawRect.height); var oldColor = GUI.contentColor; GUI.contentColor = Color.black; if (GUI.Button(iconRect, EditorCustomStyles.iconUp, EditorCustomStyles.invisibleButton)) { if (i > 0) listProp.MoveArrayElement(i, i - 1); } - iconRect = new Rect(drawRect.width - 2 * iconWidth + temp, drawRect.y, iconWidth, drawRect.height); + iconRect = new Rect(drawRect.width - 3 * iconWidth + temp, drawRect.y, iconWidth, drawRect.height); if (GUI.Button(iconRect, EditorCustomStyles.iconDown, EditorCustomStyles.invisibleButton)) { if (i < listProp.arraySize - 1) listProp.MoveArrayElement(i, i + 1); } + iconRect = new Rect(drawRect.width - 2 * iconWidth + temp, drawRect.y, iconWidth, drawRect.height); + if (GUI.Button(iconRect, EditorCustomStyles.iconAdd, EditorCustomStyles.invisibleButton)) + { + if (i < listProp.arraySize && i >= 0) listProp.InsertArrayElementAtIndex(i); + } iconRect = new Rect(drawRect.width - iconWidth + temp, drawRect.y, iconWidth, drawRect.height); if (GUI.Button(iconRect, EditorCustomStyles.iconRemove, EditorCustomStyles.invisibleButton)) { From a4aabb5bbee20b85ce064da02c8f2c96fd19916e Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Fri, 30 Dec 2022 22:30:42 +0800 Subject: [PATCH 13/55] 3.6.0 --- Runtime/Internal/Object/ChartLabel.cs | 12 +++++++++++- Runtime/Internal/XChartsMgr.cs | 4 ++-- package.json | 6 +++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Runtime/Internal/Object/ChartLabel.cs b/Runtime/Internal/Object/ChartLabel.cs index bf609c64..d36114e0 100644 --- a/Runtime/Internal/Object/ChartLabel.cs +++ b/Runtime/Internal/Object/ChartLabel.cs @@ -21,6 +21,7 @@ namespace XCharts.Runtime private Vector3 m_IconOffest; private Align m_Align = Align.Left; private Image m_IconImage; + private bool m_Active = true; public Image icon { @@ -188,9 +189,18 @@ namespace XCharts.Runtime return transform.localPosition; } + public override bool IsActive() + { + return m_Active; + } + public void SetActive(bool flag) { - ChartHelper.SetActive(gameObject, flag); + if (m_Active != flag) + { + m_Active = flag; + ChartHelper.SetActive(gameObject, flag); + } } public void SetTextActive(bool flag) { diff --git a/Runtime/Internal/XChartsMgr.cs b/Runtime/Internal/XChartsMgr.cs index 584ce315..64265b24 100644 --- a/Runtime/Internal/XChartsMgr.cs +++ b/Runtime/Internal/XChartsMgr.cs @@ -20,8 +20,8 @@ namespace XCharts.Runtime [ExecuteInEditMode] public static class XChartsMgr { - public static readonly string version = "3.5.0"; - public static readonly int versionDate = 20221201; + public static readonly string version = "3.6.0"; + public static readonly int versionDate = 20230201; public static string fullVersion { get { return version + "-" + versionDate; } } internal static List<BaseChart> chartList = new List<BaseChart>(); diff --git a/package.json b/package.json index 1a863972..2ac8569b 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "com.monitor1394.xcharts", "displayName": "XCharts", - "version": "3.5.0", - "date": "20221201", - "checkdate": "20221101", + "version": "3.6.0", + "date": "20230201", + "checkdate": "20230201", "desc": "如果 XCharts 对您有帮助,希望您能在 Github 上点 Star 支持,非常感谢!", "unity": "2018.3", "description": "A charting and data visualization library for Unity.", From 6ace71f8dbf2648d2014e7d83524db75d6b74ab1 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Tue, 3 Jan 2023 21:07:28 +0800 Subject: [PATCH 14/55] =?UTF-8?q?=E5=88=A0=E9=99=A4`Serie`=E7=9A=84`MarkCo?= =?UTF-8?q?lor`=EF=BC=8C=E5=A2=9E=E5=8A=A0`ItemStyle`=E7=9A=84`MarkColor`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Editor/ChildComponents/ItemStyleDrawer.cs | 1 + Runtime/Component/Child/ItemStyle.cs | 11 +++++++++++ Runtime/Internal/BaseChart.API.cs | 5 +++-- Runtime/Serie/Serie.cs | 10 ---------- Runtime/Serie/SeriesHelper.cs | 5 +++-- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 7dfe3e2c..64a2fe2b 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.01.03) 删除`Serie`的`MarkColor`,增加`ItemStyle`的`MarkColor` * (2022.12.29) 增加`Editor`对`List`的`+`添加编辑功能 * (2022.12.29) 修复`UpdateXYData()`接口影响数据精度的问题 (#238) * (2022.12.28) 修复`Pie`只有一个数据时设置`border`后显示异常的问题 (#237) diff --git a/Editor/ChildComponents/ItemStyleDrawer.cs b/Editor/ChildComponents/ItemStyleDrawer.cs index 50978b07..1f772079 100644 --- a/Editor/ChildComponents/ItemStyleDrawer.cs +++ b/Editor/ChildComponents/ItemStyleDrawer.cs @@ -18,6 +18,7 @@ namespace XCharts.Editor PropertyField(prop, "m_Color0"); PropertyField(prop, "m_ToColor"); PropertyField(prop, "m_ToColor2"); + PropertyField(prop, "m_MarkColor"); PropertyField(prop, "m_BackgroundColor"); PropertyField(prop, "m_BackgroundWidth"); PropertyField(prop, "m_CenterColor"); diff --git a/Runtime/Component/Child/ItemStyle.cs b/Runtime/Component/Child/ItemStyle.cs index 79e9403a..56437837 100644 --- a/Runtime/Component/Child/ItemStyle.cs +++ b/Runtime/Component/Child/ItemStyle.cs @@ -13,6 +13,7 @@ namespace XCharts.Runtime [SerializeField] private Color32 m_Color0; [SerializeField] private Color32 m_ToColor; [SerializeField] private Color32 m_ToColor2; + [SerializeField][Since("v3.6.0")] private Color32 m_MarkColor; [SerializeField] private Color32 m_BackgroundColor; [SerializeField] private float m_BackgroundWidth; [SerializeField] private Color32 m_CenterColor; @@ -35,6 +36,7 @@ namespace XCharts.Runtime m_Color0 = Color.clear; m_ToColor = Color.clear; m_ToColor2 = Color.clear; + m_MarkColor = Color.clear; m_BackgroundColor = Color.clear; m_BackgroundWidth = 0; m_CenterColor = Color.clear; @@ -102,6 +104,15 @@ namespace XCharts.Runtime set { if (PropertyUtil.SetColor(ref m_ToColor2, value)) SetVerticesDirty(); } } /// <summary> + /// Serie's mark color. It is only used to display Legend and Tooltip, and does not affect the drawing color. The default value is clear. + /// |Serie的标识颜色。仅用于Legend和Tooltip的展示,不影响绘制颜色,默认为clear。 + /// </summary> + public Color32 markColor + { + get { return m_MarkColor; } + set { if (PropertyUtil.SetStruct(ref m_MarkColor, value)) { SetAllDirty(); } } + } + /// <summary> /// 数据项背景颜色。 /// </summary> public Color32 backgroundColor diff --git a/Runtime/Internal/BaseChart.API.cs b/Runtime/Internal/BaseChart.API.cs index 856f0687..c30e3fee 100644 --- a/Runtime/Internal/BaseChart.API.cs +++ b/Runtime/Internal/BaseChart.API.cs @@ -601,13 +601,14 @@ namespace XCharts.Runtime /// <returns></returns> public Color32 GetMarkColor(Serie serie, SerieData serieData) { - if (ChartHelper.IsClearColor(serie.markColor)) + var itemStyle = SerieHelper.GetItemStyle(serie, serieData); + if (ChartHelper.IsClearColor(itemStyle.markColor)) { return GetItemColor(serie, serieData); } else { - return serie.markColor; + return itemStyle.markColor; } } diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index e0d1696e..59f9a359 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -230,7 +230,6 @@ namespace XCharts.Runtime [SerializeField] private string m_SerieName; [SerializeField][Since("v3.2.0")] private SerieState m_State = SerieState.Normal; [SerializeField][Since("v3.2.0")] private SerieColorBy m_ColorBy = SerieColorBy.Default; - [SerializeField][Since("v3.4.0")] private Color32 m_MarkColor; [SerializeField] private string m_Stack; [SerializeField] private int m_XAxisIndex = 0; [SerializeField] private int m_YAxisIndex = 0; @@ -376,15 +375,6 @@ namespace XCharts.Runtime set { if (PropertyUtil.SetStruct(ref m_ColorBy, value)) { SetAllDirty(); } } } /// <summary> - /// Serie's mark color. It is only used to display Legend and Tooltip, and does not affect the drawing color. The default value is clear. - /// |Serie的标识颜色。仅用于Legend和Tooltip的展示,不影响绘制颜色,默认为clear。 - /// </summary> - public Color32 markColor - { - get { return m_MarkColor; } - set { if (PropertyUtil.SetStruct(ref m_MarkColor, value)) { SetAllDirty(); } } - } - /// <summary> /// If stack the value. On the same category axis, the series with the same stack name would be put on top of each other. /// |数据堆叠,同个类目轴上系列配置相同的stack值后,后一个系列的值会在前一个系列的值上相加。 /// </summary> diff --git a/Runtime/Serie/SeriesHelper.cs b/Runtime/Serie/SeriesHelper.cs index 6879d39e..980f4fd4 100644 --- a/Runtime/Serie/SeriesHelper.cs +++ b/Runtime/Serie/SeriesHelper.cs @@ -106,7 +106,8 @@ namespace XCharts.Runtime break; } } - if (ChartHelper.IsClearColor(destSerie.markColor)) + var itemStyle = SerieHelper.GetItemStyle(destSerie, destSerieData, SerieState.Normal); + if (ChartHelper.IsClearColor(itemStyle.markColor)) { Color32 color, toColor; SerieHelper.GetItemColor(out color, out toColor, destSerie, destSerieData, chart.theme, index, SerieState.Normal); @@ -114,7 +115,7 @@ namespace XCharts.Runtime } else { - return destSerie.markColor; + return itemStyle.markColor; } } From 8288e75445e85176fdc403fc8aafd676f3b380a6 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Fri, 6 Jan 2023 08:35:16 +0800 Subject: [PATCH 15/55] =?UTF-8?q?=E4=BC=98=E5=8C=96gameObject=E8=A2=ABDest?= =?UTF-8?q?ory=E5=90=8E=E7=9A=84=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Internal/Painter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Internal/Painter.cs b/Runtime/Internal/Painter.cs index b1ac47b4..e0c33fea 100644 --- a/Runtime/Internal/Painter.cs +++ b/Runtime/Internal/Painter.cs @@ -23,7 +23,7 @@ namespace XCharts.Runtime public Type type { get { return m_Type; } set { m_Type = value; } } public void Refresh() { - if (gameObject == null) return; + if (null == this || gameObject == null) return; if (!gameObject.activeSelf) return; m_Refresh = true; } From bda6fc797861458ea082048d2533be42f8e3d5dd Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Fri, 6 Jan 2023 22:51:02 +0800 Subject: [PATCH 16/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Pie`=E5=9C=A8=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E5=87=A0=E4=B8=AA=E6=95=B0=E6=8D=AE=E9=83=BD?= =?UTF-8?q?=E4=B8=BA0=E6=97=B6`Label`=E6=98=BE=E7=A4=BA=E4=B8=8D=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98=20(#240)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Component/Label/SerieLabelHelper.cs | 4 +++- Runtime/Serie/Pie/PieHandler.cs | 5 +++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 64a2fe2b..0b9c633d 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.01.06) 修复`Pie`在最后的几个数据都为0时`Label`显示不正常的问题 (#240) * (2023.01.03) 删除`Serie`的`MarkColor`,增加`ItemStyle`的`MarkColor` * (2022.12.29) 增加`Editor`对`List`的`+`添加编辑功能 * (2022.12.29) 修复`UpdateXYData()`接口影响数据精度的问题 (#238) diff --git a/Runtime/Component/Label/SerieLabelHelper.cs b/Runtime/Component/Label/SerieLabelHelper.cs index 84b9b67e..5d9c5a65 100644 --- a/Runtime/Component/Label/SerieLabelHelper.cs +++ b/Runtime/Component/Label/SerieLabelHelper.cs @@ -217,7 +217,9 @@ namespace XCharts.Runtime { var currAngle = serieData.context.halfAngle; var offset = labelLine.lineLength2 + serieData.labelObject.GetTextWidth() / 2; - if ((currAngle - serie.context.startAngle) % 360 > 180) + var angle = (currAngle - serie.context.startAngle) % 360; + var isLeft = angle > 180 || (angle == 0 && serieData.context.startAngle > 0); + if (isLeft) return serieData.context.labelPosition + new Vector3(-offset, 0, 0); else return serieData.context.labelPosition + new Vector3(offset, 0, 0); diff --git a/Runtime/Serie/Pie/PieHandler.cs b/Runtime/Serie/Pie/PieHandler.cs index 96b8b017..654403c1 100644 --- a/Runtime/Serie/Pie/PieHandler.cs +++ b/Runtime/Serie/Pie/PieHandler.cs @@ -491,8 +491,9 @@ namespace XCharts.Runtime pos6 = pos0 + Vector3.left * lineCircleDiff; pos4 = pos6 + Vector3.left * r4; } - var pos5X = (currAngle - startAngle) % 360 > 180 ? - pos2.x - labelLine.lineLength2 : pos2.x + labelLine.lineLength2; + var diffAngle = (currAngle - startAngle) % 360; + var isLeft = diffAngle > 180 || (diffAngle == 0 && serieData.context.startAngle > 0); + var pos5X = isLeft?pos2.x - labelLine.lineLength2 : pos2.x + labelLine.lineLength2; var pos5 = new Vector3(pos5X, pos2.y); var angle = Vector3.Angle(pos1 - center, pos2 - pos1); if (angle > 15) From e90d7d61d97bf9c398bba5dc6681e0a490c85ea1 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Wed, 11 Jan 2023 08:12:42 +0800 Subject: [PATCH 17/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Inspector`=E4=B8=8A?= =?UTF-8?q?=E7=A7=BB=E9=99=A4`Component`=E5=90=8E=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=8F=8A=E6=97=B6=E5=88=B7=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20(#241)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Editor/MainComponents/MainComponentListEditor.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 0b9c633d..90a155a5 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.01.11) 修复`Inspector`上移除`Component`后图表没有及时刷新的问题 (#241) * (2023.01.06) 修复`Pie`在最后的几个数据都为0时`Label`显示不正常的问题 (#240) * (2023.01.03) 删除`Serie`的`MarkColor`,增加`ItemStyle`的`MarkColor` * (2022.12.29) 增加`Editor`对`List`的`+`添加编辑功能 diff --git a/Editor/MainComponents/MainComponentListEditor.cs b/Editor/MainComponents/MainComponentListEditor.cs index 211cb31b..97ca4c14 100644 --- a/Editor/MainComponents/MainComponentListEditor.cs +++ b/Editor/MainComponents/MainComponentListEditor.cs @@ -151,6 +151,7 @@ namespace XCharts.Editor m_Editors[id].OnDisable(); chart.RemoveChartComponent(m_Editors[id].component); m_Editors.RemoveAt(id); + chart.RebuildChartObject(); m_ComponentsProperty = m_BaseEditor.RefreshComponent(); RefreshEditors(); EditorUtility.SetDirty(chart); From 7fbaf7af704e6a7712ebfb64de163070e060fd8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=B9=E4=B8=8A=E6=B5=B7?= <bshsf@qq.com> Date: Sun, 29 Jan 2023 19:43:05 +0800 Subject: [PATCH 18/55] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=B9=20InputSystem?= =?UTF-8?q?=20=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update BaseGraph.cs Update XCharts.Runtime.asmdef --- Documentation~/zh/img/inputsystem01.png | Bin 0 -> 37503 bytes Documentation~/zh/img/inputsystem02.png | Bin 0 -> 59948 bytes Documentation~/zh/img/inputsystem03.png | Bin 0 -> 60145 bytes Documentation~/zh/inputsystem.md | 17 + README.md | 1 + Runtime/Component/DataZoom/DataZoom.cs | 4 +- Runtime/Component/DataZoom/DataZoomHandler.cs | 4 +- .../Component/VisualMap/VisualMapHandler.cs | 4 +- Runtime/Internal/BaseChart.Component.cs | 10 +- Runtime/Internal/BaseChart.cs | 2 +- Runtime/Internal/BaseGraph.cs | 560 +++++++++--------- Runtime/Internal/Utilities/InputHelper.cs | 111 ++++ .../Internal/Utilities/InputHelper.cs.meta | 11 + Runtime/XCharts.Runtime.asmdef | 8 +- 14 files changed, 444 insertions(+), 288 deletions(-) create mode 100644 Documentation~/zh/img/inputsystem01.png create mode 100644 Documentation~/zh/img/inputsystem02.png create mode 100644 Documentation~/zh/img/inputsystem03.png create mode 100644 Documentation~/zh/inputsystem.md create mode 100644 Runtime/Internal/Utilities/InputHelper.cs create mode 100644 Runtime/Internal/Utilities/InputHelper.cs.meta diff --git a/Documentation~/zh/img/inputsystem01.png b/Documentation~/zh/img/inputsystem01.png new file mode 100644 index 0000000000000000000000000000000000000000..c2716e639f41d948bd06755e01fb9cf8ed5baddd GIT binary patch literal 37503 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[j#OV9~`^_MFY0A}1 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 Wr+)VA=gAH{_%qNo(W%hFVE-Q+&<(u+ literal 0 HcmV?d00001 diff --git a/Documentation~/zh/img/inputsystem02.png b/Documentation~/zh/img/inputsystem02.png new file mode 100644 index 0000000000000000000000000000000000000000..5178a460789092ff0f428906412738446c48d01a GIT binary patch literal 59948 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 U;eTZxt-v20O~d{9d#wZi50CmwxBvhE literal 0 HcmV?d00001 diff --git a/Documentation~/zh/img/inputsystem03.png b/Documentation~/zh/img/inputsystem03.png new file mode 100644 index 0000000000000000000000000000000000000000..95ad50a33f63a5db115659a2a0336c33ea436cbf GIT binary patch literal 60145 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 L_0(Re*oOZfWO~ji literal 0 HcmV?d00001 diff --git a/Documentation~/zh/inputsystem.md b/Documentation~/zh/inputsystem.md new file mode 100644 index 00000000..ce401c66 --- /dev/null +++ b/Documentation~/zh/inputsystem.md @@ -0,0 +1,17 @@ +--- +title: 入门教程:从 Input Manager 转到 Input System +sidebar_position: 1 +slug: /inputsystem +--- + +# 教程:从 Input Manager 转到 Input System + +## 1. 按图示修改项目配置中输入模式为 Input System +![Project Settings](img/inputsystem02.png) + +## 2. 使用 Unity Package Manager 安装 Input System +![UPM](img/inputsystem01.png) +## 3. 选中场景中 EventSystem 游戏对象,更换输入模组 +![Input Module](img/inputsystem03.png) + + diff --git a/README.md b/README.md index dd1d3b8a..faf54529 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ - 支持万级大数据量绘制,支持采样绘制。 - 支持`TexMeshPro`。 - 支持所有`5.6`以上的`Unity`版本。 +- 支持 Input System ([如何从 Input Manager 转 Input System](Documentation~/zh/inputsystem.md))。 ## 截图 diff --git a/Runtime/Component/DataZoom/DataZoom.cs b/Runtime/Component/DataZoom/DataZoom.cs index 030a0c52..eb1407c9 100644 --- a/Runtime/Component/DataZoom/DataZoom.cs +++ b/Runtime/Component/DataZoom/DataZoom.cs @@ -631,12 +631,12 @@ namespace XCharts.Runtime internal void UpdateStartLabelPosition(Vector3 pos) { - m_StartLabel.SetPosition(pos); + if (m_StartLabel != null) m_StartLabel.SetPosition(pos); } internal void UpdateEndLabelPosition(Vector3 pos) { - m_EndLabel.SetPosition(pos); + if (m_EndLabel != null) m_EndLabel.SetPosition(pos); } public void UpdateRuntimeData(float chartX, float chartY, float chartWidth, float chartHeight) diff --git a/Runtime/Component/DataZoom/DataZoomHandler.cs b/Runtime/Component/DataZoom/DataZoomHandler.cs index 50f9f755..54a88121 100644 --- a/Runtime/Component/DataZoom/DataZoomHandler.cs +++ b/Runtime/Component/DataZoom/DataZoomHandler.cs @@ -1,8 +1,10 @@ -using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using XUGL; +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Runtime { diff --git a/Runtime/Component/VisualMap/VisualMapHandler.cs b/Runtime/Component/VisualMap/VisualMapHandler.cs index a6f672da..32089ea6 100644 --- a/Runtime/Component/VisualMap/VisualMapHandler.cs +++ b/Runtime/Component/VisualMap/VisualMapHandler.cs @@ -3,7 +3,9 @@ using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using XUGL; - +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Runtime { [UnityEngine.Scripting.Preserve] diff --git a/Runtime/Internal/BaseChart.Component.cs b/Runtime/Internal/BaseChart.Component.cs index b989f2d9..62dab6a7 100644 --- a/Runtime/Internal/BaseChart.Component.cs +++ b/Runtime/Internal/BaseChart.Component.cs @@ -253,7 +253,15 @@ namespace XCharts.Runtime else return component; } - + public T EnsureChartComponent<T>() where T : MainComponent + { + var component = GetChartComponent<T>(); + if (component == null) + return AddChartComponent<T>(); + else + return component; + } + public bool TryGetChartComponent<T>(out T component, int index = 0) where T : MainComponent { diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 10499ebb..3d90a2d3 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -11,7 +11,7 @@ namespace XCharts.Runtime { [AddComponentMenu("XCharts/EmptyChart", 10)] [ExecuteInEditMode] - [RequireComponent(typeof(RectTransform))] + [RequireComponent(typeof(RectTransform),typeof(CanvasRenderer))] [DisallowMultipleComponent] public partial class BaseChart : BaseGraph, ISerializationCallbackReceiver { diff --git a/Runtime/Internal/BaseGraph.cs b/Runtime/Internal/BaseGraph.cs index a74da86a..d5481354 100644 --- a/Runtime/Internal/BaseGraph.cs +++ b/Runtime/Internal/BaseGraph.cs @@ -2,6 +2,9 @@ using System; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Runtime { @@ -9,302 +12,303 @@ namespace XCharts.Runtime public partial class BaseGraph : MaskableGraphic, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler, IPointerExitHandler, IBeginDragHandler, IPointerClickHandler, IDragHandler, IEndDragHandler, IScrollHandler + { + [SerializeField] protected bool m_EnableTextMeshPro = false; + + protected Painter m_Painter; + protected int m_SiblingIndex; + + protected float m_GraphWidth; + protected float m_GraphHeight; + protected float m_GraphX; + protected float m_GraphY; + protected Vector3 m_GraphPosition = Vector3.zero; + protected Vector2 m_GraphMinAnchor; + protected Vector2 m_GraphMaxAnchor; + protected Vector2 m_GraphPivot; + protected Vector2 m_GraphSizeDelta; + protected Vector2 m_GraphAnchoredPosition; + protected Rect m_GraphRect = new Rect(0, 0, 0, 0); + protected bool m_RefreshChart = false; + protected bool m_ForceOpenRaycastTarget; + protected bool m_IsControlledByLayout = false; + protected bool m_PainerDirty = false; + protected bool m_IsOnValidate = false; + protected Vector3 m_LastLocalPosition; + + protected Action<PointerEventData, BaseGraph> m_OnPointerClick; + protected Action<PointerEventData, BaseGraph> m_OnPointerDown; + protected Action<PointerEventData, BaseGraph> m_OnPointerUp; + protected Action<PointerEventData, BaseGraph> m_OnPointerEnter; + protected Action<PointerEventData, BaseGraph> m_OnPointerExit; + protected Action<PointerEventData, BaseGraph> m_OnBeginDrag; + protected Action<PointerEventData, BaseGraph> m_OnDrag; + protected Action<PointerEventData, BaseGraph> m_OnEndDrag; + protected Action<PointerEventData, BaseGraph> m_OnScroll; + + public virtual HideFlags chartHideFlags { get { return HideFlags.None; } } + + private ScrollRect m_ScrollRect; + + public Painter painter { get { return m_Painter; } } + + protected virtual void InitComponent() { - [SerializeField] protected bool m_EnableTextMeshPro = false; + InitPainter(); + } - protected Painter m_Painter; - protected int m_SiblingIndex; + protected override void Awake() + { + CheckTextMeshPro(); + m_SiblingIndex = 0; + m_LastLocalPosition = transform.localPosition; + UpdateSize(); + InitComponent(); + CheckIsInScrollRect(); + } - protected float m_GraphWidth; - protected float m_GraphHeight; - protected float m_GraphX; - protected float m_GraphY; - protected Vector3 m_GraphPosition = Vector3.zero; - protected Vector2 m_GraphMinAnchor; - protected Vector2 m_GraphMaxAnchor; - protected Vector2 m_GraphPivot; - protected Vector2 m_GraphSizeDelta; - protected Vector2 m_GraphAnchoredPosition; - protected Rect m_GraphRect = new Rect(0, 0, 0, 0); - protected bool m_RefreshChart = false; - protected bool m_ForceOpenRaycastTarget; - protected bool m_IsControlledByLayout = false; - protected bool m_PainerDirty = false; - protected bool m_IsOnValidate = false; - protected Vector3 m_LastLocalPosition; + protected override void Start() + { + m_RefreshChart = true; + } - protected Action<PointerEventData, BaseGraph> m_OnPointerClick; - protected Action<PointerEventData, BaseGraph> m_OnPointerDown; - protected Action<PointerEventData, BaseGraph> m_OnPointerUp; - protected Action<PointerEventData, BaseGraph> m_OnPointerEnter; - protected Action<PointerEventData, BaseGraph> m_OnPointerExit; - protected Action<PointerEventData, BaseGraph> m_OnBeginDrag; - protected Action<PointerEventData, BaseGraph> m_OnDrag; - protected Action<PointerEventData, BaseGraph> m_OnEndDrag; - protected Action<PointerEventData, BaseGraph> m_OnScroll; - - public virtual HideFlags chartHideFlags { get { return HideFlags.None; } } - - private ScrollRect m_ScrollRect; - - public Painter painter { get { return m_Painter; } } - - protected virtual void InitComponent() - { - InitPainter(); - } - - protected override void Awake() + protected virtual void Update() + { + CheckSize(); + if (m_IsOnValidate) { + m_IsOnValidate = false; CheckTextMeshPro(); - m_SiblingIndex = 0; - m_LastLocalPosition = transform.localPosition; - UpdateSize(); InitComponent(); - CheckIsInScrollRect(); + RefreshGraph(); } - - protected override void Start() + else { - m_RefreshChart = true; + CheckComponent(); } + CheckPointerPos(); + CheckRefreshChart(); + CheckRefreshPainter(); + } - protected virtual void Update() - { - CheckSize(); - if (m_IsOnValidate) - { - m_IsOnValidate = false; - CheckTextMeshPro(); - InitComponent(); - RefreshGraph(); - } - else - { - CheckComponent(); - } - CheckPointerPos(); - CheckRefreshChart(); - CheckRefreshPainter(); - } - - protected virtual void SetAllComponentDirty() - { + protected virtual void SetAllComponentDirty() + { #if UNITY_EDITOR - if (!Application.isPlaying) - { - m_IsOnValidate = true; - } -#endif - m_PainerDirty = true; - } - - protected virtual void CheckComponent() - { - if (m_PainerDirty) - { - InitPainter(); - m_PainerDirty = false; - } - } - - private void CheckTextMeshPro() - { -#if dUI_TextMeshPro - var enableTextMeshPro = true; -#else - var enableTextMeshPro = false; -#endif - if (m_EnableTextMeshPro != enableTextMeshPro) - { - m_EnableTextMeshPro = enableTextMeshPro; - RebuildChartObject(); - } - } - -#if UNITY_EDITOR - protected override void Reset() { } - - protected override void OnValidate() + if (!Application.isPlaying) { m_IsOnValidate = true; } #endif + m_PainerDirty = true; + } - protected override void OnDestroy() + protected virtual void CheckComponent() + { + if (m_PainerDirty) { - for (int i = transform.childCount - 1; i >= 0; i--) - { - DestroyImmediate(transform.GetChild(i).gameObject); - } - } - - protected override void OnPopulateMesh(VertexHelper vh) - { - vh.Clear(); - } - - protected virtual void InitPainter() - { - m_Painter = ChartHelper.AddPainterObject("painter_b", transform, m_GraphMinAnchor, - m_GraphMaxAnchor, m_GraphPivot, new Vector2(m_GraphWidth, m_GraphHeight), chartHideFlags, 1); - m_Painter.type = Painter.Type.Base; - m_Painter.onPopulateMesh = OnDrawPainterBase; - m_Painter.transform.SetSiblingIndex(0); - } - - private void CheckSize() - { - var currWidth = rectTransform.rect.width; - var currHeight = rectTransform.rect.height; - - if (m_GraphWidth == 0 && m_GraphHeight == 0 && (currWidth != 0 || currHeight != 0)) - { - Awake(); - } - - if (m_GraphWidth != currWidth || - m_GraphHeight != currHeight || - m_GraphMinAnchor != rectTransform.anchorMin || - m_GraphMaxAnchor != rectTransform.anchorMax || - m_GraphAnchoredPosition != rectTransform.anchoredPosition) - { - UpdateSize(); - } - if (!ChartHelper.IsValueEqualsVector3(m_LastLocalPosition, transform.localPosition)) - { - m_LastLocalPosition = transform.localPosition; - OnLocalPositionChanged(); - } - } - - protected void UpdateSize() - { - m_GraphWidth = rectTransform.rect.width; - m_GraphHeight = rectTransform.rect.height; - - m_GraphMaxAnchor = rectTransform.anchorMax; - m_GraphMinAnchor = rectTransform.anchorMin; - m_GraphSizeDelta = rectTransform.sizeDelta; - m_GraphAnchoredPosition = rectTransform.anchoredPosition; - - rectTransform.pivot = LayerHelper.ResetChartPositionAndPivot(m_GraphMinAnchor, m_GraphMaxAnchor, - m_GraphWidth, m_GraphHeight, ref m_GraphX, ref m_GraphY); - m_GraphPivot = rectTransform.pivot; - - m_GraphRect.x = m_GraphX; - m_GraphRect.y = m_GraphY; - m_GraphRect.width = m_GraphWidth; - m_GraphRect.height = m_GraphHeight; - m_GraphPosition.x = m_GraphX; - m_GraphPosition.y = m_GraphY; - - OnSizeChanged(); - } - - private void CheckPointerPos() - { - if (!isPointerInChart) return; - if (canvas == null) return; - Vector2 local; - if (!ScreenPointToChartPoint(Input.mousePosition, out local)) - { - pointerPos = Vector2.zero; - } - else - { - pointerPos = local; - } - } - - protected virtual void CheckIsInScrollRect() - { - m_ScrollRect = GetComponentInParent<ScrollRect>(); - } - - protected virtual void CheckRefreshChart() - { - if (m_RefreshChart) - { - m_Painter.Refresh(); - m_RefreshChart = false; - } - } - - protected virtual void CheckRefreshPainter() - { - m_Painter.CheckRefresh(); - } - - internal virtual void RefreshPainter(Painter painter) - { - if (painter == null) return; - painter.Refresh(); - } - - protected virtual void OnSizeChanged() - { - m_RefreshChart = true; - } - - protected virtual void OnLocalPositionChanged() { } - - protected virtual void OnDrawPainterBase(VertexHelper vh, Painter painter) - { - DrawPainterBase(vh); - } - - protected virtual void DrawPainterBase(VertexHelper vh) { } - - public virtual void OnPointerClick(PointerEventData eventData) - { - if (m_OnPointerClick != null) m_OnPointerClick(eventData, this); - } - - public virtual void OnPointerDown(PointerEventData eventData) - { - if (m_OnPointerDown != null) m_OnPointerDown(eventData, this); - } - - public virtual void OnPointerUp(PointerEventData eventData) - { - if (m_OnPointerUp != null) m_OnPointerUp(eventData, this); - } - - public virtual void OnPointerEnter(PointerEventData eventData) - { - isPointerInChart = true; - if (m_OnPointerEnter != null) m_OnPointerEnter(eventData, this); - } - - public virtual void OnPointerExit(PointerEventData eventData) - { - isPointerInChart = false; - if (m_OnPointerExit != null) m_OnPointerExit(eventData, this); - } - - public virtual void OnBeginDrag(PointerEventData eventData) - { - if (m_ScrollRect != null) m_ScrollRect.OnBeginDrag(eventData); - if (m_OnBeginDrag != null) m_OnBeginDrag(eventData, this); - } - - public virtual void OnEndDrag(PointerEventData eventData) - { - if (m_ScrollRect != null) m_ScrollRect.OnEndDrag(eventData); - if (m_OnEndDrag != null) m_OnEndDrag(eventData, this); - } - - public virtual void OnDrag(PointerEventData eventData) - { - if (m_ScrollRect != null) m_ScrollRect.OnDrag(eventData); - if (m_OnDrag != null) m_OnDrag(eventData, this); - } - - public virtual void OnScroll(PointerEventData eventData) - { - if (m_ScrollRect != null) m_ScrollRect.OnScroll(eventData); - if (m_OnScroll != null) m_OnScroll(eventData, this); + InitPainter(); + m_PainerDirty = false; } } + + private void CheckTextMeshPro() + { +#if dUI_TextMeshPro + var enableTextMeshPro = true; +#else + var enableTextMeshPro = false; +#endif + if (m_EnableTextMeshPro != enableTextMeshPro) + { + m_EnableTextMeshPro = enableTextMeshPro; + RebuildChartObject(); + } + } + +#if UNITY_EDITOR + protected override void Reset() { } + + protected override void OnValidate() + { + m_IsOnValidate = true; + } +#endif + + protected override void OnDestroy() + { + for (int i = transform.childCount - 1; i >= 0; i--) + { + DestroyImmediate(transform.GetChild(i).gameObject); + } + } + + protected override void OnPopulateMesh(VertexHelper vh) + { + vh.Clear(); + } + + protected virtual void InitPainter() + { + m_Painter = ChartHelper.AddPainterObject("painter_b", transform, m_GraphMinAnchor, + m_GraphMaxAnchor, m_GraphPivot, new Vector2(m_GraphWidth, m_GraphHeight), chartHideFlags, 1); + m_Painter.type = Painter.Type.Base; + m_Painter.onPopulateMesh = OnDrawPainterBase; + m_Painter.transform.SetSiblingIndex(0); + } + + private void CheckSize() + { + var currWidth = rectTransform.rect.width; + var currHeight = rectTransform.rect.height; + + if (m_GraphWidth == 0 && m_GraphHeight == 0 && (currWidth != 0 || currHeight != 0)) + { + Awake(); + } + + if (m_GraphWidth != currWidth || + m_GraphHeight != currHeight || + m_GraphMinAnchor != rectTransform.anchorMin || + m_GraphMaxAnchor != rectTransform.anchorMax || + m_GraphAnchoredPosition != rectTransform.anchoredPosition) + { + UpdateSize(); + } + if (!ChartHelper.IsValueEqualsVector3(m_LastLocalPosition, transform.localPosition)) + { + m_LastLocalPosition = transform.localPosition; + OnLocalPositionChanged(); + } + } + + protected void UpdateSize() + { + m_GraphWidth = rectTransform.rect.width; + m_GraphHeight = rectTransform.rect.height; + + m_GraphMaxAnchor = rectTransform.anchorMax; + m_GraphMinAnchor = rectTransform.anchorMin; + m_GraphSizeDelta = rectTransform.sizeDelta; + m_GraphAnchoredPosition = rectTransform.anchoredPosition; + + rectTransform.pivot = LayerHelper.ResetChartPositionAndPivot(m_GraphMinAnchor, m_GraphMaxAnchor, + m_GraphWidth, m_GraphHeight, ref m_GraphX, ref m_GraphY); + m_GraphPivot = rectTransform.pivot; + + m_GraphRect.x = m_GraphX; + m_GraphRect.y = m_GraphY; + m_GraphRect.width = m_GraphWidth; + m_GraphRect.height = m_GraphHeight; + m_GraphPosition.x = m_GraphX; + m_GraphPosition.y = m_GraphY; + + OnSizeChanged(); + } + + private void CheckPointerPos() + { + if (!isPointerInChart) return; + if (canvas == null) return; + Vector2 mousePos = Input.mousePosition; + Vector2 local; + if (!ScreenPointToChartPoint(mousePos, out local)) + { + pointerPos = Vector2.zero; + } + else + { + pointerPos = local; + } + } + + protected virtual void CheckIsInScrollRect() + { + m_ScrollRect = GetComponentInParent<ScrollRect>(); + } + + protected virtual void CheckRefreshChart() + { + if (m_RefreshChart) + { + m_Painter.Refresh(); + m_RefreshChart = false; + } + } + + protected virtual void CheckRefreshPainter() + { + m_Painter.CheckRefresh(); + } + + internal virtual void RefreshPainter(Painter painter) + { + if (painter == null) return; + painter.Refresh(); + } + + protected virtual void OnSizeChanged() + { + m_RefreshChart = true; + } + + protected virtual void OnLocalPositionChanged() { } + + protected virtual void OnDrawPainterBase(VertexHelper vh, Painter painter) + { + DrawPainterBase(vh); + } + + protected virtual void DrawPainterBase(VertexHelper vh) { } + + public virtual void OnPointerClick(PointerEventData eventData) + { + if (m_OnPointerClick != null) m_OnPointerClick(eventData, this); + } + + public virtual void OnPointerDown(PointerEventData eventData) + { + if (m_OnPointerDown != null) m_OnPointerDown(eventData, this); + } + + public virtual void OnPointerUp(PointerEventData eventData) + { + if (m_OnPointerUp != null) m_OnPointerUp(eventData, this); + } + + public virtual void OnPointerEnter(PointerEventData eventData) + { + isPointerInChart = true; + if (m_OnPointerEnter != null) m_OnPointerEnter(eventData, this); + } + + public virtual void OnPointerExit(PointerEventData eventData) + { + isPointerInChart = false; + if (m_OnPointerExit != null) m_OnPointerExit(eventData, this); + } + + public virtual void OnBeginDrag(PointerEventData eventData) + { + if (m_ScrollRect != null) m_ScrollRect.OnBeginDrag(eventData); + if (m_OnBeginDrag != null) m_OnBeginDrag(eventData, this); + } + + public virtual void OnEndDrag(PointerEventData eventData) + { + if (m_ScrollRect != null) m_ScrollRect.OnEndDrag(eventData); + if (m_OnEndDrag != null) m_OnEndDrag(eventData, this); + } + + public virtual void OnDrag(PointerEventData eventData) + { + if (m_ScrollRect != null) m_ScrollRect.OnDrag(eventData); + if (m_OnDrag != null) m_OnDrag(eventData, this); + } + + public virtual void OnScroll(PointerEventData eventData) + { + if (m_ScrollRect != null) m_ScrollRect.OnScroll(eventData); + if (m_OnScroll != null) m_OnScroll(eventData, this); + } + } } \ No newline at end of file diff --git a/Runtime/Internal/Utilities/InputHelper.cs b/Runtime/Internal/Utilities/InputHelper.cs new file mode 100644 index 00000000..94870706 --- /dev/null +++ b/Runtime/Internal/Utilities/InputHelper.cs @@ -0,0 +1,111 @@ +#if INPUT_SYSTEM_ENABLED +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.InputSystem.LowLevel; + +namespace XCharts.Runtime +{ + public class InputHelper + { + public static Vector2 mousePosition + { + get + { + var value = Vector2.zero; + if (null != Mouse.current) + { + value = Mouse.current.position.ReadValue(); + } + else if (null != Touchscreen.current && Touchscreen.current.touches.Count > 0) + { + value = Touchscreen.current.touches[0].position.ReadValue(); + } + return value; + } + } + public static int touchCount + { + get + { + var value = 0; + if (null != Touchscreen.current) + { + value = Touchscreen.current.touches.Count; + } + return value; + } + } + + public static Touch GetTouch(int v) + { + UnityEngine.TouchPhase PhaseConvert(TouchState state) + { + UnityEngine.TouchPhase temp = UnityEngine.TouchPhase.Began; + switch (state.phase) + { + case UnityEngine.InputSystem.TouchPhase.Began: + temp = UnityEngine.TouchPhase.Began; + break; + case UnityEngine.InputSystem.TouchPhase.Moved: + temp = UnityEngine.TouchPhase.Moved; + break; + case UnityEngine.InputSystem.TouchPhase.Canceled: + temp = UnityEngine.TouchPhase.Canceled; + break; + case UnityEngine.InputSystem.TouchPhase.Stationary: + temp = UnityEngine.TouchPhase.Stationary; + break; + default: + case UnityEngine.InputSystem.TouchPhase.Ended: + case UnityEngine.InputSystem.TouchPhase.None: + temp = UnityEngine.TouchPhase.Ended; + break; + } + return temp; + } + var touch = Touchscreen.current.touches[v]; + var value = touch.ReadValue(); + //copy touchcontrol's touchstate data into touch + return new Touch + { + deltaPosition = value.delta, + fingerId = value.touchId, + position = value.position, + phase = PhaseConvert(value), + pressure = value.pressure, + radius = value.radius.magnitude, + radiusVariance = value.radius.sqrMagnitude, + type = value.isPrimaryTouch ? TouchType.Direct : TouchType.Indirect, + tapCount = value.tapCount, + deltaTime = Time.realtimeSinceStartup - (float)value.startTime, + rawPosition = value.startPosition, + }; + } + + public static bool GetKeyDown(KeyCode keyCode) + { + var value = false; + if (null != Keyboard.current) + { + var key = Keyboard.current.spaceKey; + switch (keyCode) + { + case KeyCode.Space: + key = Keyboard.current.spaceKey; + break; + case KeyCode.L: + key = Keyboard.current.lKey; + break; + default: + Debug.LogError($"{nameof(InputHelper)}: not support {keyCode} yet , please add it yourself if needed"); + break; + } + + value = key.wasPressedThisFrame; + } + return value; + } + + } +} +#endif diff --git a/Runtime/Internal/Utilities/InputHelper.cs.meta b/Runtime/Internal/Utilities/InputHelper.cs.meta new file mode 100644 index 00000000..fddfc435 --- /dev/null +++ b/Runtime/Internal/Utilities/InputHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5069defa9fe8c7a43843e1189e2d606c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/XCharts.Runtime.asmdef b/Runtime/XCharts.Runtime.asmdef index aa9babc9..64609360 100644 --- a/Runtime/XCharts.Runtime.asmdef +++ b/Runtime/XCharts.Runtime.asmdef @@ -1,13 +1,13 @@ { "name": "XCharts.Runtime", - "references": [ - ], - "optionalUnityReferences": [], + "references": [], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, "overrideReferences": false, "precompiledReferences": [], "autoReferenced": true, - "defineConstraints": [] + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false } \ No newline at end of file From 633456ada011a1b410b432d827b2fdf664a5ca92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=B9=E4=B8=8A=E6=B5=B7?= <bshsf@qq.com> Date: Mon, 30 Jan 2023 19:48:59 +0800 Subject: [PATCH 19/55] =?UTF-8?q?=E5=B0=86=20inputsystem=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=8A=9F=E8=83=BD=E6=B7=BB=E5=8A=A0=E5=88=B0=20xchart?= =?UTF-8?q?=20=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 顺便简化了 tmp 支持相关逻辑 --- Editor/Windows/XChartsEditor.cs | 150 ++++++++++++++++++++++++++-- Runtime/Internal/XChartsMgr.cs | 170 ++------------------------------ 2 files changed, 154 insertions(+), 166 deletions(-) diff --git a/Editor/Windows/XChartsEditor.cs b/Editor/Windows/XChartsEditor.cs index d72e84ff..99ed4adc 100644 --- a/Editor/Windows/XChartsEditor.cs +++ b/Editor/Windows/XChartsEditor.cs @@ -1,8 +1,14 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; using UnityEditor; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using XCharts.Runtime; +using ADB = UnityEditor.AssetDatabase; + namespace XCharts.Editor { @@ -22,7 +28,7 @@ namespace XCharts.Editor canvas = canvasObject.AddComponent<Canvas>(); canvas.renderMode = RenderMode.ScreenSpaceCamera; var mainCamera = GameObject.FindGameObjectWithTag("MainCamera"); - canvas.worldCamera = mainCamera == null? null : mainCamera.GetComponent<Camera>(); + canvas.worldCamera = mainCamera == null ? null : mainCamera.GetComponent<Camera>(); canvasObject.AddComponent<CanvasScaler>(); canvasObject.AddComponent<GraphicRaycaster>(); if (GameObject.Find("EventSystem") == null) @@ -188,23 +194,155 @@ namespace XCharts.Editor XCThemeMgr.ReloadThemeList(); } + #region Text mesh pro support +#if UNITY_2017_1_OR_NEWER + const string SYMBOL_TMP = "dUI_TextMeshPro"; + const string ASMDEF_TMP = "Unity.TextMeshPro"; + [MenuItem("XCharts/TextMeshPro Enable")] public static void EnableTextMeshPro() { - if (!XChartsMgr.IsExistTMPAssembly()) + if (!IsSpecifyAssemblyExist(ASMDEF_TMP)) { Debug.LogError("TextMeshPro is not in the project, please import TextMeshPro package first."); return; } - XChartsMgr.EnableTextMeshPro(); - XChartsMgr.ModifyTMPRefence(); + DefineSymbolsUtil.AddGlobalDefine(SYMBOL_TMP); + XChartsMgr.RemoveAllChartObject(); + InsertSpecifyReferenceIntoAssembly(Platform.Editor, ASMDEF_TMP); + InsertSpecifyReferenceIntoAssembly(Platform.Runtime, ASMDEF_TMP); } [MenuItem("XCharts/TextMeshPro Disable")] public static void DisableTextMeshPro() { - XChartsMgr.ModifyTMPRefence(true); - XChartsMgr.DisableTextMeshPro(); + RemoveSpecifyReferenceFromAssembly(Platform.Editor, ASMDEF_TMP); + RemoveSpecifyReferenceFromAssembly(Platform.Runtime, ASMDEF_TMP); + DefineSymbolsUtil.RemoveGlobalDefine(SYMBOL_TMP); + XChartsMgr.RemoveAllChartObject(); } +#endif + #endregion + + #region InputSystem Support +#if UNITY_2019_1_OR_NEWER + //As InputSystem is released in 2019.1+ ,when unity version is 2019.1+ , enable InputSystem Support + const string SYMBOL_I_S = "INPUT_SYSTEM_ENABLED"; + const string ASMDEF_I_S = "Unity.InputSystem"; + [MenuItem("XCharts/InputSystem Enable")] + public static void EnableInputSystem() + { + if (!IsSpecifyAssemblyExist(ASMDEF_I_S)) + { + Debug.LogError("InputSystem is not in the project, please import InputSystem package first."); + return; + } + // insert input system package into editor and runtime assembly + InsertSpecifyReferenceIntoAssembly(Platform.Editor, ASMDEF_I_S); + InsertSpecifyReferenceIntoAssembly(Platform.Runtime, ASMDEF_I_S); + // add scripting define symbols + DefineSymbolsUtil.AddGlobalDefine(SYMBOL_I_S); + } + [MenuItem("XCharts/InputSystem Disable")] + public static void DisableInputSystem() + { + // remove input system package into editor and runtime assembly + RemoveSpecifyReferenceFromAssembly(Platform.Editor, ASMDEF_I_S); + RemoveSpecifyReferenceFromAssembly(Platform.Runtime, ASMDEF_I_S); + // remove scripting define symbols + DefineSymbolsUtil.RemoveGlobalDefine(SYMBOL_I_S); + } +#endif + #endregion + + #region Assistant members +#if UNITY_2017_1_OR_NEWER + // as text mesh pro is released in 2017.1, so we may use these function and types in 2017.1 or later + private static void InsertSpecifyReferenceIntoAssembly(Platform platform, string reference) + { + var file = GetPackageAssemblyDefinitionPath(platform); + var content = File.ReadAllText(file); + var data = new AssemblyDefinitionData(); + EditorJsonUtility.FromJsonOverwrite(content, data); + if (!data.references.Contains(reference)) + { + data.references.Add(reference); + var json = EditorJsonUtility.ToJson(data, true); + File.WriteAllText(file, json); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + } + } + + private static void RemoveSpecifyReferenceFromAssembly(Platform platform, string reference) + { + var file = GetPackageAssemblyDefinitionPath(platform); + var content = File.ReadAllText(file); + var data = new AssemblyDefinitionData(); + EditorJsonUtility.FromJsonOverwrite(content, data); + if (data.references.Contains(reference)) + { + data.references.Remove(reference); + var json = EditorJsonUtility.ToJson(data, true); + File.WriteAllText(file, json); + } + } + + public enum Platform { Editor, Runtime } + public static string GetPackageAssemblyDefinitionPath(Platform platform) + { + var p = platform == Platform.Editor ? "Editor" : "Runtime"; + var f = "XCharts." + p + ".asmdef"; + var sub = Path.Combine(p, f); + string packagePath = Path.GetFullPath("Packages/com.monitor1394.xcharts"); + if (!Directory.Exists(packagePath)) + { + packagePath = ADB.FindAssets("t:Script") + .Where(v => Path.GetFileNameWithoutExtension(ADB.GUIDToAssetPath(v)) == "XChartsMgr") + .Select(id => ADB.GUIDToAssetPath(id)) + .FirstOrDefault(); + packagePath = Path.GetDirectoryName(packagePath); + packagePath = packagePath.Substring(0, packagePath.LastIndexOf("Runtime")); + } + return Path.Combine(packagePath, sub); + } + + public static bool IsSpecifyAssemblyExist(string name) + { +#if UNITY_2018_1_OR_NEWER + foreach (var assembly in UnityEditor.Compilation.CompilationPipeline.GetAssemblies(UnityEditor.Compilation.AssembliesType.Player)) + { + if (assembly.name.Equals(name)) return true; + } +#elif UNITY_2017_3_OR_NEWER + foreach (var assembly in UnityEditor.Compilation.CompilationPipeline.GetAssemblies()) + { + if (assembly.name.Equals(name)) return true; + } +#endif + return false; + } + + [Serializable] + class AssemblyDefinitionData + { +#pragma warning disable 649 + public string name; + public List<string> references; + public List<string> includePlatforms; + public List<string> excludePlatforms; + public bool allowUnsafeCode; + public bool overrideReferences; + public List<string> precompiledReferences; + public bool autoReferenced; + public List<string> defineConstraints; + public List<string> versionDefines; + public bool noEngineReferences; +#pragma warning restore 649 + } +#endif + #endregion + + } } \ No newline at end of file diff --git a/Runtime/Internal/XChartsMgr.cs b/Runtime/Internal/XChartsMgr.cs index 64265b24..5de9998d 100644 --- a/Runtime/Internal/XChartsMgr.cs +++ b/Runtime/Internal/XChartsMgr.cs @@ -2,8 +2,9 @@ using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.SceneManagement; +using System.Linq; #if UNITY_EDITOR -using UnityEditor; +using ADB = UnityEditor.AssetDatabase; #endif namespace XCharts.Runtime @@ -127,6 +128,7 @@ namespace XCharts.Runtime } #if UNITY_EDITOR + public static string GetPackageFullPath() { string packagePath = Path.GetFullPath("Packages/com.monitor1394.xcharts"); @@ -134,38 +136,13 @@ namespace XCharts.Runtime { return packagePath; } - packagePath = Path.GetFullPath("Assets/.."); - if (Directory.Exists(packagePath)) - { - if (File.Exists(packagePath + "/Assets/Packages/XCharts/package.json")) - { - return packagePath + "/Assets/Packages/XCharts"; - } - - if (File.Exists(packagePath + "/Assets/XCharts/package.json")) - { - return packagePath + "/Assets/XCharts"; - } - - string[] matchingPaths = Directory.GetDirectories(packagePath, "XCharts", SearchOption.AllDirectories); - string path = ValidateLocation(matchingPaths, packagePath); - if (path != null) return Path.Combine(packagePath, path); - } - return null; - } - - private static string ValidateLocation(string[] paths, string projectPath) - { - for (int i = 0; i < paths.Length; i++) - { - if (File.Exists(paths[i] + "/package.json")) - { - string folderPath = paths[i].Replace(projectPath, ""); - folderPath = folderPath.TrimStart('\\', '/'); - return folderPath; - } - } - return null; + packagePath = ADB.FindAssets("t:Script") + .Where(v => Path.GetFileNameWithoutExtension(ADB.GUIDToAssetPath(v)) == "XChartsMgr") + .Select(id => ADB.GUIDToAssetPath(id)) + .FirstOrDefault(); + packagePath = Path.GetDirectoryName(packagePath); + packagePath = packagePath.Substring(0, packagePath.LastIndexOf("Runtime")); + return packagePath; } [UnityEditor.Callbacks.DidReloadScripts] @@ -185,133 +162,6 @@ namespace XCharts.Runtime } } } - - public static void EnableTextMeshPro() - { - DefineSymbolsUtil.AddGlobalDefine("dUI_TextMeshPro"); - RemoveAllChartObject(); - } - - public static void DisableTextMeshPro() - { - DefineSymbolsUtil.RemoveGlobalDefine("dUI_TextMeshPro"); - RemoveAllChartObject(); - } - - public static bool IsExistTMPAssembly() - { - -#if UNITY_2018_1_OR_NEWER - foreach (var assembly in UnityEditor.Compilation.CompilationPipeline.GetAssemblies(UnityEditor.Compilation.AssembliesType.Player)) - { - if (assembly.name.Equals("Unity.TextMeshPro")) return true; - } -#elif UNITY_2017_3_OR_NEWER - foreach (var assembly in UnityEditor.Compilation.CompilationPipeline.GetAssemblies()) - { - if (assembly.name.Equals("Unity.TextMeshPro")) return true; - } -#endif - return false; - } - - public static bool ModifyTMPRefence(bool removeTMP = false) - { - var packagePath = GetPackageFullPath(); - if (!ModifyTMPRefence(packagePath + "/Runtime/XCharts.Runtime.asmdef", removeTMP)) return false; - if (!ModifyTMPRefence(packagePath + "/Editor/XCharts.Editor.asmdef", removeTMP)) return false; - return true; - } - - private static bool ModifyTMPRefence(string asmdefPath, bool removeTMP = false) - { - if (!File.Exists(asmdefPath)) - { - Debug.LogError("AddTMPRefence ERROR: can't find: " + asmdefPath); - return false; - } - try - { - var dest = new List<string>(); - var refs = new List<string>(); - var lines = File.ReadAllLines(asmdefPath); - var referencesStart = false; - var addedTMP = false; - var removedTMP = false; - var tmpName = "\"Unity.TextMeshPro\""; - var refCount = 0; - foreach (var line in lines) - { - if (string.IsNullOrEmpty(line)) continue; - if (line.Contains("\"references\": [")) - { - dest.Add(line); - referencesStart = true; - } - else if (referencesStart) - { - if (line.Contains("],")) - { - referencesStart = false; - if (refCount > 0) - { - var old = dest[dest.Count - 1]; - if (old.EndsWith(",")) - dest[dest.Count - 1] = old.Substring(0, old.Length - 1); - } - if (!removeTMP && !refs.Contains(tmpName)) - { - if (refs.Count > 0) - dest[dest.Count - 1] = dest[dest.Count - 1] + ","; - dest.Add(" " + tmpName); - dest.Add(line); - addedTMP = true; - } - else - { - dest.Add(line); - } - } - else - { - if (removeTMP) - { - if (!line.Contains(tmpName)) - { - dest.Add(line); - refCount++; - } - else - { - removedTMP = true; - } - } - else - { - dest.Add(line); - refs.Add(line.Trim()); - } - } - } - else - { - dest.Add(line); - } - } - if (addedTMP || removedTMP) - { - File.WriteAllText(asmdefPath, string.Join("\n", dest.ToArray())); - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - } - return true; - } - catch (System.Exception e) - { - Debug.LogError("AddTMPRefence ERROR:" + e.Message); - return false; - } - } #endif } } \ No newline at end of file From c9cd4ee38a9e8888ca971e7dc666aed828642415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=B9=E4=B8=8A=E6=B5=B7?= <bshsf@qq.com> Date: Mon, 30 Jan 2023 10:41:41 +0800 Subject: [PATCH 20/55] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81=E5=AF=B9?= =?UTF-8?q?=E6=8C=89=E9=94=AE=E7=9A=84=E8=AF=BB=E5=8F=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 简化了部分协同程序的使用逻辑 --- Examples/Example00_CheatSheet.cs | 99 +++++++++++++---------------- Examples/Example10_LineChart.cs | 43 +++++-------- Examples/Example11_AddSinCurve.cs | 13 ++-- Examples/Example13_LineSimple.cs | 3 + Examples/Example20_BarChart.cs | 66 +++++++++---------- Examples/Example30_PieChart.cs | 60 +++++++++-------- Examples/Example31_PieUpdateName.cs | 4 +- Examples/Example41_RadarUpdate.cs | 4 +- Examples/Example80_Polar.cs | 4 +- Examples/Example90_Candlestick.cs | 12 ++-- Examples/Example_AddChart.cs | 3 + Examples/Example_DynamicChart.cs | 4 +- Examples/Example_Test.cs | 4 +- Examples/Example_TestTime.cs | 4 +- Examples/XCharts.Examples.asmdef | 3 +- 15 files changed, 160 insertions(+), 166 deletions(-) diff --git a/Examples/Example00_CheatSheet.cs b/Examples/Example00_CheatSheet.cs index 99bce3df..4492c94b 100644 --- a/Examples/Example00_CheatSheet.cs +++ b/Examples/Example00_CheatSheet.cs @@ -11,42 +11,33 @@ namespace XCharts.Example private LineChart chart; private float speed = 100f; - void Awake() - { - LoopDemo(); - } - private void OnEnable() { - LoopDemo(); - } - - void LoopDemo() - { - StopAllCoroutines(); StartCoroutine(CheatSheet()); } IEnumerator CheatSheet() { StartCoroutine(InitChart()); - StartCoroutine(ComponentTitle()); - yield return new WaitForSeconds(2); - StartCoroutine(ComponentAxis()); - yield return new WaitForSeconds(2); - StartCoroutine(ComponentGrid()); - yield return new WaitForSeconds(2); - StartCoroutine(ComponentSerie()); - yield return new WaitForSeconds(4); - StartCoroutine(ComponentLegend()); - yield return new WaitForSeconds(4); - StartCoroutine(ComponentTheme()); - yield return new WaitForSeconds(4); - StartCoroutine(ComponentDataZoom()); - yield return new WaitForSeconds(5); - StartCoroutine(ComponentVisualMap()); - yield return new WaitForSeconds(3); - LoopDemo(); + while (true) + { + StartCoroutine(ComponentTitle()); + yield return new WaitForSeconds(2); + StartCoroutine(ComponentAxis()); + yield return new WaitForSeconds(2); + StartCoroutine(ComponentGrid()); + yield return new WaitForSeconds(2); + StartCoroutine(ComponentSerie()); + yield return new WaitForSeconds(4); + StartCoroutine(ComponentLegend()); + yield return new WaitForSeconds(4); + StartCoroutine(ComponentTheme()); + yield return new WaitForSeconds(4); + StartCoroutine(ComponentDataZoom()); + yield return new WaitForSeconds(5); + StartCoroutine(ComponentVisualMap()); + yield return new WaitForSeconds(3); + } } IEnumerator InitChart() @@ -54,8 +45,8 @@ namespace XCharts.Example chart = gameObject.GetComponent<LineChart>(); if (chart == null) gameObject.AddComponent<LineChart>(); - chart.GetChartComponent<Title>().show = true; - chart.GetChartComponent<Title>().text = "术语解析-组件"; + chart.GetOrAddChartComponent<Title>().show = true; + chart.EnsureChartComponent<Title>().text = "术语解析-组件"; var grid = chart.GetOrAddChartComponent<GridCoord>(); grid.bottom = 30; @@ -81,31 +72,31 @@ namespace XCharts.Example IEnumerator ComponentTitle() { - chart.GetChartComponent<Title>().text = "术语解析 - 组件"; - chart.GetChartComponent<Title>().subText = "Title 标题:可指定主标题和子标题"; - chart.GetChartComponent<XAxis>().show = true; - chart.GetChartComponent<YAxis>().show = true; - chart.GetChartComponent<Legend>().show = false; + chart.EnsureChartComponent<Title>().text = "术语解析 - 组件"; + chart.EnsureChartComponent<Title>().subText = "Title 标题:可指定主标题和子标题"; + chart.EnsureChartComponent<XAxis>().show = true; + chart.EnsureChartComponent<YAxis>().show = true; + chart.EnsureChartComponent<Legend>().show = false; chart.series[0].show = false; chart.series[1].show = false; for (int i = 0; i < 4; i++) { - chart.GetChartComponent<Title>().show = !chart.GetChartComponent<Title>().show; + chart.EnsureChartComponent<Title>().show = !chart.EnsureChartComponent<Title>().show; chart.RefreshChart(); yield return new WaitForSeconds(0.2f); } - chart.GetChartComponent<Title>().show = true; + chart.EnsureChartComponent<Title>().show = true; chart.RefreshChart(); } IEnumerator ComponentAxis() { - chart.GetChartComponent<Title>().subText = "Axis 坐标轴:配置X和Y轴的轴线、刻度、标签等样式外观配置"; + chart.EnsureChartComponent<Title>().subText = "Axis 坐标轴:配置X和Y轴的轴线、刻度、标签等样式外观配置"; chart.series[0].show = false; chart.series[1].show = false; - var xAxis = chart.GetChartComponent<XAxis>(); - var yAxis = chart.GetChartComponent<YAxis>(); + var xAxis = chart.EnsureChartComponent<XAxis>(); + var yAxis = chart.EnsureChartComponent<YAxis>(); for (int i = 0; i < 4; i++) { xAxis.show = !xAxis.show; @@ -121,8 +112,8 @@ namespace XCharts.Example IEnumerator ComponentGrid() { - chart.GetChartComponent<Title>().subText = "Grid 网格:调整坐标系边距和颜色等"; - var grid = chart.GetChartComponent<GridCoord>(); + chart.EnsureChartComponent<Title>().subText = "Grid 网格:调整坐标系边距和颜色等"; + var grid = chart.EnsureChartComponent<GridCoord>(); for (int i = 0; i < 4; i++) { grid.backgroundColor = i % 2 == 0 ? Color.clear : Color.grey; @@ -136,7 +127,7 @@ namespace XCharts.Example IEnumerator ComponentSerie() { - chart.GetChartComponent<Title>().subText = "Serie 系列:调整坐标系边距和颜色等"; + chart.EnsureChartComponent<Title>().subText = "Serie 系列:调整坐标系边距和颜色等"; chart.series[0].show = true; chart.series[1].show = true; chart.AnimationReset(); @@ -157,10 +148,10 @@ namespace XCharts.Example IEnumerator ComponentLegend() { - chart.GetChartComponent<Title>().subText = "Legend 图例:展示不同系列的名字和颜色,可控制系列显示等"; - var legend = chart.GetChartComponent<Legend>(); + chart.EnsureChartComponent<Title>().subText = "Legend 图例:展示不同系列的名字和颜色,可控制系列显示等"; + var legend = chart.EnsureChartComponent<Legend>(); legend.show = true; - var grid = chart.GetChartComponent<GridCoord>(); + var grid = chart.EnsureChartComponent<GridCoord>(); grid.top = 80; legend.location.top = 50; chart.RefreshChart(); @@ -187,23 +178,23 @@ namespace XCharts.Example IEnumerator ComponentTheme() { - chart.GetChartComponent<Title>().subText = "Theme 主题:可从全局上配置图表的颜色、字体等效果,支持默认主题切换"; + chart.EnsureChartComponent<Title>().subText = "Theme 主题:可从全局上配置图表的颜色、字体等效果,支持默认主题切换"; yield return new WaitForSeconds(1f); - chart.GetChartComponent<Title>().subText = "Theme 主题:Light主题"; + chart.EnsureChartComponent<Title>().subText = "Theme 主题:Light主题"; chart.UpdateTheme(ThemeType.Light); yield return new WaitForSeconds(1f); - chart.GetChartComponent<Title>().subText = "Theme 主题:Dark主题"; + chart.EnsureChartComponent<Title>().subText = "Theme 主题:Dark主题"; chart.UpdateTheme(ThemeType.Dark); yield return new WaitForSeconds(1f); - chart.GetChartComponent<Title>().subText = "Theme 主题:Default主题"; + chart.EnsureChartComponent<Title>().subText = "Theme 主题:Default主题"; chart.UpdateTheme(ThemeType.Default); yield return new WaitForSeconds(1f); } IEnumerator ComponentDataZoom() { - chart.GetChartComponent<Title>().subText = "DataZoom 区域缩放:可通过拖、拽、缩小、放大来观察细节数据"; - var grid = chart.GetChartComponent<GridCoord>(); + chart.EnsureChartComponent<Title>().subText = "DataZoom 区域缩放:可通过拖、拽、缩小、放大来观察细节数据"; + var grid = chart.EnsureChartComponent<GridCoord>(); grid.bottom = 70; var dataZoom = chart.GetOrAddChartComponent<DataZoom>(); @@ -265,7 +256,7 @@ namespace XCharts.Example IEnumerator ComponentVisualMap() { - chart.GetChartComponent<Title>().subText = "VisualMap 视觉映射:可从全局上配置图表的颜色、字体等效果,支持默认主题切换"; + chart.EnsureChartComponent<Title>().subText = "VisualMap 视觉映射:可从全局上配置图表的颜色、字体等效果,支持默认主题切换"; var visualMap = chart.GetOrAddChartComponent<VisualMap>(); visualMap.show = true; @@ -292,7 +283,7 @@ namespace XCharts.Example "#a50026" }; visualMap.AddColors(colors); - var grid = chart.GetChartComponent<GridCoord>(); + var grid = chart.EnsureChartComponent<GridCoord>(); grid.left = 80; grid.bottom = 100; chart.RefreshChart(); diff --git a/Examples/Example10_LineChart.cs b/Examples/Example10_LineChart.cs index 1067b991..c319751b 100644 --- a/Examples/Example10_LineChart.cs +++ b/Examples/Example10_LineChart.cs @@ -11,39 +11,30 @@ namespace XCharts.Example private Serie serie; private int m_DataNum = 8; - void Awake() - { - LoopDemo(); - } - private void OnEnable() { - LoopDemo(); - } - - void LoopDemo() - { - StopAllCoroutines(); StartCoroutine(PieDemo()); } IEnumerator PieDemo() { - StartCoroutine(AddSimpleLine()); - yield return new WaitForSeconds(2); - StartCoroutine(ChangeLineType()); - yield return new WaitForSeconds(8); - StartCoroutine(LineAreaStyleSettings()); - yield return new WaitForSeconds(5); - StartCoroutine(LineArrowSettings()); - yield return new WaitForSeconds(2); - StartCoroutine(LineSymbolSettings()); - yield return new WaitForSeconds(7); - StartCoroutine(LineLabelSettings()); - yield return new WaitForSeconds(3); - StartCoroutine(LineMutilSerie()); - yield return new WaitForSeconds(5); - LoopDemo(); + while (true) + { + StartCoroutine(AddSimpleLine()); + yield return new WaitForSeconds(2); + StartCoroutine(ChangeLineType()); + yield return new WaitForSeconds(8); + StartCoroutine(LineAreaStyleSettings()); + yield return new WaitForSeconds(5); + StartCoroutine(LineArrowSettings()); + yield return new WaitForSeconds(2); + StartCoroutine(LineSymbolSettings()); + yield return new WaitForSeconds(7); + StartCoroutine(LineLabelSettings()); + yield return new WaitForSeconds(3); + StartCoroutine(LineMutilSerie()); + yield return new WaitForSeconds(5); + } } IEnumerator AddSimpleLine() diff --git a/Examples/Example11_AddSinCurve.cs b/Examples/Example11_AddSinCurve.cs index 31491178..e54efba0 100644 --- a/Examples/Example11_AddSinCurve.cs +++ b/Examples/Example11_AddSinCurve.cs @@ -4,7 +4,6 @@ using XCharts.Runtime; namespace XCharts.Example { [DisallowMultipleComponent] - [ExecuteInEditMode] public class Example11_AddSinCurve : MonoBehaviour { private float time; @@ -18,14 +17,14 @@ namespace XCharts.Example { chart = gameObject.AddComponent<LineChart>(); } - chart.GetChartComponent<Title>().show = true; - chart.GetChartComponent<Title>().text = "Sin Curve"; + chart.EnsureChartComponent<Title>().show = true; + chart.EnsureChartComponent<Title>().text = "Sin Curve"; - chart.GetChartComponent<Tooltip>().show = true; - chart.GetChartComponent<Legend>().show = false; + chart.EnsureChartComponent<Tooltip>().show = true; + chart.EnsureChartComponent<Legend>().show = false; - var xAxis = chart.GetChartComponent<XAxis>(); - var yAxis = chart.GetChartComponent<YAxis>(); + var xAxis = chart.EnsureChartComponent<XAxis>(); + var yAxis = chart.EnsureChartComponent<YAxis>(); xAxis.show = true; yAxis.show = true; diff --git a/Examples/Example13_LineSimple.cs b/Examples/Example13_LineSimple.cs index 153ef575..0e0649f4 100644 --- a/Examples/Example13_LineSimple.cs +++ b/Examples/Example13_LineSimple.cs @@ -1,4 +1,7 @@ using UnityEngine; +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif using XCharts.Runtime; namespace XCharts.Example diff --git a/Examples/Example20_BarChart.cs b/Examples/Example20_BarChart.cs index 270321ac..5dcede4f 100644 --- a/Examples/Example20_BarChart.cs +++ b/Examples/Example20_BarChart.cs @@ -11,48 +11,38 @@ namespace XCharts.Example private Serie serie, serie2; private int m_DataNum = 5; - void Awake() - { - LoopDemo(); - } - private void OnEnable() { - LoopDemo(); - } - - void LoopDemo() - { - StopAllCoroutines(); StartCoroutine(PieDemo()); } IEnumerator PieDemo() { - StartCoroutine(AddSimpleBar()); - yield return new WaitForSeconds(2); - StartCoroutine(BarMutilSerie()); - yield return new WaitForSeconds(3); - StartCoroutine(ZebraBar()); - yield return new WaitForSeconds(3); - StartCoroutine(SameBarAndNotStack()); - yield return new WaitForSeconds(3); - StartCoroutine(SameBarAndStack()); - yield return new WaitForSeconds(3); - StartCoroutine(SameBarAndPercentStack()); - yield return new WaitForSeconds(10); - - LoopDemo(); + while (true) + { + StartCoroutine(AddSimpleBar()); + yield return new WaitForSeconds(2); + StartCoroutine(BarMutilSerie()); + yield return new WaitForSeconds(3); + StartCoroutine(ZebraBar()); + yield return new WaitForSeconds(3); + StartCoroutine(SameBarAndNotStack()); + yield return new WaitForSeconds(3); + StartCoroutine(SameBarAndStack()); + yield return new WaitForSeconds(3); + StartCoroutine(SameBarAndPercentStack()); + yield return new WaitForSeconds(10); + } } IEnumerator AddSimpleBar() { chart = gameObject.GetComponent<BarChart>(); if (chart == null) chart = gameObject.AddComponent<BarChart>(); - chart.GetChartComponent<Title>().text = "BarChart - 柱状图"; - chart.GetChartComponent<Title>().subText = "普通柱状图"; + chart.EnsureChartComponent<Title>().text = "BarChart - 柱状图"; + chart.EnsureChartComponent<Title>().subText = "普通柱状图"; - var yAxis = chart.GetChartComponent<YAxis>(); + var yAxis = chart.EnsureChartComponent<YAxis>(); yAxis.minMaxType = Axis.AxisMinMaxType.Default; chart.RemoveData(); @@ -68,7 +58,7 @@ namespace XCharts.Example IEnumerator BarMutilSerie() { - chart.GetChartComponent<Title>().subText = "多条柱状图"; + chart.EnsureChartComponent<Title>().subText = "多条柱状图"; float now = serie.barWidth - 0.35f; while (serie.barWidth > 0.35f) @@ -90,7 +80,7 @@ namespace XCharts.Example IEnumerator ZebraBar() { - chart.GetChartComponent<Title>().subText = "斑马柱状图"; + chart.EnsureChartComponent<Title>().subText = "斑马柱状图"; serie.barType = BarType.Zebra; serie2.barType = BarType.Zebra; serie.barZebraWidth = serie.barZebraGap = 4; @@ -101,7 +91,7 @@ namespace XCharts.Example IEnumerator SameBarAndNotStack() { - chart.GetChartComponent<Title>().subText = "非堆叠同柱"; + chart.EnsureChartComponent<Title>().subText = "非堆叠同柱"; serie.barType = serie2.barType = BarType.Normal; serie.stack = ""; serie2.stack = ""; @@ -112,7 +102,7 @@ namespace XCharts.Example IEnumerator SameBarAndStack() { - chart.GetChartComponent<Title>().subText = "堆叠同柱"; + chart.EnsureChartComponent<Title>().subText = "堆叠同柱"; serie.barType = serie2.barType = BarType.Normal; serie.stack = "samename"; serie2.stack = "samename"; @@ -132,19 +122,25 @@ namespace XCharts.Example IEnumerator SameBarAndPercentStack() { - chart.GetChartComponent<Title>().subText = "百分比堆叠同柱"; + chart.EnsureChartComponent<Title>().subText = "百分比堆叠同柱"; serie.barType = serie2.barType = BarType.Normal; serie.stack = "samename"; serie2.stack = "samename"; serie.barPercentStack = true; - - serie.AddExtraComponent<LabelStyle>(); + if (null == serie.label) + { + serie.AddExtraComponent<LabelStyle>(); + } serie.label.show = true; serie.label.position = LabelStyle.Position.Center; serie.label.textStyle.color = Color.white; serie.label.formatter = "{d:f0}%"; + if (null == serie2.label) + { + serie2.AddExtraComponent<LabelStyle>(); + } serie2.label.show = true; serie2.label.position = LabelStyle.Position.Center; serie2.label.textStyle.color = Color.white; diff --git a/Examples/Example30_PieChart.cs b/Examples/Example30_PieChart.cs index e40f063c..c7b563d3 100644 --- a/Examples/Example30_PieChart.cs +++ b/Examples/Example30_PieChart.cs @@ -13,45 +13,37 @@ namespace XCharts.Example private float m_RadiusSpeed = 100f; private float m_CenterSpeed = 1f; - void Awake() - { - LoopDemo(); - } - private void OnEnable() { - LoopDemo(); - } - - void LoopDemo() - { - StopAllCoroutines(); StartCoroutine(PieDemo()); } IEnumerator PieDemo() { - StartCoroutine(PieAdd()); - yield return new WaitForSeconds(2); - StartCoroutine(PieShowLabel()); - yield return new WaitForSeconds(4); - StartCoroutine(Doughnut()); - yield return new WaitForSeconds(3); - StartCoroutine(DoublePie()); - yield return new WaitForSeconds(2); - StartCoroutine(RosePie()); - yield return new WaitForSeconds(5); - LoopDemo(); + while (true) + { + StartCoroutine(PieAdd()); + yield return new WaitForSeconds(2); + StartCoroutine(PieShowLabel()); + yield return new WaitForSeconds(4); + StartCoroutine(Doughnut()); + yield return new WaitForSeconds(3); + StartCoroutine(DoublePie()); + yield return new WaitForSeconds(2); + StartCoroutine(RosePie()); + yield return new WaitForSeconds(5); + } } IEnumerator PieAdd() { chart = gameObject.GetComponent<PieChart>(); if (chart == null) chart = gameObject.AddComponent<PieChart>(); + yield return null; chart.GetChartComponent<Title>().text = "PieChart - 饼图"; chart.GetChartComponent<Title>().subText = "基础饼图"; - var legend = chart.GetChartComponent<Legend>(); + var legend = chart.EnsureChartComponent<Legend>(); legend.show = true; legend.location.align = Location.Align.TopLeft; legend.location.top = 60; @@ -72,7 +64,7 @@ namespace XCharts.Example chart.AddData(0, 135, "视频广告"); chart.AddData(0, 1548, "搜索引擎"); - chart.onPointerClickPie = delegate(PointerEventData e, int serieIndex, int dataIndex) + chart.onPointerClickPie = delegate (PointerEventData e, int serieIndex, int dataIndex) { }; @@ -81,7 +73,7 @@ namespace XCharts.Example IEnumerator PieShowLabel() { - chart.GetChartComponent<Title>().subText = "显示文本标签"; + chart.EnsureChartComponent<Title>().subText = "显示文本标签"; serie.AddExtraComponent<LabelStyle>(); serie.label.show = true; @@ -105,7 +97,7 @@ namespace XCharts.Example IEnumerator Doughnut() { - chart.GetChartComponent<Title>().subText = "圆环图"; + chart.EnsureChartComponent<Title>().subText = "圆环图"; serie.radius[0] = 2f; while (serie.radius[0] < serie.radius[1] * 0.7f) { @@ -129,8 +121,7 @@ namespace XCharts.Example IEnumerator DoublePie() { - chart.GetChartComponent<Title>().subText = "多图组合"; - + chart.EnsureChartComponent<Title>().subText = "多图组合"; serie1 = chart.AddSerie<Pie>("访问来源2"); chart.AddData(1, 335, "直达"); chart.AddData(1, 679, "营销广告"); @@ -146,7 +137,14 @@ namespace XCharts.Example chart.RefreshChart(); yield return null; } - + if (null == serie.label) + { + serie.AddExtraComponent<LabelStyle>(); + } + if (null == serie1.label) + { + serie1.AddExtraComponent<LabelStyle>(); + } serie1.label.show = true; serie1.label.position = LabelStyle.Position.Inside; serie1.label.textStyle.color = Color.white; @@ -158,8 +156,8 @@ namespace XCharts.Example IEnumerator RosePie() { - chart.GetChartComponent<Title>().subText = "玫瑰图"; - chart.GetChartComponent<Legend>().show = false; + chart.EnsureChartComponent<Title>().subText = "玫瑰图"; + chart.EnsureChartComponent<Legend>().show = false; serie1.ClearData(); serie.ClearData(); serie1.radius = serie.radius = new float[2] { 0, 80 }; diff --git a/Examples/Example31_PieUpdateName.cs b/Examples/Example31_PieUpdateName.cs index 85091050..8cf1e61e 100644 --- a/Examples/Example31_PieUpdateName.cs +++ b/Examples/Example31_PieUpdateName.cs @@ -1,6 +1,8 @@ using UnityEngine; using XCharts.Runtime; - +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Example { [DisallowMultipleComponent] diff --git a/Examples/Example41_RadarUpdate.cs b/Examples/Example41_RadarUpdate.cs index baaa46be..7ed98895 100644 --- a/Examples/Example41_RadarUpdate.cs +++ b/Examples/Example41_RadarUpdate.cs @@ -1,6 +1,8 @@ using UnityEngine; using XCharts.Runtime; - +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Example { [DisallowMultipleComponent] diff --git a/Examples/Example80_Polar.cs b/Examples/Example80_Polar.cs index fdfb0b04..a468fe09 100644 --- a/Examples/Example80_Polar.cs +++ b/Examples/Example80_Polar.cs @@ -1,6 +1,8 @@ using UnityEngine; using XCharts.Runtime; - +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Example { [DisallowMultipleComponent] diff --git a/Examples/Example90_Candlestick.cs b/Examples/Example90_Candlestick.cs index 7218b6b9..736925c5 100644 --- a/Examples/Example90_Candlestick.cs +++ b/Examples/Example90_Candlestick.cs @@ -1,6 +1,8 @@ using UnityEngine; using XCharts.Runtime; - +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Example { [DisallowMultipleComponent] @@ -18,7 +20,7 @@ namespace XCharts.Example { chart = gameObject.AddComponent<CandlestickChart>(); } - GenerateOHLC(dataCount); + AddData(); } void Update() @@ -29,9 +31,7 @@ namespace XCharts.Example } } - void AddData() { } - - void GenerateOHLC(int count) + void AddData() { chart.ClearData(); @@ -40,7 +40,7 @@ namespace XCharts.Example var boxVals = new float[4]; var dayRange = 12; - for (int i = 0; i < count; i++) + for (int i = 0; i < dataCount; i++) { baseValue = baseValue + Random.Range(0f, 1f) * 30 - 10; for (int j = 0; j < 4; j++) diff --git a/Examples/Example_AddChart.cs b/Examples/Example_AddChart.cs index 80359764..145eb63f 100644 --- a/Examples/Example_AddChart.cs +++ b/Examples/Example_AddChart.cs @@ -1,5 +1,8 @@ using UnityEngine; using XCharts.Runtime; +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Example { diff --git a/Examples/Example_DynamicChart.cs b/Examples/Example_DynamicChart.cs index df35dfb1..2a999d9a 100644 --- a/Examples/Example_DynamicChart.cs +++ b/Examples/Example_DynamicChart.cs @@ -1,6 +1,8 @@ using UnityEngine; using XCharts.Runtime; - +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Example { [DisallowMultipleComponent] diff --git a/Examples/Example_Test.cs b/Examples/Example_Test.cs index e51b0ac9..33018a71 100644 --- a/Examples/Example_Test.cs +++ b/Examples/Example_Test.cs @@ -1,7 +1,9 @@ using UnityEngine; using UnityEngine.UI; using XCharts.Runtime; - +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Example { [DisallowMultipleComponent] diff --git a/Examples/Example_TestTime.cs b/Examples/Example_TestTime.cs index 59f813d2..1ed2804b 100644 --- a/Examples/Example_TestTime.cs +++ b/Examples/Example_TestTime.cs @@ -1,6 +1,8 @@ using UnityEngine; using XCharts.Runtime; - +#if INPUT_SYSTEM_ENABLED +using Input = XCharts.Runtime.InputHelper; +#endif namespace XCharts.Example { [DisallowMultipleComponent] diff --git a/Examples/XCharts.Examples.asmdef b/Examples/XCharts.Examples.asmdef index 638b2960..2428dbeb 100644 --- a/Examples/XCharts.Examples.asmdef +++ b/Examples/XCharts.Examples.asmdef @@ -10,5 +10,6 @@ "overrideReferences": false, "precompiledReferences": [], "autoReferenced": true, - "defineConstraints": [] + "defineConstraints": [], + "versionDefines": [] } \ No newline at end of file From ace8537650e9a2f64b95c2da9f6ed6b662cc45a4 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Wed, 1 Feb 2023 21:00:37 +0800 Subject: [PATCH 21/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`XChartsMgr.ContainsCha?= =?UTF-8?q?rt()`=E6=8E=A5=E5=8F=A3=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Internal/XChartsMgr.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Runtime/Internal/XChartsMgr.cs b/Runtime/Internal/XChartsMgr.cs index 5de9998d..ae647124 100644 --- a/Runtime/Internal/XChartsMgr.cs +++ b/Runtime/Internal/XChartsMgr.cs @@ -79,7 +79,8 @@ namespace XCharts.Runtime public static bool ContainsChart(string chartName) { if (string.IsNullOrEmpty(chartName)) return false; - return GetCharts(chartName) != null; + var list = GetCharts(chartName); + return list != null && list.Count > 0; } public static bool ContainsChart(BaseChart chart) From 22715dab954c611c2cc7ff86ccf5b2c918091527 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 2 Feb 2023 07:58:50 +0800 Subject: [PATCH 22/55] =?UTF-8?q?=E4=BC=98=E5=8C=96`SerieData`=E7=9A=84`ig?= =?UTF-8?q?nore`=E8=AE=BE=E7=BD=AE=E6=97=B6=E7=9A=84=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 3 +++ Editor/Series/BarEditor.cs | 1 - Editor/Series/LineEditor.cs | 1 - Runtime/Serie/Serie.cs | 23 +++++++++++++--------- Runtime/Serie/SerieHelper.cs | 36 +++++++++++++++++----------------- Runtime/Serie/SeriesHelper.cs | 12 ++++++------ 6 files changed, 41 insertions(+), 35 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 90a155a5..36107da5 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,9 @@ slug: /changelog ## master +* (2023.02.02) 优化`SerieData`的`ignore`设置时的忽略数据判断 +* (2023.02.01) 修复`XChartsMgr.ContainsChart()`接口异常 +* (2023.01.31) 增加`InputSystem`的支持 (#242) (by Bian-Sh) * (2023.01.11) 修复`Inspector`上移除`Component`后图表没有及时刷新的问题 (#241) * (2023.01.06) 修复`Pie`在最后的几个数据都为0时`Label`显示不正常的问题 (#240) * (2023.01.03) 删除`Serie`的`MarkColor`,增加`ItemStyle`的`MarkColor` diff --git a/Editor/Series/BarEditor.cs b/Editor/Series/BarEditor.cs index 55a1af79..b2521820 100644 --- a/Editor/Series/BarEditor.cs +++ b/Editor/Series/BarEditor.cs @@ -48,7 +48,6 @@ namespace XCharts.Editor PropertyField("m_Large"); PropertyField("m_LargeThreshold"); PropertyField("m_PlaceHolder"); - PropertyField("m_MarkColor"); }); PropertyField("m_ItemStyle"); PropertyField("m_Animation"); diff --git a/Editor/Series/LineEditor.cs b/Editor/Series/LineEditor.cs index 91f6fe62..95b2e67c 100644 --- a/Editor/Series/LineEditor.cs +++ b/Editor/Series/LineEditor.cs @@ -37,7 +37,6 @@ namespace XCharts.Editor PropertyField("m_ShowAsPositiveNumber"); PropertyField("m_Large"); PropertyField("m_LargeThreshold"); - PropertyField("m_MarkColor"); }); PropertyField("m_Symbol"); PropertyField("m_LineStyle"); diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index 59f9a359..1f0e47ce 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -371,7 +371,7 @@ namespace XCharts.Runtime public SerieColorBy colorBy { //get { return m_ColorBy; } - get { return m_ColorBy == SerieColorBy.Default?defaultColorBy : m_ColorBy; } + get { return m_ColorBy == SerieColorBy.Default ? defaultColorBy : m_ColorBy; } set { if (PropertyUtil.SetStruct(ref m_ColorBy, value)) { SetAllDirty(); } } } /// <summary> @@ -1061,7 +1061,7 @@ namespace XCharts.Runtime var max = double.MinValue; foreach (var sdata in data) { - if (sdata.show && !IsIgnoreValue(sdata.data[1]) && sdata.data[1] > max) + if (sdata.show && !IsIgnoreValue(sdata, sdata.data[1]) && sdata.data[1] > max) { max = sdata.data[1]; } @@ -1080,7 +1080,7 @@ namespace XCharts.Runtime var max = double.MinValue; foreach (var sdata in data) { - if (sdata.show && !IsIgnoreValue(sdata.data[0]) && sdata.data[0] > max) + if (sdata.show && !IsIgnoreValue(sdata, sdata.data[0]) && sdata.data[0] > max) { max = sdata.data[0]; } @@ -1099,7 +1099,7 @@ namespace XCharts.Runtime var min = double.MaxValue; foreach (var sdata in data) { - if (sdata.show && !IsIgnoreValue(sdata.data[1]) && sdata.data[1] < min) + if (sdata.show && !IsIgnoreValue(sdata, sdata.data[1]) && sdata.data[1] < min) { min = sdata.data[1]; } @@ -1118,7 +1118,7 @@ namespace XCharts.Runtime var min = double.MaxValue; foreach (var sdata in data) { - if (sdata.show && !IsIgnoreValue(sdata.data[0]) && sdata.data[0] < min) + if (sdata.show && !IsIgnoreValue(sdata, sdata.data[0]) && sdata.data[0] < min) { min = sdata.data[0]; } @@ -1139,7 +1139,7 @@ namespace XCharts.Runtime { foreach (var sdata in data) { - if (sdata.show && !IsIgnoreValue(sdata.data[1])) + if (sdata.show && !IsIgnoreValue(sdata, sdata.data[1])) total += sdata.data[1]; } } @@ -1149,7 +1149,7 @@ namespace XCharts.Runtime var unscaledTime = animation.unscaledTime; foreach (var sdata in data) { - if (sdata.show && !IsIgnoreValue(sdata.data[1])) + if (sdata.show && !IsIgnoreValue(sdata, sdata.data[1])) total += sdata.GetCurrData(1, duration, unscaledTime); } } @@ -1167,7 +1167,7 @@ namespace XCharts.Runtime double total = 0; foreach (var sdata in data) { - if (sdata.show && !IsIgnoreValue(sdata.data[1])) + if (sdata.show && !IsIgnoreValue(sdata, sdata.data[1])) total += sdata.data[0]; } return total; @@ -1780,7 +1780,7 @@ namespace XCharts.Runtime public bool IsIgnoreValue(SerieData serieData, int dimension = 1) { - return serieData.ignore || IsIgnoreValue(serieData.GetData(dimension)); + return IsIgnoreValue(serieData, serieData.GetData(dimension)); } public bool IsIgnoreValue(double value) @@ -1788,6 +1788,11 @@ namespace XCharts.Runtime return m_Ignore && MathUtil.Approximately(value, m_IgnoreValue); } + public bool IsIgnoreValue(SerieData serieData, double value) + { + return serieData.ignore || IsIgnoreValue(value); + } + public bool IsIgnorePoint(int index) { if (index >= 0 && index < dataCount) diff --git a/Runtime/Serie/SerieHelper.cs b/Runtime/Serie/SerieHelper.cs index 674c6cad..aae27558 100644 --- a/Runtime/Serie/SerieHelper.cs +++ b/Runtime/Serie/SerieHelper.cs @@ -17,7 +17,7 @@ namespace XCharts.Runtime if (serieData.show && serieData.data.Count > dimension) { var value = serieData.data[dimension]; - if (value < min && !serie.IsIgnoreValue(value)) min = value; + if (value < min && !serie.IsIgnoreValue(serieData, value)) min = value; } } return min == double.MaxValue ? 0 : min; @@ -33,7 +33,7 @@ namespace XCharts.Runtime if (serieData.show && serieData.data.Count > dimension) { var value = serieData.data[dimension]; - if (value < min && !serie.IsIgnoreValue(value)) + if (value < min && !serie.IsIgnoreValue(serieData, value)) { min = value; minData = serieData; @@ -52,7 +52,7 @@ namespace XCharts.Runtime if (serieData.show && serieData.data.Count > dimension) { var value = serieData.data[dimension]; - if (value > max && !serie.IsIgnoreValue(value)) max = value; + if (value > max && !serie.IsIgnoreValue(serieData, value)) max = value; } } return max == double.MinValue ? 0 : max; @@ -68,7 +68,7 @@ namespace XCharts.Runtime if (serieData.show && serieData.data.Count > dimension) { var value = serieData.data[dimension]; - if (value > max && !serie.IsIgnoreValue(value)) + if (value > max && !serie.IsIgnoreValue(serieData, value)) { max = value; maxData = serieData; @@ -88,7 +88,7 @@ namespace XCharts.Runtime if (serieData.show && serieData.data.Count > dimension) { var value = serieData.data[dimension]; - if (!serie.IsIgnoreValue(value)) + if (!serie.IsIgnoreValue(serieData, value)) total += value; } } @@ -106,7 +106,7 @@ namespace XCharts.Runtime if (serieData.show && serieData.data.Count > dimension) { var value = serieData.data[dimension]; - if (!serie.IsIgnoreValue(value)) + if (!serie.IsIgnoreValue(serieData, value)) s_TempList.Add(value); } } @@ -137,7 +137,7 @@ namespace XCharts.Runtime if (serieData.show && serieData.data.Count > dimension) { var value = serieData.data[dimension]; - if (!serie.IsIgnoreValue(value)) + if (!serie.IsIgnoreValue(serieData, value)) { if (value > max) max = value; if (value < min) min = value; @@ -177,7 +177,7 @@ namespace XCharts.Runtime for (int j = 0; j < count; j++) { var value = serieData.data[j]; - if (!serie.IsIgnoreValue(value)) + if (!serie.IsIgnoreValue(serieData, value)) { if (value > max) max = value; if (value < min) min = value; @@ -268,7 +268,7 @@ namespace XCharts.Runtime { if (serieData == null) return GetSerieState(serie); if (serieData.context.highlight) return SerieState.Emphasis; - if (serieData.state == SerieState.Auto) return defaultSerieState?serie.state : GetSerieState(serie); + if (serieData.state == SerieState.Auto) return defaultSerieState ? serie.state : GetSerieState(serie); return serieData.state; } @@ -292,7 +292,7 @@ namespace XCharts.Runtime public static void GetItemColor(out Color32 color, out Color32 toColor, Serie serie, SerieData serieData, ThemeStyle theme, SerieState state = SerieState.Auto) { - var colorIndex = serieData != null && serie.colorByData? serieData.index : serie.context.colorIndex; + var colorIndex = serieData != null && serie.colorByData ? serieData.index : serie.context.colorIndex; GetItemColor(out color, out toColor, serie, serieData, theme, colorIndex, state, true); } @@ -438,7 +438,7 @@ namespace XCharts.Runtime if (state == SerieState.Auto) state = GetSerieState(serie, serieData); if (state == SerieState.Normal) { - return serieData != null && serieData.itemStyle != null? serieData.itemStyle : serie.itemStyle; + return serieData != null && serieData.itemStyle != null ? serieData.itemStyle : serie.itemStyle; } else { @@ -452,7 +452,7 @@ namespace XCharts.Runtime if (state == SerieState.Auto) state = GetSerieState(serie, serieData); if (state == SerieState.Normal) { - return serieData != null && serieData.labelStyle != null? serieData.labelStyle : serie.label; + return serieData != null && serieData.labelStyle != null ? serieData.labelStyle : serie.label; } else { @@ -466,7 +466,7 @@ namespace XCharts.Runtime if (state == SerieState.Auto) state = GetSerieState(serie, serieData); if (state == SerieState.Normal) { - return serieData != null && serieData.labelLine != null? serieData.labelLine : serie.labelLine; + return serieData != null && serieData.labelLine != null ? serieData.labelLine : serie.labelLine; } else { @@ -480,7 +480,7 @@ namespace XCharts.Runtime if (state == SerieState.Auto) state = GetSerieState(serie, serieData); if (state == SerieState.Normal) { - return serieData != null && serieData.symbol != null? serieData.symbol : serie.symbol; + return serieData != null && serieData.symbol != null ? serieData.symbol : serie.symbol; } else { @@ -682,7 +682,7 @@ namespace XCharts.Runtime if (stateStyle == null) { var symbol = GetSerieSymbol(serie, serieData, SerieState.Normal); - size = symbol.GetSize(serieData == null? null : serieData.data, defaultSize); + size = symbol.GetSize(serieData == null ? null : serieData.data, defaultSize); switch (state) { case SerieState.Emphasis: @@ -696,7 +696,7 @@ namespace XCharts.Runtime else { var symbol = stateStyle.symbol; - size = symbol.GetSize(serieData == null? null : serieData.data, defaultSize); + size = symbol.GetSize(serieData == null ? null : serieData.data, defaultSize); } return size; } @@ -895,7 +895,7 @@ namespace XCharts.Runtime switch (serie.dataSortType) { case SerieDataSortType.Ascending: - serie.context.sortedData.Sort(delegate(SerieData data1, SerieData data2) + serie.context.sortedData.Sort(delegate (SerieData data1, SerieData data2) { var value1 = data1.GetData(1); var value2 = data2.GetData(1); @@ -905,7 +905,7 @@ namespace XCharts.Runtime }); break; case SerieDataSortType.Descending: - serie.context.sortedData.Sort(delegate(SerieData data1, SerieData data2) + serie.context.sortedData.Sort(delegate (SerieData data1, SerieData data2) { var value1 = data1.GetData(1); var value2 = data2.GetData(1); diff --git a/Runtime/Serie/SeriesHelper.cs b/Runtime/Serie/SeriesHelper.cs index 980f4fd4..85717ee3 100644 --- a/Runtime/Serie/SeriesHelper.cs +++ b/Runtime/Serie/SeriesHelper.cs @@ -346,7 +346,7 @@ namespace XCharts.Runtime if ((isPolar && serie.polarIndex != axisIndex) || (!isPolar && serie.yAxisIndex != axisIndex) || !serie.show) continue; - var updateDuration = serie.animation.enable?serie.animation.dataChangeDuration : 0; + var updateDuration = serie.animation.enable ? serie.animation.dataChangeDuration : 0; var unscaledTime = serie.animation.unscaledTime; if (isPercentStack && SeriesHelper.IsPercentStack<Bar>(series, serie.serieName)) { @@ -355,7 +355,7 @@ namespace XCharts.Runtime } else { - var showData = serie.GetDataList(filterByDataZoom?chart.GetXDataZoomOfSerie(serie) : null); + var showData = serie.GetDataList(filterByDataZoom ? chart.GetXDataZoomOfSerie(serie) : null); if (serie is Candlestick || serie is SimplifiedCandlestick) { foreach (var data in showData) @@ -371,9 +371,9 @@ namespace XCharts.Runtime var performanceMode = serie.IsPerformanceMode(); foreach (var data in showData) { - var currData = performanceMode? data.GetData(yValue?1 : 0, inverse): + var currData = performanceMode ? data.GetData(yValue ? 1 : 0, inverse) : data.GetCurrData(yValue ? 1 : 0, updateDuration, unscaledTime, inverse); - if (!serie.IsIgnoreValue(currData)) + if (!serie.IsIgnoreValue(data, currData)) { if (currData > max) max = currData; if (currData < min) min = currData; @@ -395,7 +395,7 @@ namespace XCharts.Runtime if ((isPolar && serie.polarIndex != axisIndex) || (!isPolar && serie.yAxisIndex != axisIndex) || !serie.show) continue; - var showData = serie.GetDataList(filterByDataZoom?chart.GetXDataZoomOfSerie(serie) : null); + var showData = serie.GetDataList(filterByDataZoom ? chart.GetXDataZoomOfSerie(serie) : null); if (SeriesHelper.IsPercentStack<Bar>(series, serie.stack)) { for (int j = 0; j < showData.Count; j++) @@ -419,7 +419,7 @@ namespace XCharts.Runtime currData = yValue ? showData[j].GetData(1) : showData[j].GetData(0); } if (inverse) currData = -currData; - if (!serie.IsIgnoreValue(currData)) + if (!serie.IsIgnoreValue(showData[j], currData)) _serieTotalValueForMinMax[j] = _serieTotalValueForMinMax[j] + currData; } } From 3d09d82abda858fb4cd8851b875003495f56ef2e Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 2 Feb 2023 08:31:15 +0800 Subject: [PATCH 23/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`DataZoom`=E5=BC=80?= =?UTF-8?q?=E5=90=AF=E6=97=B6`X=E8=BD=B4`=E7=9A=84`Label`=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E4=BC=9A=E6=98=BE=E7=A4=BA=E5=9C=A8=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E5=A4=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Component/Axis/AxisHelper.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 36107da5..b1271a48 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.02.02) 修复`DataZoom`开启时`X轴`的`Label`可能会显示在图表外的问题 * (2023.02.02) 优化`SerieData`的`ignore`设置时的忽略数据判断 * (2023.02.01) 修复`XChartsMgr.ContainsChart()`接口异常 * (2023.01.31) 增加`InputSystem`的支持 (#242) (by Bian-Sh) diff --git a/Runtime/Component/Axis/AxisHelper.cs b/Runtime/Component/Axis/AxisHelper.cs index a5ec4df7..d6ba3043 100644 --- a/Runtime/Component/Axis/AxisHelper.cs +++ b/Runtime/Component/Axis/AxisHelper.cs @@ -219,7 +219,7 @@ namespace XCharts.Runtime if (axis.boundaryGap) { - scaleNum = dataCount > 2 && dataCount % splitNum == 0 ? + scaleNum = dataCount > 1 && dataCount % splitNum == 0 ? splitNum + 1 : splitNum + 2; } From 5e3bc3ff159d95e1bb517c4ee7ead587139f6d32 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Wed, 8 Feb 2023 08:22:39 +0800 Subject: [PATCH 24/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`DataZoom`=E7=9A=84`sta?= =?UTF-8?q?rtLock`=E5=92=8C`endLock`=E5=8F=82=E6=95=B0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=94=81=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/MainComponents/DataZoomEditor.cs | 2 + Runtime/Component/Child/Location.cs | 86 +++++++++++++++---- Runtime/Component/DataZoom/DataZoom.cs | 22 ++++- Runtime/Component/DataZoom/DataZoomHandler.cs | 20 +++-- 4 files changed, 103 insertions(+), 27 deletions(-) diff --git a/Editor/MainComponents/DataZoomEditor.cs b/Editor/MainComponents/DataZoomEditor.cs index fa85d49e..10f0fdba 100644 --- a/Editor/MainComponents/DataZoomEditor.cs +++ b/Editor/MainComponents/DataZoomEditor.cs @@ -29,6 +29,8 @@ namespace XCharts.Editor PropertyField("m_RangeMode"); PropertyField(m_Start); PropertyField(m_End); + PropertyField("m_StartLock"); + PropertyField("m_EndLock"); PropertyField(m_MinShowNum); if (m_Start.floatValue < 0) m_Start.floatValue = 0; if (m_End.floatValue > 100) m_End.floatValue = 100; diff --git a/Runtime/Component/Child/Location.cs b/Runtime/Component/Child/Location.cs index 819e3560..c61de59a 100644 --- a/Runtime/Component/Child/Location.cs +++ b/Runtime/Component/Child/Location.cs @@ -125,10 +125,10 @@ namespace XCharts.Runtime return new Location() { align = Align.CenterLeft, - left = 0.03f, - right = 0, - top = 0, - bottom = 0 + left = 0.03f, + right = 0, + top = 0, + bottom = 0 }; } } @@ -140,10 +140,10 @@ namespace XCharts.Runtime return new Location() { align = Align.CenterRight, - left = 0, - right = 0.03f, - top = 0, - bottom = 0 + left = 0, + right = 0.03f, + top = 0, + bottom = 0 }; } } @@ -155,10 +155,10 @@ namespace XCharts.Runtime return new Location() { align = Align.TopCenter, - left = 0, - right = 0, - top = 0.03f, - bottom = 0 + left = 0, + right = 0, + top = 0.03f, + bottom = 0 }; } } @@ -170,10 +170,10 @@ namespace XCharts.Runtime return new Location() { align = Align.BottomCenter, - left = 0, - right = 0, - top = 0, - bottom = 0.03f + left = 0, + right = 0, + top = 0, + bottom = 0.03f }; } } @@ -268,6 +268,60 @@ namespace XCharts.Runtime } } + public bool IsBottom() + { + switch (m_Align) + { + case Align.BottomCenter: + case Align.BottomLeft: + case Align.BottomRight: +#if dUI_TextMeshPro + case TextAlignmentOptions.Bottom: + case TextAlignmentOptions.BottomLeft: + case TextAlignmentOptions.BottomRight: +#endif + return true; + default: + return false; + } + } + + public bool IsTop() + { + switch (m_Align) + { + case Align.TopCenter: + case Align.TopLeft: + case Align.TopRight: +#if dUI_TextMeshPro + case TextAlignmentOptions.Top: + case TextAlignmentOptions.TopLeft: + case TextAlignmentOptions.TopRight: +#endif + return true; + default: + return false; + } + } + + public bool IsCenter() + { + switch (m_Align) + { + case Align.Center: + case Align.CenterLeft: + case Align.CenterRight: +#if dUI_TextMeshPro + case TextAlignmentOptions.Center: + case TextAlignmentOptions.CenterLeft: + case TextAlignmentOptions.CenterRight: +#endif + return true; + default: + return false; + } + } + public void UpdateRuntimeData(float chartWidth, float chartHeight) { runtimeLeft = left <= 1 ? left * chartWidth : left; diff --git a/Runtime/Component/DataZoom/DataZoom.cs b/Runtime/Component/DataZoom/DataZoom.cs index eb1407c9..27b82507 100644 --- a/Runtime/Component/DataZoom/DataZoom.cs +++ b/Runtime/Component/DataZoom/DataZoom.cs @@ -81,8 +81,6 @@ namespace XCharts.Runtime [SerializeField] private RangeMode m_RangeMode; [SerializeField] private float m_Start; [SerializeField] private float m_End; - //[SerializeField] private float m_StartValue; - //[SerializeField] private float m_EndValue; [SerializeField] private int m_MinShowNum = 1; [Range(1f, 20f)] [SerializeField] private float m_ScrollSensitivity = 1.1f; @@ -91,6 +89,8 @@ namespace XCharts.Runtime [SerializeField] private LineStyle m_LineStyle = new LineStyle(LineStyle.Type.Solid); [SerializeField] private AreaStyle m_AreaStyle = new AreaStyle(); [SerializeField][Since("v3.5.0")] private MarqueeStyle m_MarqueeStyle = new MarqueeStyle(); + [SerializeField][Since("v3.6.0")] private bool m_StartLock; + [SerializeField][Since("v3.6.0")] private bool m_EndLock; public DataZoomContext context = new DataZoomContext(); @@ -305,6 +305,24 @@ namespace XCharts.Runtime set { m_Start = value; if (m_Start < 0) m_Start = 0; if (m_Start > 100) m_Start = 100; SetVerticesDirty(); } } /// <summary> + /// Lock start value. + /// |固定起始值,不让改变。 + /// </summary> + public bool startLock + { + get { return m_StartLock; } + set { if (PropertyUtil.SetStruct(ref m_StartLock, value)) SetVerticesDirty(); } + } + /// <summary> + /// Lock end value. + /// |固定结束值,不让改变。 + /// </summary> + public bool endLock + { + get { return m_EndLock; } + set { if (PropertyUtil.SetStruct(ref m_EndLock, value)) SetVerticesDirty(); } + } + /// <summary> /// The end percentage of the window out of the data extent, in the range of 0 ~ 100. /// |数据窗口范围的结束百分比。范围是:0 ~ 100。 /// </summary> diff --git a/Runtime/Component/DataZoom/DataZoomHandler.cs b/Runtime/Component/DataZoom/DataZoomHandler.cs index 54a88121..fd06635d 100644 --- a/Runtime/Component/DataZoom/DataZoomHandler.cs +++ b/Runtime/Component/DataZoom/DataZoomHandler.cs @@ -22,7 +22,7 @@ namespace XCharts.Runtime { var dataZoom = component; dataZoom.painter = chart.m_PainterUpper; - dataZoom.refreshComponent = delegate() + dataZoom.refreshComponent = delegate () { var dataZoomObject = ChartHelper.AddObject(s_DefaultDataZoom + dataZoom.index, chart.transform, chart.chartMinAnchor, chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta); @@ -398,8 +398,10 @@ namespace XCharts.Runtime if (end < start) end = start; - dataZoom.start = start; - dataZoom.end = end; + if (!dataZoom.startLock) + dataZoom.start = start; + if (!dataZoom.endLock) + dataZoom.end = end; if (dataZoom.realtime) { chart.OnDataZoomRangeChanged(dataZoom); @@ -466,8 +468,8 @@ namespace XCharts.Runtime { m_CheckDataZoomLabel = false; var xAxis = chart.GetChartComponent<XAxis>(dataZoom.xAxisIndexs[0]); - var startIndex = (int) ((xAxis.data.Count - 1) * dataZoom.start / 100); - var endIndex = (int) ((xAxis.data.Count - 1) * dataZoom.end / 100); + var startIndex = (int)((xAxis.data.Count - 1) * dataZoom.start / 100); + var endIndex = (int)((xAxis.data.Count - 1) * dataZoom.end / 100); if (m_DataZoomLastStartIndex != startIndex || m_DataZoomLastEndIndex != endIndex) { @@ -532,7 +534,7 @@ namespace XCharts.Runtime var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist; var maxCount = showData.Count; if (sampleDist > 0) - rate = (int) ((maxCount - serie.minShow) / (dataZoom.context.width / sampleDist)); + rate = (int)((maxCount - serie.minShow) / (dataZoom.context.width / sampleDist)); if (rate < 1) rate = 1; @@ -547,7 +549,7 @@ namespace XCharts.Runtime double value = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i, animationDuration, ref dataChanging, axis, unscaledTime); float pX = dataZoom.context.x + i * scaleWid; - float dataHig = (float) ((maxValue - minValue) == 0 ? 0 : + float dataHig = (float)((maxValue - minValue) == 0 ? 0 : (value - minValue) / (maxValue - minValue) * dataZoom.context.height); np = new Vector3(pX, chart.chartY + dataZoom.bottom + dataHig); if (i > 0) @@ -623,7 +625,7 @@ namespace XCharts.Runtime var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist; var maxCount = showData.Count; if (sampleDist > 0) - rate = (int) ((maxCount - serie.minShow) / (dataZoom.context.height / sampleDist)); + rate = (int)((maxCount - serie.minShow) / (dataZoom.context.height / sampleDist)); if (rate < 1) rate = 1; @@ -639,7 +641,7 @@ namespace XCharts.Runtime animationDuration, ref dataChanging, axis, unscaledTime); float pY = dataZoom.context.y + i * scaleWid; float dataHig = (maxValue - minValue) == 0 ? 0 : - (float) ((value - minValue) / (maxValue - minValue) * dataZoom.context.width); + (float)((value - minValue) / (maxValue - minValue) * dataZoom.context.width); np = new Vector3(chart.chartX + chart.chartWidth - dataZoom.right - dataHig, pY); if (i > 0) { From d6630ef5bf8ffefbabd7da5fdff82fcc7660ac0c Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Wed, 8 Feb 2023 08:28:21 +0800 Subject: [PATCH 25/55] update doc --- Documentation~/en/api.md | 56 +++++++++++++++++------------- Documentation~/en/configuration.md | 4 ++- Documentation~/zh/api.md | 56 +++++++++++++++++------------- Documentation~/zh/changelog.md | 1 + Documentation~/zh/configuration.md | 4 ++- Documentation~/zh/support.md | 4 +++ 6 files changed, 73 insertions(+), 52 deletions(-) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index 6b53b7ce..c0b4c566 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -18,27 +18,28 @@ slug: /api |[CoordOptionsAttribute](#coordoptionsattribute)|[DataZoomContext](#datazoomcontext)|[DataZoomHelper](#datazoomhelper)| |[DateTimeUtil](#datetimeutil)|[DefaultAnimationAttribute](#defaultanimationattribute)|[DefineSymbolsUtil](#definesymbolsutil)| |[FormatterHelper](#formatterhelper)|[GridCoordContext](#gridcoordcontext)|[HeatmapChart](#heatmapchart)| -|[IgnoreDoc](#ignoredoc)|[InteractData](#interactdata)|[LayerHelper](#layerhelper)| -|[LegendContext](#legendcontext)|[LegendHelper](#legendhelper)|[LegendItem](#legenditem)| -|[LineChart](#linechart)|[ListFor](#listfor)|[ListForComponent](#listforcomponent)| -|[ListForSerie](#listforserie)|[MainComponentContext](#maincomponentcontext)|[MainComponentHandler](#maincomponenthandler)| -|[MainComponentHandler<T>](#maincomponenthandlert)|[MathUtil](#mathutil)|[Painter](#painter)| -|[ParallelChart](#parallelchart)|[ParallelCoordContext](#parallelcoordcontext)|[PieChart](#piechart)| -|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)|[PropertyUtil](#propertyutil)| -|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)|[ReflectionUtil](#reflectionutil)| -|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)|[RuntimeUtil](#runtimeutil)| -|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)|[SerieConvertAttribute](#serieconvertattribute)| -|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)| -|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)|[SerieHandler<T>](#seriehandlert)| -|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)|[SerieLabelHelper](#serielabelhelper)| -|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)|[SeriesHelper](#serieshelper)| -|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)|[SimplifiedLineChart](#simplifiedlinechart)| -|[Since](#since)|[SVG](#svg)|[SVGImage](#svgimage)| -|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)|[TooltipContext](#tooltipcontext)| -|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)|[TooltipView](#tooltipview)| -|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)|[UGLExample](#uglexample)| -|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)|[VisualMapHelper](#visualmaphelper)| -|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)|[XCThemeMgr](#xcthememgr)| +|[IgnoreDoc](#ignoredoc)|[InputHelper](#inputhelper)|[InteractData](#interactdata)| +|[LayerHelper](#layerhelper)|[LegendContext](#legendcontext)|[LegendHelper](#legendhelper)| +|[LegendItem](#legenditem)|[LineChart](#linechart)|[ListFor](#listfor)| +|[ListForComponent](#listforcomponent)|[ListForSerie](#listforserie)|[MainComponentContext](#maincomponentcontext)| +|[MainComponentHandler](#maincomponenthandler)|[MainComponentHandler<T>](#maincomponenthandlert)|[MathUtil](#mathutil)| +|[Painter](#painter)|[ParallelChart](#parallelchart)|[ParallelCoordContext](#parallelcoordcontext)| +|[PieChart](#piechart)|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)| +|[PropertyUtil](#propertyutil)|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)| +|[ReflectionUtil](#reflectionutil)|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)| +|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)| +|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)| +|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)| +|[SerieHandler<T>](#seriehandlert)|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)| +|[SerieLabelHelper](#serielabelhelper)|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)| +|[SeriesHelper](#serieshelper)|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)| +|[SimplifiedLineChart](#simplifiedlinechart)|[Since](#since)|[SVG](#svg)| +|[SVGImage](#svgimage)|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)| +|[TooltipContext](#tooltipcontext)|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)| +|[TooltipView](#tooltipview)|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)| +|[UGLExample](#uglexample)|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)| +|[VisualMapHelper](#visualmaphelper)|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)| +|[XCThemeMgr](#xcthememgr)| ## AnimationStyleHelper @@ -132,6 +133,7 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver | ConvertSerie() |public bool ConvertSerie(Serie serie, Type type)| | ConvertSerie<T>() |public bool ConvertSerie<T>(Serie serie) where T : Serie| | ConvertXYAxis() |public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | +| EnsureChartComponent<T>() |public T EnsureChartComponent<T>() where T : MainComponent| | GenerateDefaultSerieName() |public string GenerateDefaultSerieName()| | GetAllSerieDataCount() |public int GetAllSerieDataCount()| | GetChartBackgroundColor() |public Color32 GetChartBackgroundColor()| @@ -374,6 +376,7 @@ Inherits or Implemented: [Image](#image) | GetTextHeight() |public float GetTextHeight()| | GetTextWidth() |public float GetTextWidth()| | GetWidth() |public float GetWidth()| +| IsActive() |public override bool IsActive()| | SetActive() |public void SetActive(bool flag)| | SetIcon() |public void SetIcon(Image image)| | SetIconActive() |public void SetIconActive(bool flag)| @@ -500,6 +503,13 @@ Inherits or Implemented: [Attribute](#attribute) |--|--| | IgnoreDoc() |public IgnoreDoc()| +## InputHelper + +|public method|description| +|--|--| +| GetKeyDown() |public static bool GetKeyDown(KeyCode keyCode)| +| GetTouch() |public static Touch GetTouch(int v)| + ## InteractData |public method|description| @@ -1083,15 +1093,11 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) | AddChart() |public static void AddChart(BaseChart chart)| | ContainsChart() |public static bool ContainsChart(BaseChart chart)| | ContainsChart() |public static bool ContainsChart(string chartName)| -| DisableTextMeshPro() |public static void DisableTextMeshPro()| -| EnableTextMeshPro() |public static void EnableTextMeshPro()| | GetChart() |public static BaseChart GetChart(string chartName)| | GetCharts() |public static List<BaseChart> GetCharts(string chartName)| | GetPackageFullPath() |public static string GetPackageFullPath()| | GetRepeatChartNameInfo() |public static string GetRepeatChartNameInfo(BaseChart chart, string chartName)| -| IsExistTMPAssembly() |public static bool IsExistTMPAssembly()| | IsRepeatChartName() |public static bool IsRepeatChartName(BaseChart chart, string chartName = null)| -| ModifyTMPRefence() |public static bool ModifyTMPRefence(bool removeTMP = false)| | RemoveAllChartObject() |public static void RemoveAllChartObject()| | RemoveChart() |public static void RemoveChart(string chartName)| diff --git a/Documentation~/en/configuration.md b/Documentation~/en/configuration.md index dd4154e5..7fcdb2c7 100644 --- a/Documentation~/en/configuration.md +++ b/Documentation~/en/configuration.md @@ -474,6 +474,8 @@ DataZoom component is used for zooming a specific area, which enables user to in |lineStyle|||阴影线条样式。 [LineStyle](#linestyle)| |areaStyle|||阴影填充样式。 [AreaStyle](#areastyle)| |marqueeStyle||v3.5.0|选取框样式。 [MarqueeStyle](#marqueestyle)| +|startLock||v3.6.0|Lock start value. +|endLock||v3.6.0|Lock end value. ## DataZoomTheme @@ -623,6 +625,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieDataComponent] |color0|||数据项颜色。 |toColor|||Gradient color1. |toColor2|||Gradient color2.Only valid in line diagrams. +|markColor||v3.6.0|Serie's mark color. It is only used to display Legend and Tooltip, and does not affect the drawing color. The default value is clear. |backgroundColor|||数据项背景颜色。 |backgroundWidth|||数据项背景宽度。 |centerColor|||中心区域颜色。 @@ -1009,7 +1012,6 @@ Inherits or Implemented: [BaseSerie](#baseserie),[IComparable](#icomparable) |serieName|||Series name used for displaying in tooltip and filtering with legend. |state||v3.2.0|The default state of a serie.<br/>`SerieState`:<br/>- `Normal`: Normal state.<br/>- `Emphasis`: Emphasis state.<br/>- `Blur`: Blur state.<br/>- `Select`: Select state.<br/>- `Auto`: Auto state.<br/>| |colorBy||v3.2.0|The policy to take color from theme.<br/>`SerieColorBy`:<br/>- `Default`: Select state.<br/>- `Serie`: assigns the colors in the palette by serie, so that all data in the same series are in the same color;.<br/>- `Data`: assigns colors in the palette according to data items, with each data item using a different color..<br/>| -|markColor||v3.4.0|Serie's mark color. It is only used to display Legend and Tooltip, and does not affect the drawing color. The default value is clear. |stack|||If stack the value. On the same category axis, the series with the same stack name would be put on top of each other. |xAxisIndex|0||the index of XAxis. |yAxisIndex|0||the index of YAxis. diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 4d722bc6..255fe22d 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -18,27 +18,28 @@ slug: /api |[CoordOptionsAttribute](#coordoptionsattribute)|[DataZoomContext](#datazoomcontext)|[DataZoomHelper](#datazoomhelper)| |[DateTimeUtil](#datetimeutil)|[DefaultAnimationAttribute](#defaultanimationattribute)|[DefineSymbolsUtil](#definesymbolsutil)| |[FormatterHelper](#formatterhelper)|[GridCoordContext](#gridcoordcontext)|[HeatmapChart](#heatmapchart)| -|[IgnoreDoc](#ignoredoc)|[InteractData](#interactdata)|[LayerHelper](#layerhelper)| -|[LegendContext](#legendcontext)|[LegendHelper](#legendhelper)|[LegendItem](#legenditem)| -|[LineChart](#linechart)|[ListFor](#listfor)|[ListForComponent](#listforcomponent)| -|[ListForSerie](#listforserie)|[MainComponentContext](#maincomponentcontext)|[MainComponentHandler](#maincomponenthandler)| -|[MainComponentHandler<T>](#maincomponenthandlert)|[MathUtil](#mathutil)|[Painter](#painter)| -|[ParallelChart](#parallelchart)|[ParallelCoordContext](#parallelcoordcontext)|[PieChart](#piechart)| -|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)|[PropertyUtil](#propertyutil)| -|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)|[ReflectionUtil](#reflectionutil)| -|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)|[RuntimeUtil](#runtimeutil)| -|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)|[SerieConvertAttribute](#serieconvertattribute)| -|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)| -|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)|[SerieHandler<T>](#seriehandlert)| -|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)|[SerieLabelHelper](#serielabelhelper)| -|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)|[SeriesHelper](#serieshelper)| -|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)|[SimplifiedLineChart](#simplifiedlinechart)| -|[Since](#since)|[SVG](#svg)|[SVGImage](#svgimage)| -|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)|[TooltipContext](#tooltipcontext)| -|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)|[TooltipView](#tooltipview)| -|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)|[UGLExample](#uglexample)| -|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)|[VisualMapHelper](#visualmaphelper)| -|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)|[XCThemeMgr](#xcthememgr)| +|[IgnoreDoc](#ignoredoc)|[InputHelper](#inputhelper)|[InteractData](#interactdata)| +|[LayerHelper](#layerhelper)|[LegendContext](#legendcontext)|[LegendHelper](#legendhelper)| +|[LegendItem](#legenditem)|[LineChart](#linechart)|[ListFor](#listfor)| +|[ListForComponent](#listforcomponent)|[ListForSerie](#listforserie)|[MainComponentContext](#maincomponentcontext)| +|[MainComponentHandler](#maincomponenthandler)|[MainComponentHandler<T>](#maincomponenthandlert)|[MathUtil](#mathutil)| +|[Painter](#painter)|[ParallelChart](#parallelchart)|[ParallelCoordContext](#parallelcoordcontext)| +|[PieChart](#piechart)|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)| +|[PropertyUtil](#propertyutil)|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)| +|[ReflectionUtil](#reflectionutil)|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)| +|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)| +|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)| +|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)| +|[SerieHandler<T>](#seriehandlert)|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)| +|[SerieLabelHelper](#serielabelhelper)|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)| +|[SeriesHelper](#serieshelper)|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)| +|[SimplifiedLineChart](#simplifiedlinechart)|[Since](#since)|[SVG](#svg)| +|[SVGImage](#svgimage)|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)| +|[TooltipContext](#tooltipcontext)|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)| +|[TooltipView](#tooltipview)|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)| +|[UGLExample](#uglexample)|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)| +|[VisualMapHelper](#visualmaphelper)|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)| +|[XCThemeMgr](#xcthememgr)| ## AnimationStyleHelper @@ -132,6 +133,7 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver | ConvertSerie() |public bool ConvertSerie(Serie serie, Type type)| | ConvertSerie<T>() |public bool ConvertSerie<T>(Serie serie) where T : Serie| | ConvertXYAxis() |public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | +| EnsureChartComponent<T>() |public T EnsureChartComponent<T>() where T : MainComponent| | GenerateDefaultSerieName() |public string GenerateDefaultSerieName()| | GetAllSerieDataCount() |public int GetAllSerieDataCount()| | GetChartBackgroundColor() |public Color32 GetChartBackgroundColor()| @@ -374,6 +376,7 @@ Inherits or Implemented: [Image](#image) | GetTextHeight() |public float GetTextHeight()| | GetTextWidth() |public float GetTextWidth()| | GetWidth() |public float GetWidth()| +| IsActive() |public override bool IsActive()| | SetActive() |public void SetActive(bool flag)| | SetIcon() |public void SetIcon(Image image)| | SetIconActive() |public void SetIconActive(bool flag)| @@ -500,6 +503,13 @@ Inherits or Implemented: [Attribute](#attribute) |--|--| | IgnoreDoc() |public IgnoreDoc()| +## InputHelper + +|public method|description| +|--|--| +| GetKeyDown() |public static bool GetKeyDown(KeyCode keyCode)| +| GetTouch() |public static Touch GetTouch(int v)| + ## InteractData |public method|description| @@ -1083,15 +1093,11 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) | AddChart() |public static void AddChart(BaseChart chart)| | ContainsChart() |public static bool ContainsChart(BaseChart chart)| | ContainsChart() |public static bool ContainsChart(string chartName)| -| DisableTextMeshPro() |public static void DisableTextMeshPro()| -| EnableTextMeshPro() |public static void EnableTextMeshPro()| | GetChart() |public static BaseChart GetChart(string chartName)| | GetCharts() |public static List<BaseChart> GetCharts(string chartName)| | GetPackageFullPath() |public static string GetPackageFullPath()| | GetRepeatChartNameInfo() |public static string GetRepeatChartNameInfo(BaseChart chart, string chartName)| -| IsExistTMPAssembly() |public static bool IsExistTMPAssembly()| | IsRepeatChartName() |public static bool IsRepeatChartName(BaseChart chart, string chartName = null)| -| ModifyTMPRefence() |public static bool ModifyTMPRefence(bool removeTMP = false)| | RemoveAllChartObject() |public static void RemoveAllChartObject()| | RemoveChart() |public static void RemoveChart(string chartName)| diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index b1271a48..818ab41e 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.02.08) 增加`DataZoom`的`startLock`和`endLock`参数支持锁定 * (2023.02.02) 修复`DataZoom`开启时`X轴`的`Label`可能会显示在图表外的问题 * (2023.02.02) 优化`SerieData`的`ignore`设置时的忽略数据判断 * (2023.02.01) 修复`XChartsMgr.ContainsChart()`接口异常 diff --git a/Documentation~/zh/configuration.md b/Documentation~/zh/configuration.md index 6a2ef671..af75cdde 100644 --- a/Documentation~/zh/configuration.md +++ b/Documentation~/zh/configuration.md @@ -474,6 +474,8 @@ DataZoom 组件 用于区域缩放,从而能自由关注细节的数据信息 |lineStyle|||阴影线条样式。 [LineStyle](#linestyle)| |areaStyle|||阴影填充样式。 [AreaStyle](#areastyle)| |marqueeStyle||v3.5.0|选取框样式。 [MarqueeStyle](#marqueestyle)| +|startLock||v3.6.0|固定起始值,不让改变。 +|endLock||v3.6.0|固定结束值,不让改变。 ## DataZoomTheme @@ -623,6 +625,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieDataComponent] |color0|||数据项颜色。 |toColor|||渐变色的颜色1。 |toColor2|||渐变色的颜色2。只在折线图中有效。 +|markColor||v3.6.0|Serie的标识颜色。仅用于Legend和Tooltip的展示,不影响绘制颜色,默认为clear。 |backgroundColor|||数据项背景颜色。 |backgroundWidth|||数据项背景宽度。 |centerColor|||中心区域颜色。 @@ -1009,7 +1012,6 @@ Inherits or Implemented: [BaseSerie](#baseserie),[IComparable](#icomparable) |serieName|||系列名称,用于 tooltip 的显示,legend 的图例筛选。 |state||v3.2.0|系列的默认状态。<br/>`SerieState`:<br/>- `Normal`: 正常状态。<br/>- `Emphasis`: 高亮状态。<br/>- `Blur`: 淡出状态。<br/>- `Select`: 选中状态。<br/>- `Auto`: 自动保持和父节点一致。一般用在SerieData。<br/>| |colorBy||v3.2.0|从主题中取色的策略。<br/>`SerieColorBy`:<br/>- `Default`: 默认策略。每种Serie都有自己的默认的取颜色策略。比如Line默认是Series策略,Pie默认是Data策略<br/>- `Serie`: 按照系列分配调色盘中的颜色,同一系列中的所有数据都是用相同的颜色。<br/>- `Data`: 按照数据项分配调色盘中的颜色,每个数据项都使用不同的颜色。<br/>| -|markColor||v3.4.0|Serie的标识颜色。仅用于Legend和Tooltip的展示,不影响绘制颜色,默认为clear。 |stack|||数据堆叠,同个类目轴上系列配置相同的stack值后,后一个系列的值会在前一个系列的值上相加。 |xAxisIndex|0||使用X轴的index。 |yAxisIndex|0||使用Y轴的index。 diff --git a/Documentation~/zh/support.md b/Documentation~/zh/support.md index bbe7f59e..af534cdd 100644 --- a/Documentation~/zh/support.md +++ b/Documentation~/zh/support.md @@ -78,5 +78,9 @@ slug: /support 如果这个项目对您有帮助,请右上方点 `Star` 予以支持!也欢迎任意金额的捐助,非常您的支持! +## 二维码 + +如果看不到二维码图片,可以加QQ`XCharts技术支持:3525422251`或邮件`monitor1394@gmail.com`咨询。 + ![alipay-qrcode](img/support_alipay.png) ![wechat-qrcode](img/support_wechat.png) From 80d9087084257762c3eff0308d7eb0ced737ffac Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Fri, 10 Feb 2023 13:23:38 +0800 Subject: [PATCH 26/55] =?UTF-8?q?=E4=BC=98=E5=8C=96`Axis`=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E5=80=BC`Label`=E7=9A=84=E9=BB=98=E8=AE=A4=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Component/Axis/Axis.cs | 12 +++---- Runtime/Component/Axis/AxisHelper.cs | 39 +++++++++++---------- Runtime/Component/Label/LabelStyle.cs | 21 ++++++----- Runtime/Internal/Utilities/ChartCached.cs | 7 ++-- Runtime/Internal/Utilities/ChartHelper.cs | 14 +------- Runtime/Internal/Utilities/MathUtil.cs | 23 +++++++++--- Runtime/Serie/Scatter/BaseScatterHandler.cs | 18 +++++----- 7 files changed, 69 insertions(+), 65 deletions(-) diff --git a/Runtime/Component/Axis/Axis.cs b/Runtime/Component/Axis/Axis.cs index 6e2a4aa9..d74301a1 100644 --- a/Runtime/Component/Axis/Axis.cs +++ b/Runtime/Component/Axis/Axis.cs @@ -827,18 +827,18 @@ namespace XCharts.Runtime return logBaseE ? (float) Math.Log(value) : (float) Math.Log(value, logBase); } - public int GetLogMinIndex() + public double GetLogMinIndex() { return logBaseE ? - (int) Math.Log(context.minValue) : - (int) Math.Log(context.minValue, logBase); + Math.Log(context.minValue) : + Math.Log(context.minValue, logBase); } - public int GetLogMaxIndex() + public double GetLogMaxIndex() { return logBaseE ? - (int) Math.Log(context.maxValue) : - (int) Math.Log(context.maxValue, logBase); + Math.Log(context.maxValue) : + Math.Log(context.maxValue, logBase); } public double GetLabelValue(int index) diff --git a/Runtime/Component/Axis/AxisHelper.cs b/Runtime/Component/Axis/AxisHelper.cs index d6ba3043..cf6e5896 100644 --- a/Runtime/Component/Axis/AxisHelper.cs +++ b/Runtime/Component/Axis/AxisHelper.cs @@ -68,7 +68,7 @@ namespace XCharts.Runtime var min = axis is YAxis ? 20 : 80; if (eachWid > min) return dataCount; var tick = Mathf.CeilToInt(min / eachWid); - return (int) (dataCount / tick); + return (int)(dataCount / tick); } else { @@ -132,7 +132,7 @@ namespace XCharts.Runtime maxValue = -maxValue; } if (forcePercent) - return string.Format("{0}%", (int) value); + return string.Format("{0}%", (int)value); else return axis.axisLabel.GetFormatterContent(index, value, minValue, maxValue); } @@ -255,9 +255,8 @@ namespace XCharts.Runtime { var value = axis.GetLabelValue(index); var lastValue = axis.GetLabelValue(index - 1); - return axis.context.minMaxRange == 0 ? - 0 : - (float) (coordinateWidth * (value - lastValue) / axis.context.minMaxRange); + return axis.context.minMaxRange == 0 ? 0 : + (float)(coordinateWidth * (value - lastValue) / axis.context.minMaxRange); } else { @@ -345,7 +344,10 @@ namespace XCharts.Runtime int maxSplit = 0; maxValue = ChartHelper.GetMaxLogValue(maxValue, axis.logBase, axis.logBaseE, out maxSplit); minValue = ChartHelper.GetMinLogValue(minValue, axis.logBase, axis.logBaseE, out minSplit); - axis.splitNumber = (minSplit > 0 && maxSplit > 0) ? (maxSplit + minSplit - 1) : (maxSplit + minSplit); + var splitNumber = (minSplit > 0 && maxSplit > 0) ? (maxSplit + minSplit - 1) : (maxSplit + minSplit); + if (splitNumber > 15) + splitNumber = 15; + axis.splitNumber = splitNumber; return; } if (axis.type == Axis.AxisType.Time) { } @@ -460,7 +462,7 @@ namespace XCharts.Runtime if (axis.IsCategory()) { if (dataCount == 0) dataCount = axis.data.Count; - var categoryIndex = (int) value; + var categoryIndex = (int)value; var scaleWid = AxisHelper.GetDataWidth(axis, gridHeight, dataCount, dataZoom); float startY = gridXY + (axis.boundaryGap ? scaleWid / 2 : 0); return startY + scaleWid * categoryIndex; @@ -468,9 +470,8 @@ namespace XCharts.Runtime else { var yDataHig = (axis.context.minMaxRange == 0) ? 0f : - (float) ((value - axis.context.minValue) / axis.context.minMaxRange * gridHeight); + (float)((value - axis.context.minValue) / axis.context.minMaxRange * gridHeight); return gridXY + yDataHig; - } } @@ -539,7 +540,7 @@ namespace XCharts.Runtime { if (axis.IsCategory()) { - return (int) value; + return (int)value; } else { @@ -550,9 +551,9 @@ namespace XCharts.Runtime if (totalSplitNumber == -1) totalSplitNumber = GetTotalSplitGridNum(axis); if (axis.minMaxType == Axis.AxisMinMaxType.Custom) - return Mathf.CeilToInt(((float) ((value - axis.min) / axis.max) * totalSplitNumber) - 1); + return Mathf.CeilToInt(((float)((value - axis.min) / axis.max) * totalSplitNumber) - 1); else - return Mathf.CeilToInt(((float) ((value - axis.context.minValue) / axis.context.minMaxRange) * totalSplitNumber) - 1); + return Mathf.CeilToInt(((float)((value - axis.context.minValue) / axis.context.minMaxRange) * totalSplitNumber) - 1); } } } @@ -565,15 +566,15 @@ namespace XCharts.Runtime if (axis.IsLog()) { - int minIndex = axis.GetLogMinIndex(); - float nowIndex = axis.GetLogValue(value); + var minIndex = axis.GetLogMinIndex(); + var nowIndex = axis.GetLogValue(value); return includeGridXY ? - gridXY + (nowIndex - minIndex) / axis.splitNumber * gridHeight : - (nowIndex - minIndex) / axis.splitNumber * gridHeight; + (float)(gridXY + (nowIndex - minIndex) / axis.splitNumber * gridHeight) : + (float)((nowIndex - minIndex) / axis.splitNumber * gridHeight); } else if (axis.IsCategory()) { - var categoryIndex = (int) value; + var categoryIndex = (int)value; return includeGridXY ? gridXY + (axis.boundaryGap ? scaleWidth / 2 : 0) + scaleWidth * categoryIndex : (axis.boundaryGap ? scaleWidth / 2 : 0) + scaleWidth * categoryIndex; @@ -584,9 +585,9 @@ namespace XCharts.Runtime if (axis.context.minMaxRange != 0) { if (realLength) - yDataHig = (float) (value * gridHeight / axis.context.minMaxRange); + yDataHig = (float)(value * gridHeight / axis.context.minMaxRange); else - yDataHig = (float) ((value - axis.context.minValue) / axis.context.minMaxRange * gridHeight); + yDataHig = (float)((value - axis.context.minValue) / axis.context.minMaxRange * gridHeight); } return includeGridXY ? gridXY + yDataHig : diff --git a/Runtime/Component/Label/LabelStyle.cs b/Runtime/Component/Label/LabelStyle.cs index a404945f..030a0cd5 100644 --- a/Runtime/Component/Label/LabelStyle.cs +++ b/Runtime/Component/Label/LabelStyle.cs @@ -336,33 +336,38 @@ namespace XCharts.Runtime public virtual string GetFormatterContent(int labelIndex, double value, double minValue, double maxValue, bool isLog = false) { + var newNumericFormatter = numericFormatter; + if (string.IsNullOrEmpty(newNumericFormatter) && !isLog) + { + newNumericFormatter = MathUtil.IsInteger(maxValue) ? "0" : "f" + MathUtil.GetPrecision(maxValue); + } if (string.IsNullOrEmpty(m_Formatter)) { if (isLog) { - return GetFormatterFunctionContent(labelIndex, value, ChartCached.NumberToStr(value, numericFormatter)); + return GetFormatterFunctionContent(labelIndex, value, ChartCached.NumberToStr(value, newNumericFormatter)); } if (minValue >= -1 && minValue <= 1 && maxValue >= -1 && maxValue <= 1) { - int minAcc = ChartHelper.GetFloatAccuracy(minValue); - int maxAcc = ChartHelper.GetFloatAccuracy(maxValue); - int curAcc = ChartHelper.GetFloatAccuracy(value); + int minAcc = MathUtil.GetPrecision(minValue); + int maxAcc = MathUtil.GetPrecision(maxValue); + int curAcc = MathUtil.GetPrecision(value); int acc = Mathf.Max(Mathf.Max(minAcc, maxAcc), curAcc); - return GetFormatterFunctionContent(labelIndex, value, ChartCached.FloatToStr(value, numericFormatter, acc)); + return GetFormatterFunctionContent(labelIndex, value, ChartCached.FloatToStr(value, newNumericFormatter, acc)); } - return GetFormatterFunctionContent(labelIndex, value, ChartCached.NumberToStr(value, numericFormatter)); + return GetFormatterFunctionContent(labelIndex, value, ChartCached.NumberToStr(value, newNumericFormatter)); } else { var content = m_Formatter; - FormatterHelper.ReplaceAxisLabelContent(ref content, numericFormatter, value); + FormatterHelper.ReplaceAxisLabelContent(ref content, newNumericFormatter, value); return GetFormatterFunctionContent(labelIndex, value, content); } } public string GetFormatterDateTime(int labelIndex, double value, double minValue, double maxValue) { - var timestamp = (int) value; + var timestamp = (int)value; var dateTime = DateTimeUtil.GetDateTime(timestamp); var dateString = string.Empty; if (string.IsNullOrEmpty(numericFormatter) || numericFormatter.Equals("f2")) diff --git a/Runtime/Internal/Utilities/ChartCached.cs b/Runtime/Internal/Utilities/ChartCached.cs index 59a505bd..d376421a 100644 --- a/Runtime/Internal/Utilities/ChartCached.cs +++ b/Runtime/Internal/Utilities/ChartCached.cs @@ -53,10 +53,7 @@ namespace XCharts.Runtime { if (string.IsNullOrEmpty(formatter)) { - if (value - (int) value == 0) - s_NumberToStr[value][formatter] = ((int) value).ToString(); - else - s_NumberToStr[value][formatter] = value.ToString(); + s_NumberToStr[value][formatter] = value.ToString(); } else if (formatter.StartsWith(NUMERIC_FORMATTER_D) || formatter.StartsWith(NUMERIC_FORMATTER_d) || @@ -64,7 +61,7 @@ namespace XCharts.Runtime formatter.StartsWith(NUMERIC_FORMATTER_x) ) { - s_NumberToStr[value][formatter] = ((int) value).ToString(formatter, ci); + s_NumberToStr[value][formatter] = ((int)value).ToString(formatter, ci); } else { diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index 8f3b7d6f..517a79f8 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -782,19 +782,7 @@ namespace XCharts.Runtime return min; } - public static int GetFloatAccuracy(double value) - { - if (value > 1 || value < -1) return 0; - int count = 1; - int intvalue = (int) (value * Mathf.Pow(10, count)); - while (intvalue == 0 && count < 38) - { - count++; - intvalue = (int) (value * Mathf.Pow(10, count)); - } - if (count == 38 && (value == 0 || value == 1)) return 1; - else return count; - } + public static void AddEventListener(GameObject obj, EventTriggerType type, UnityEngine.Events.UnityAction<BaseEventData> call) diff --git a/Runtime/Internal/Utilities/MathUtil.cs b/Runtime/Internal/Utilities/MathUtil.cs index 2103a5fa..443d3f97 100644 --- a/Runtime/Internal/Utilities/MathUtil.cs +++ b/Runtime/Internal/Utilities/MathUtil.cs @@ -1,10 +1,5 @@ using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; using UnityEngine; -using UnityEngine.EventSystems; -using UnityEngine.UI; namespace XCharts.Runtime { @@ -41,5 +36,23 @@ namespace XCharts.Runtime { return a + (b - a) * Clamp01(t); } + + public static bool IsInteger(double value) + { + return Math.Abs(value % 1) <= (Double.Epsilon * 100); + } + + public static int GetPrecision(double value) + { + if (IsInteger(value)) return 0; + int count = 1; + double intvalue = value * Mathf.Pow(10, count); + while (!IsInteger(intvalue) && count < 38) + { + count++; + intvalue = value * Mathf.Pow(10, count); + } + return count; + } } } \ No newline at end of file diff --git a/Runtime/Serie/Scatter/BaseScatterHandler.cs b/Runtime/Serie/Scatter/BaseScatterHandler.cs index aff96bab..eb0b895a 100644 --- a/Runtime/Serie/Scatter/BaseScatterHandler.cs +++ b/Runtime/Serie/Scatter/BaseScatterHandler.cs @@ -191,7 +191,7 @@ namespace XCharts.Runtime for (int count = 0; count < symbol.animationSize.Count; count++) { var nowSize = symbol.animationSize[count]; - color.a = (byte) (255 * (symbolSize - nowSize) / symbolSize); + color.a = (byte)(255 * (symbolSize - nowSize) / symbolSize); chart.DrawSymbol(vh, symbol.type, nowSize, symbolBorder, pos, color, toColor, emptyColor, borderColor, symbol.gap, cornerRadius); } @@ -293,7 +293,7 @@ namespace XCharts.Runtime for (int count = 0; count < symbol.animationSize.Count; count++) { var nowSize = symbol.animationSize[count]; - color.a = (byte) (255 * (symbolSize - nowSize) / symbolSize); + color.a = (byte)(255 * (symbolSize - nowSize) / symbolSize); chart.DrawSymbol(vh, symbol.type, nowSize, symbolBorder, pos, color, toColor, emptyColor, borderColor, symbol.gap, cornerRadius); } @@ -321,25 +321,25 @@ namespace XCharts.Runtime { if (axis.IsLog()) { - int minIndex = axis.GetLogMinIndex(); - float nowIndex = axis.GetLogValue(value); - return (nowIndex - minIndex) / axis.splitNumber * totalWidth; + var minIndex = axis.GetLogMinIndex(); + var nowIndex = axis.GetLogValue(value); + return (float)((nowIndex - minIndex) / axis.splitNumber * totalWidth); } else if (axis.IsCategory()) { if (axis.boundaryGap) { - float tick = (float) (totalWidth / (axis.context.minMaxRange + 1)); - return tick / 2 + (float) (value - axis.context.minValue) * tick; + float tick = (float)(totalWidth / (axis.context.minMaxRange + 1)); + return tick / 2 + (float)(value - axis.context.minValue) * tick; } else { - return (float) ((value - axis.context.minValue) / axis.context.minMaxRange * totalWidth); + return (float)((value - axis.context.minValue) / axis.context.minMaxRange * totalWidth); } } else { - return (float) ((value - axis.context.minValue) / axis.context.minMaxRange * totalWidth); + return (float)((value - axis.context.minValue) / axis.context.minMaxRange * totalWidth); } } } From 22b167981be8e5ba528ded8a9fea0396810ad50a Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Fri, 10 Feb 2023 13:41:37 +0800 Subject: [PATCH 27/55] update doc --- Documentation~/zh/changelog.md | 4 +++- Documentation~/zh/support.md | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 818ab41e..88225e58 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,11 +65,13 @@ slug: /changelog ## master +* (2023.02.10) 修复`Axis`在`Log`轴时某些情况下最小值不正确的问题 +* (2023.02.10) 优化`Axis`的数值`Label`的默认显示格式 * (2023.02.08) 增加`DataZoom`的`startLock`和`endLock`参数支持锁定 * (2023.02.02) 修复`DataZoom`开启时`X轴`的`Label`可能会显示在图表外的问题 * (2023.02.02) 优化`SerieData`的`ignore`设置时的忽略数据判断 * (2023.02.01) 修复`XChartsMgr.ContainsChart()`接口异常 -* (2023.01.31) 增加`InputSystem`的支持 (#242) (by Bian-Sh) +* (2023.01.31) 增加`InputSystem`的支持 (#242) (by __Bian-Sh__) * (2023.01.11) 修复`Inspector`上移除`Component`后图表没有及时刷新的问题 (#241) * (2023.01.06) 修复`Pie`在最后的几个数据都为0时`Label`显示不正常的问题 (#240) * (2023.01.03) 删除`Serie`的`MarkColor`,增加`ItemStyle`的`MarkColor` diff --git a/Documentation~/zh/support.md b/Documentation~/zh/support.md index af534cdd..ddbf9ab3 100644 --- a/Documentation~/zh/support.md +++ b/Documentation~/zh/support.md @@ -5,7 +5,7 @@ slug: /support # 订阅服务 -如需技术支持,可订阅`个人VIP`服务。扫后面的二维码后可加VIP群`867291970`,验证信息请输入付费的账号。 +如需技术支持,可订阅`个人VIP`服务。扫后面的二维码付费后可加VIP群`867291970`,验证信息请输入付费的账号。 企业商务合作可联系QQ:3525422251(XCharts技术支持)。 ## 订阅VIP服务 @@ -53,7 +53,7 @@ slug: /support 扩展图表为另付费购买图表,只对订阅了`VIP`服务的用户开放购买。对于`SVIP`的订阅用户,所有扩展图表仓库可免费使用,不用再单独购买。 -对所有已购买的扩展图表,源码可永久持有,并获得持续一年的更新支持,一年后如需更新支持服务,可继续订阅`VIP`服务。 +对所有已购买的扩展图表,源码可永久持有,并获得持续一年的更新支持,一年后如需更新支持服务,需再继续订阅`VIP`服务。 |编号|扩展图表|价格|备注| |--|--|--|--| @@ -70,7 +70,7 @@ slug: /support ## 备注说明 1. __`付费定制`__ 是指用户可根据自己的需求定制不同的图表或新功能,只有`VIP`用户才享有`付费定制`权利。 -2. __`付费加急`__ 是指用户可对自己非常紧急的需求进行付费,将开发优先级提到最高,并可要求在`Deadline`内交付,只有`VIP`用户才享有`付费加急`权利。 +2. __`付费加急`__ 是指用户可对自己非常紧急的需求进行付费,将开发优先级提到最高,并可要求在指定`截止日期`内交付,只有`VIP`用户才享有`付费加急`权利。 3. __`付费咨询`__ 付费咨询有效期`7`天,且总咨询时长不超过`7`个小时。 4. __`扩展图表`__ 购买后代码可永久持有和商用,1年的更新支持。 From 4964bca3419e74c7663c9aa5fc246b91df85bf93 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Sun, 12 Feb 2023 21:22:53 +0800 Subject: [PATCH 28/55] =?UTF-8?q?=E9=87=8D=E6=9E=84`Component`=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81=EF=BC=8C=E8=B0=83=E6=95=B4API?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Series/SerieEditor.cs | 6 +- Editor/Series/SerieListEditor.cs | 8 +- Examples/Example00_CheatSheet.cs | 8 +- Examples/Example04_DataZoom.cs | 4 +- Examples/Example10_LineChart.cs | 6 +- Examples/Example13_LineSimple.cs | 12 +- Examples/Example20_BarChart.cs | 4 +- Examples/Example30_PieChart.cs | 6 +- Examples/Example31_PieUpdateName.cs | 2 +- Examples/Example60_Heatmap.cs | 2 +- Examples/Example80_Polar.cs | 2 +- Examples/Example_AddChart.cs | 10 +- Examples/Example_Component.cs | 8 +- Examples/Example_Dynamic.cs | 2 +- Examples/Example_DynamicChart.cs | 20 ++-- Runtime/Chart/BarChart.cs | 2 +- Runtime/Chart/CandlestickChart.cs | 2 +- Runtime/Chart/HeatmapChart.cs | 8 +- Runtime/Chart/LineChart.cs | 2 +- Runtime/Chart/PieChart.cs | 2 +- Runtime/Chart/ScatterChart.cs | 6 +- Runtime/Component/Child/AreaStyle.cs | 2 +- Runtime/Component/Child/ImageStyle.cs | 2 +- Runtime/Component/Child/LineArrow.cs | 2 +- Runtime/Component/Label/LabelLine.cs | 2 +- Runtime/Component/Label/LabelStyle.cs | 2 +- Runtime/Component/State/BlurStyle.cs | 2 +- Runtime/Component/State/EmphasisStyle.cs | 2 +- Runtime/Component/State/SelectStyle.cs | 2 +- Runtime/Component/Title/TitleStyle.cs | 2 +- ...ttribute.cs => SerieComponentAttribute.cs} | 24 ++-- ...s.meta => SerieComponentAttribute.cs.meta} | 0 .../Attributes/SerieConvertAttribute.cs | 5 +- ...bute.cs => SerieDataComponentAttribute.cs} | 27 +++-- ...ta => SerieDataComponentAttribute.cs.meta} | 0 Runtime/Internal/BaseChart.API.cs | 8 ++ Runtime/Internal/BaseChart.Component.cs | 28 +++-- Runtime/Internal/Misc/ISerieComponent.cs | 11 ++ ...ponent.cs.meta => ISerieComponent.cs.meta} | 0 Runtime/Internal/Misc/ISerieContainer.cs | 1 - Runtime/Internal/Misc/ISerieDataComponent.cs | 11 +- Runtime/Internal/Misc/ISerieExtraComponent.cs | 11 -- Runtime/Serie/Bar/Bar.cs | 4 +- Runtime/Serie/Bar/SimplifiedBar.cs | 4 +- Runtime/Serie/Candlestick/Candlestick.cs | 4 +- .../Candlestick/SimplifiedCandlestick.cs | 4 +- Runtime/Serie/Heatmap/Heatmap.cs | 4 +- Runtime/Serie/Line/Line.cs | 4 +- Runtime/Serie/Line/SimplifiedLine.cs | 4 +- Runtime/Serie/Parallel/Parallel.cs | 4 +- Runtime/Serie/Pie/Pie.cs | 4 +- Runtime/Serie/Radar/Radar.cs | 4 +- Runtime/Serie/Ring/Ring.cs | 8 +- Runtime/Serie/Scatter/EffectScatter.cs | 4 +- Runtime/Serie/Scatter/Scatter.cs | 4 +- Runtime/Serie/Serie.ExtraComponent.cs | 102 +++++++++++----- Runtime/Serie/SerieData.cs | 110 ++++++++++++++++-- 57 files changed, 349 insertions(+), 185 deletions(-) rename Runtime/Internal/Attributes/{SerieExtraComponentAttribute.cs => SerieComponentAttribute.cs} (63%) rename Runtime/Internal/Attributes/{SerieExtraComponentAttribute.cs.meta => SerieComponentAttribute.cs.meta} (100%) rename Runtime/Internal/Attributes/{SerieDataExtraComponentAttribute.cs => SerieDataComponentAttribute.cs} (61%) rename Runtime/Internal/Attributes/{SerieDataExtraComponentAttribute.cs.meta => SerieDataComponentAttribute.cs.meta} (100%) create mode 100644 Runtime/Internal/Misc/ISerieComponent.cs rename Runtime/Internal/Misc/{ISerieExtraComponent.cs.meta => ISerieComponent.cs.meta} (100%) delete mode 100644 Runtime/Internal/Misc/ISerieExtraComponent.cs diff --git a/Editor/Series/SerieEditor.cs b/Editor/Series/SerieEditor.cs index 82cfa37d..e251d810 100644 --- a/Editor/Series/SerieEditor.cs +++ b/Editor/Series/SerieEditor.cs @@ -204,15 +204,15 @@ namespace XCharts.Editor } serieDataMenus.Clear(); - if (serie.GetType().IsDefined(typeof(SerieDataExtraComponentAttribute), false)) + if (serie.GetType().IsDefined(typeof(SerieDataComponentAttribute), false)) { - var attribute = serie.GetType().GetAttribute<SerieDataExtraComponentAttribute>(); + var attribute = serie.GetType().GetAttribute<SerieDataComponentAttribute>(); foreach (var type in attribute.types) { var size = serieData.FindPropertyRelative(SerieData.extraComponentMap[type]).arraySize; serieDataMenus.Add(new HeaderMenuInfo("Add " + type.Name, () => { - serie.GetSerieData(index).GetOrAddComponent(type); + serie.GetSerieData(index).EnsureComponent(type); EditorUtility.SetDirty(chart); }, size == 0)); } diff --git a/Editor/Series/SerieListEditor.cs b/Editor/Series/SerieListEditor.cs index 4ad75d3f..406845b0 100644 --- a/Editor/Series/SerieListEditor.cs +++ b/Editor/Series/SerieListEditor.cs @@ -176,15 +176,15 @@ namespace XCharts.Editor ConvertSerie(editor.serie, type); })); } - if (editor.serie.GetType().IsDefined(typeof(SerieExtraComponentAttribute), false)) + if (editor.serie.GetType().IsDefined(typeof(SerieComponentAttribute), false)) { - var attribute = editor.serie.GetType().GetAttribute<SerieExtraComponentAttribute>(); + var attribute = editor.serie.GetType().GetAttribute<SerieComponentAttribute>(); foreach (var type in attribute.types) { var size = editor.FindProperty(Serie.extraComponentMap[type]).arraySize; editor.menus.Add(new HeaderMenuInfo("Add " + type.Name, () => { - editor.serie.AddExtraComponent(type); + editor.serie.EnsureComponent(type); RefreshEditors(); chart.RefreshAllComponent(); EditorUtility.SetDirty(chart); @@ -195,7 +195,7 @@ namespace XCharts.Editor var size = editor.FindProperty(Serie.extraComponentMap[type]).arraySize; editor.menus.Add(new HeaderMenuInfo("Remove " + type.Name, () => { - editor.serie.RemoveExtraComponent(type); + editor.serie.RemoveComponent(type); RefreshEditors(); chart.RefreshAllComponent(); EditorUtility.SetDirty(chart); diff --git a/Examples/Example00_CheatSheet.cs b/Examples/Example00_CheatSheet.cs index 4492c94b..0b22b89b 100644 --- a/Examples/Example00_CheatSheet.cs +++ b/Examples/Example00_CheatSheet.cs @@ -45,10 +45,10 @@ namespace XCharts.Example chart = gameObject.GetComponent<LineChart>(); if (chart == null) gameObject.AddComponent<LineChart>(); - chart.GetOrAddChartComponent<Title>().show = true; + chart.EnsureChartComponent<Title>().show = true; chart.EnsureChartComponent<Title>().text = "术语解析-组件"; - var grid = chart.GetOrAddChartComponent<GridCoord>(); + var grid = chart.EnsureChartComponent<GridCoord>(); grid.bottom = 30; grid.right = 30; grid.left = 50; @@ -197,7 +197,7 @@ namespace XCharts.Example var grid = chart.EnsureChartComponent<GridCoord>(); grid.bottom = 70; - var dataZoom = chart.GetOrAddChartComponent<DataZoom>(); + var dataZoom = chart.EnsureChartComponent<DataZoom>(); dataZoom.enable = true; dataZoom.supportInside = true; dataZoom.supportSlider = true; @@ -258,7 +258,7 @@ namespace XCharts.Example { chart.EnsureChartComponent<Title>().subText = "VisualMap 视觉映射:可从全局上配置图表的颜色、字体等效果,支持默认主题切换"; - var visualMap = chart.GetOrAddChartComponent<VisualMap>(); + var visualMap = chart.EnsureChartComponent<VisualMap>(); visualMap.show = true; visualMap.showUI = true; visualMap.orient = Orient.Vertical; diff --git a/Examples/Example04_DataZoom.cs b/Examples/Example04_DataZoom.cs index 8f18c272..b555b299 100644 --- a/Examples/Example04_DataZoom.cs +++ b/Examples/Example04_DataZoom.cs @@ -38,11 +38,11 @@ namespace XCharts.Example { if (dataZoom.IsInMarqueeArea(serieData)) { - serieData.GetOrAddComponent<ItemStyle>().color = Color.red; + serieData.EnsureComponent<ItemStyle>().color = Color.red; } else { - serieData.GetOrAddComponent<ItemStyle>().color = Color.clear; + serieData.EnsureComponent<ItemStyle>().color = Color.clear; } } } diff --git a/Examples/Example10_LineChart.cs b/Examples/Example10_LineChart.cs index c319751b..2dabb5fb 100644 --- a/Examples/Example10_LineChart.cs +++ b/Examples/Example10_LineChart.cs @@ -107,7 +107,7 @@ namespace XCharts.Example { chart.GetChartComponent<Title>().subText = "AreaStyle 面积图"; - serie.AddExtraComponent<AreaStyle>(); + serie.EnsureComponent<AreaStyle>(); serie.areaStyle.show = true; chart.RefreshChart(); yield return new WaitForSeconds(1f); @@ -136,7 +136,7 @@ namespace XCharts.Example IEnumerator LineArrowSettings() { chart.GetChartComponent<Title>().subText = "LineArrow 头部箭头"; - chart.GetSerie(0).AddExtraComponent<LineArrow>(); + chart.GetSerie(0).EnsureComponent<LineArrow>(); serie.lineArrow.show = true; serie.lineArrow.position = LineArrow.Position.Start; chart.RefreshChart(); @@ -198,7 +198,7 @@ namespace XCharts.Example IEnumerator LineLabelSettings() { chart.GetChartComponent<Title>().subText = "SerieLabel 文本标签"; - serie.AddExtraComponent<LabelStyle>(); + serie.EnsureComponent<LabelStyle>(); chart.RefreshChart(); while (serie.label.offset[1] < 20) { diff --git a/Examples/Example13_LineSimple.cs b/Examples/Example13_LineSimple.cs index 0e0649f4..72d8ebe4 100644 --- a/Examples/Example13_LineSimple.cs +++ b/Examples/Example13_LineSimple.cs @@ -32,14 +32,14 @@ namespace XCharts.Example chart.Init(); chart.SetSize(580, 300); } - chart.GetOrAddChartComponent<Title>().show = true; - chart.GetOrAddChartComponent<Title>().text = "Line Simple"; + chart.EnsureChartComponent<Title>().show = true; + chart.EnsureChartComponent<Title>().text = "Line Simple"; - chart.GetOrAddChartComponent<Tooltip>().show = true; - chart.GetOrAddChartComponent<Legend>().show = false; + chart.EnsureChartComponent<Tooltip>().show = true; + chart.EnsureChartComponent<Legend>().show = false; - var xAxis = chart.GetOrAddChartComponent<XAxis>(); - var yAxis = chart.GetOrAddChartComponent<YAxis>(); + var xAxis = chart.EnsureChartComponent<XAxis>(); + var yAxis = chart.EnsureChartComponent<YAxis>(); xAxis.show = true; yAxis.show = true; xAxis.type = Axis.AxisType.Category; diff --git a/Examples/Example20_BarChart.cs b/Examples/Example20_BarChart.cs index 5dcede4f..70149d6a 100644 --- a/Examples/Example20_BarChart.cs +++ b/Examples/Example20_BarChart.cs @@ -130,7 +130,7 @@ namespace XCharts.Example serie.barPercentStack = true; if (null == serie.label) { - serie.AddExtraComponent<LabelStyle>(); + serie.EnsureComponent<LabelStyle>(); } serie.label.show = true; serie.label.position = LabelStyle.Position.Center; @@ -139,7 +139,7 @@ namespace XCharts.Example if (null == serie2.label) { - serie2.AddExtraComponent<LabelStyle>(); + serie2.EnsureComponent<LabelStyle>(); } serie2.label.show = true; serie2.label.position = LabelStyle.Position.Center; diff --git a/Examples/Example30_PieChart.cs b/Examples/Example30_PieChart.cs index c7b563d3..e6e5f912 100644 --- a/Examples/Example30_PieChart.cs +++ b/Examples/Example30_PieChart.cs @@ -75,7 +75,7 @@ namespace XCharts.Example { chart.EnsureChartComponent<Title>().subText = "显示文本标签"; - serie.AddExtraComponent<LabelStyle>(); + serie.EnsureComponent<LabelStyle>(); serie.label.show = true; chart.RefreshChart(); yield return new WaitForSeconds(1); @@ -139,11 +139,11 @@ namespace XCharts.Example } if (null == serie.label) { - serie.AddExtraComponent<LabelStyle>(); + serie.EnsureComponent<LabelStyle>(); } if (null == serie1.label) { - serie1.AddExtraComponent<LabelStyle>(); + serie1.EnsureComponent<LabelStyle>(); } serie1.label.show = true; serie1.label.position = LabelStyle.Position.Inside; diff --git a/Examples/Example31_PieUpdateName.cs b/Examples/Example31_PieUpdateName.cs index 8cf1e61e..2c79e5d9 100644 --- a/Examples/Example31_PieUpdateName.cs +++ b/Examples/Example31_PieUpdateName.cs @@ -21,7 +21,7 @@ namespace XCharts.Example var serieIndex = 0; var serie = chart.GetSerie(serieIndex); if (serie == null) return; - serie.AddExtraComponent<LabelStyle>(); + serie.EnsureComponent<LabelStyle>(); serie.label.show = true; serie.label.position = LabelStyle.Position.Outside; } diff --git a/Examples/Example60_Heatmap.cs b/Examples/Example60_Heatmap.cs index 2e89d4c3..263b6382 100644 --- a/Examples/Example60_Heatmap.cs +++ b/Examples/Example60_Heatmap.cs @@ -47,7 +47,7 @@ namespace XCharts.Example serie.itemStyle.borderColor = Color.clear; //设置高亮样式 - var emphasisStyle = serie.AddExtraComponent<EmphasisStyle>(); + var emphasisStyle = serie.EnsureComponent<EmphasisStyle>(); emphasisStyle.itemStyle.show = true; emphasisStyle.itemStyle.borderWidth = 1; emphasisStyle.itemStyle.borderColor = Color.black; diff --git a/Examples/Example80_Polar.cs b/Examples/Example80_Polar.cs index a468fe09..e5e202c5 100644 --- a/Examples/Example80_Polar.cs +++ b/Examples/Example80_Polar.cs @@ -19,7 +19,7 @@ namespace XCharts.Example { chart = gameObject.AddComponent<BaseChart>(); } - chart.GetOrAddChartComponent<PolarCoord>(); + chart.EnsureChartComponent<PolarCoord>(); } void Update() diff --git a/Examples/Example_AddChart.cs b/Examples/Example_AddChart.cs index 145eb63f..143e03c7 100644 --- a/Examples/Example_AddChart.cs +++ b/Examples/Example_AddChart.cs @@ -33,22 +33,22 @@ namespace XCharts.Example chart.Init(); chart.SetSize(1200, 600); } - var title = chart.GetOrAddChartComponent<Title>(); + var title = chart.EnsureChartComponent<Title>(); title.text = "Simple LineChart"; title.subText = "normal line"; - var tooltip = chart.GetOrAddChartComponent<Tooltip>(); + var tooltip = chart.EnsureChartComponent<Tooltip>(); tooltip.show = true; - var legend = chart.GetOrAddChartComponent<Legend>(); + var legend = chart.EnsureChartComponent<Legend>(); legend.show = false; - var xAxis = chart.GetOrAddChartComponent<XAxis>(); + var xAxis = chart.EnsureChartComponent<XAxis>(); xAxis.splitNumber = 10; xAxis.boundaryGap = true; xAxis.type = Axis.AxisType.Category; - var yAxis = chart.GetOrAddChartComponent<YAxis>(); + var yAxis = chart.EnsureChartComponent<YAxis>(); yAxis.type = Axis.AxisType.Value; chart.RemoveData(); diff --git a/Examples/Example_Component.cs b/Examples/Example_Component.cs index 9847c970..d6a68a03 100644 --- a/Examples/Example_Component.cs +++ b/Examples/Example_Component.cs @@ -15,20 +15,20 @@ namespace XCharts.Example void ModifyComponent() { - var title = chart.GetOrAddChartComponent<Title>(); + var title = chart.EnsureChartComponent<Title>(); title.text = "Simple LineChart"; title.subText = "normal line"; var serie1 = chart.AddSerie<Line>(); //var serie2 = chart.GetSerie<Line>(); - serie1.AddExtraComponent<AreaStyle>(); - var label = serie1.AddExtraComponent<LabelStyle>(); + serie1.EnsureComponent<AreaStyle>(); + var label = serie1.EnsureComponent<LabelStyle>(); label.offset = new Vector3(0, 20, 0); var serieData = chart.AddData(0, 20); serieData.radius = 10; - var itemStyle = serieData.GetOrAddComponent<ItemStyle>(); + var itemStyle = serieData.EnsureComponent<ItemStyle>(); itemStyle.color = Color.blue; } } diff --git a/Examples/Example_Dynamic.cs b/Examples/Example_Dynamic.cs index b6a09a0d..260f490b 100644 --- a/Examples/Example_Dynamic.cs +++ b/Examples/Example_Dynamic.cs @@ -28,7 +28,7 @@ namespace XCharts.Example serie.symbol.show = false; serie.maxCache = maxCacheDataNumber; - var xAxis = chart.GetOrAddChartComponent<XAxis>(); + var xAxis = chart.EnsureChartComponent<XAxis>(); xAxis.maxCache = maxCacheDataNumber; timeNow = DateTime.Now; timeNow = timeNow.AddSeconds(-maxCacheDataNumber); diff --git a/Examples/Example_DynamicChart.cs b/Examples/Example_DynamicChart.cs index 2a999d9a..24b9f26a 100644 --- a/Examples/Example_DynamicChart.cs +++ b/Examples/Example_DynamicChart.cs @@ -45,11 +45,11 @@ namespace XCharts.Example chart.Init(); chart.SetSize(580, 300); - chart.GetOrAddChartComponent<Title>().show = true; - chart.GetOrAddChartComponent<Title>().text = chartName; + chart.EnsureChartComponent<Title>().show = true; + chart.EnsureChartComponent<Title>().text = chartName; - chart.GetOrAddChartComponent<Tooltip>().show = true; - chart.GetOrAddChartComponent<Legend>().show = true; + chart.EnsureChartComponent<Tooltip>().show = true; + chart.EnsureChartComponent<Legend>().show = true; chart.RemoveData(); chart.AddSerie<Pie>(); @@ -67,16 +67,16 @@ namespace XCharts.Example chart.Init(); chart.SetSize(580, 300); - chart.GetOrAddChartComponent<Title>().show = true; - chart.GetOrAddChartComponent<Title>().text = chartName; + chart.EnsureChartComponent<Title>().show = true; + chart.EnsureChartComponent<Title>().text = chartName; - chart.GetOrAddChartComponent<Legend>().show = false; + chart.EnsureChartComponent<Legend>().show = false; - var tooltip = chart.GetOrAddChartComponent<Tooltip>(); + var tooltip = chart.EnsureChartComponent<Tooltip>(); tooltip.trigger = Tooltip.Trigger.Axis; - var xAxis = chart.GetOrAddChartComponent<XAxis>(); - var yAxis = chart.GetOrAddChartComponent<YAxis>(); + var xAxis = chart.EnsureChartComponent<XAxis>(); + var yAxis = chart.EnsureChartComponent<YAxis>(); xAxis.splitNumber = 10; xAxis.boundaryGap = true; xAxis.show = true; diff --git a/Runtime/Chart/BarChart.cs b/Runtime/Chart/BarChart.cs index 65cb0d73..a8284f86 100644 --- a/Runtime/Chart/BarChart.cs +++ b/Runtime/Chart/BarChart.cs @@ -14,7 +14,7 @@ namespace XCharts.Runtime AddChartComponentWhenNoExist<XAxis>(); AddChartComponentWhenNoExist<YAxis>(); - var tooltip = GetOrAddChartComponent<Tooltip>(); + var tooltip = EnsureChartComponent<Tooltip>(); tooltip.type = Tooltip.Type.Shadow; tooltip.trigger = Tooltip.Trigger.Axis; diff --git a/Runtime/Chart/CandlestickChart.cs b/Runtime/Chart/CandlestickChart.cs index be7e0263..62bf4666 100644 --- a/Runtime/Chart/CandlestickChart.cs +++ b/Runtime/Chart/CandlestickChart.cs @@ -14,7 +14,7 @@ namespace XCharts.Runtime AddChartComponentWhenNoExist<XAxis>(); AddChartComponentWhenNoExist<YAxis>(); - var tooltip = GetOrAddChartComponent<Tooltip>(); + var tooltip = EnsureChartComponent<Tooltip>(); tooltip.type = Tooltip.Type.Shadow; tooltip.trigger = Tooltip.Trigger.Axis; diff --git a/Runtime/Chart/HeatmapChart.cs b/Runtime/Chart/HeatmapChart.cs index f1df5f11..3bdcda09 100644 --- a/Runtime/Chart/HeatmapChart.cs +++ b/Runtime/Chart/HeatmapChart.cs @@ -15,15 +15,15 @@ namespace XCharts.Runtime tooltip.type = Tooltip.Type.None; tooltip.trigger = Tooltip.Trigger.Axis; - var grid = GetOrAddChartComponent<GridCoord>(); + var grid = EnsureChartComponent<GridCoord>(); grid.left = 0.12f; - var xAxis = GetOrAddChartComponent<XAxis>(); + var xAxis = EnsureChartComponent<XAxis>(); xAxis.type = Axis.AxisType.Category; xAxis.boundaryGap = true; xAxis.splitNumber = 10; - var yAxis = GetOrAddChartComponent<YAxis>(); + var yAxis = EnsureChartComponent<YAxis>(); yAxis.type = Axis.AxisType.Category; yAxis.boundaryGap = true; yAxis.splitNumber = 10; @@ -35,7 +35,7 @@ namespace XCharts.Runtime Heatmap.AddDefaultSerie(this, GenerateDefaultSerieName()); - var visualMap = GetOrAddChartComponent<VisualMap>(); + var visualMap = EnsureChartComponent<VisualMap>(); visualMap.autoMinMax = true; visualMap.orient = Orient.Vertical; visualMap.calculable = true; diff --git a/Runtime/Chart/LineChart.cs b/Runtime/Chart/LineChart.cs index c5317f5c..bc1dc084 100644 --- a/Runtime/Chart/LineChart.cs +++ b/Runtime/Chart/LineChart.cs @@ -14,7 +14,7 @@ namespace XCharts.Runtime AddChartComponentWhenNoExist<XAxis>(); AddChartComponentWhenNoExist<YAxis>(); - var tooltip = GetOrAddChartComponent<Tooltip>(); + var tooltip = EnsureChartComponent<Tooltip>(); tooltip.type = Tooltip.Type.Line; tooltip.trigger = Tooltip.Trigger.Axis; diff --git a/Runtime/Chart/PieChart.cs b/Runtime/Chart/PieChart.cs index f6ef9d32..0cee6a3a 100644 --- a/Runtime/Chart/PieChart.cs +++ b/Runtime/Chart/PieChart.cs @@ -10,7 +10,7 @@ namespace XCharts.Runtime { protected override void DefaultChart() { - var legend = GetOrAddChartComponent<Legend>(); + var legend = EnsureChartComponent<Legend>(); legend.show = true; RemoveData(); diff --git a/Runtime/Chart/ScatterChart.cs b/Runtime/Chart/ScatterChart.cs index a6ce4d97..9f44c902 100644 --- a/Runtime/Chart/ScatterChart.cs +++ b/Runtime/Chart/ScatterChart.cs @@ -12,15 +12,15 @@ namespace XCharts.Runtime { AddChartComponentWhenNoExist<GridCoord>(); - var tooltip = GetOrAddChartComponent<Tooltip>(); + var tooltip = EnsureChartComponent<Tooltip>(); tooltip.type = Tooltip.Type.None; tooltip.trigger = Tooltip.Trigger.Item; - var xAxis = GetOrAddChartComponent<XAxis>(); + var xAxis = EnsureChartComponent<XAxis>(); xAxis.type = Axis.AxisType.Value; xAxis.boundaryGap = false; - var yAxis = GetOrAddChartComponent<YAxis>(); + var yAxis = EnsureChartComponent<YAxis>(); yAxis.type = Axis.AxisType.Value; yAxis.boundaryGap = false; diff --git a/Runtime/Component/Child/AreaStyle.cs b/Runtime/Component/Child/AreaStyle.cs index ddfcc5ce..783555ac 100644 --- a/Runtime/Component/Child/AreaStyle.cs +++ b/Runtime/Component/Child/AreaStyle.cs @@ -7,7 +7,7 @@ namespace XCharts.Runtime /// |区域填充样式。 /// </summary> [System.Serializable] - public class AreaStyle : ChildComponent, ISerieExtraComponent, ISerieDataComponent + public class AreaStyle : ChildComponent, ISerieComponent, ISerieDataComponent { /// <summary> /// Origin position of area. diff --git a/Runtime/Component/Child/ImageStyle.cs b/Runtime/Component/Child/ImageStyle.cs index d37b3921..d48582fb 100644 --- a/Runtime/Component/Child/ImageStyle.cs +++ b/Runtime/Component/Child/ImageStyle.cs @@ -4,7 +4,7 @@ using UnityEngine.UI; namespace XCharts.Runtime { [System.Serializable] - public class ImageStyle : ChildComponent, ISerieExtraComponent, ISerieDataComponent + public class ImageStyle : ChildComponent, ISerieComponent, ISerieDataComponent { [SerializeField] private bool m_Show = true; [SerializeField] private Sprite m_Sprite; diff --git a/Runtime/Component/Child/LineArrow.cs b/Runtime/Component/Child/LineArrow.cs index 8b45aa84..ed45a0e2 100644 --- a/Runtime/Component/Child/LineArrow.cs +++ b/Runtime/Component/Child/LineArrow.cs @@ -6,7 +6,7 @@ namespace XCharts.Runtime /// <summary> /// </summary> [Serializable] - public class LineArrow : ChildComponent, ISerieExtraComponent + public class LineArrow : ChildComponent, ISerieComponent { public enum Position { diff --git a/Runtime/Component/Label/LabelLine.cs b/Runtime/Component/Label/LabelLine.cs index 87ae5854..3f48c53f 100644 --- a/Runtime/Component/Label/LabelLine.cs +++ b/Runtime/Component/Label/LabelLine.cs @@ -7,7 +7,7 @@ namespace XCharts.Runtime /// 标签的引导线 /// </summary> [System.Serializable] - public class LabelLine : ChildComponent, ISerieExtraComponent, ISerieDataComponent + public class LabelLine : ChildComponent, ISerieComponent, ISerieDataComponent { /// <summary> /// 标签视觉引导线类型 diff --git a/Runtime/Component/Label/LabelStyle.cs b/Runtime/Component/Label/LabelStyle.cs index 030a0cd5..06a8cf69 100644 --- a/Runtime/Component/Label/LabelStyle.cs +++ b/Runtime/Component/Label/LabelStyle.cs @@ -8,7 +8,7 @@ namespace XCharts.Runtime /// |图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。 /// </summary> [System.Serializable] - public class LabelStyle : ChildComponent, ISerieExtraComponent, ISerieDataComponent + public class LabelStyle : ChildComponent, ISerieComponent, ISerieDataComponent { /// <summary> /// The position of label. diff --git a/Runtime/Component/State/BlurStyle.cs b/Runtime/Component/State/BlurStyle.cs index 75c0de29..8f67f5e9 100644 --- a/Runtime/Component/State/BlurStyle.cs +++ b/Runtime/Component/State/BlurStyle.cs @@ -8,6 +8,6 @@ namespace XCharts.Runtime /// </summary> [System.Serializable] [Since("v3.2.0")] - public class BlurStyle : StateStyle, ISerieExtraComponent, ISerieDataComponent + public class BlurStyle : StateStyle, ISerieComponent, ISerieDataComponent { } } \ No newline at end of file diff --git a/Runtime/Component/State/EmphasisStyle.cs b/Runtime/Component/State/EmphasisStyle.cs index e3602d20..9719ae47 100644 --- a/Runtime/Component/State/EmphasisStyle.cs +++ b/Runtime/Component/State/EmphasisStyle.cs @@ -8,7 +8,7 @@ namespace XCharts.Runtime /// </summary> [System.Serializable] [Since("v3.2.0")] - public class EmphasisStyle : StateStyle, ISerieExtraComponent, ISerieDataComponent + public class EmphasisStyle : StateStyle, ISerieComponent, ISerieDataComponent { /// <summary> /// focus type. diff --git a/Runtime/Component/State/SelectStyle.cs b/Runtime/Component/State/SelectStyle.cs index 093274ac..7357a216 100644 --- a/Runtime/Component/State/SelectStyle.cs +++ b/Runtime/Component/State/SelectStyle.cs @@ -8,6 +8,6 @@ namespace XCharts.Runtime /// </summary> [System.Serializable] [Since("v3.2.0")] - public class SelectStyle : StateStyle, ISerieExtraComponent, ISerieDataComponent + public class SelectStyle : StateStyle, ISerieComponent, ISerieDataComponent { } } \ No newline at end of file diff --git a/Runtime/Component/Title/TitleStyle.cs b/Runtime/Component/Title/TitleStyle.cs index 2befc2da..647eb517 100644 --- a/Runtime/Component/Title/TitleStyle.cs +++ b/Runtime/Component/Title/TitleStyle.cs @@ -8,7 +8,7 @@ namespace XCharts.Runtime /// |标题相关设置。 /// </summary> [Serializable] - public class TitleStyle : LabelStyle, ISerieDataComponent, ISerieExtraComponent + public class TitleStyle : LabelStyle, ISerieDataComponent, ISerieComponent { } diff --git a/Runtime/Internal/Attributes/SerieExtraComponentAttribute.cs b/Runtime/Internal/Attributes/SerieComponentAttribute.cs similarity index 63% rename from Runtime/Internal/Attributes/SerieExtraComponentAttribute.cs rename to Runtime/Internal/Attributes/SerieComponentAttribute.cs index f4cb9cea..13de0284 100644 --- a/Runtime/Internal/Attributes/SerieExtraComponentAttribute.cs +++ b/Runtime/Internal/Attributes/SerieComponentAttribute.cs @@ -3,36 +3,40 @@ using System.Collections.Generic; namespace XCharts.Runtime { + /// <summary> + /// The attribute for serie component. + /// |可添加到Serie的组件。 + /// </summary> [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - public sealed class SerieExtraComponentAttribute : Attribute + public sealed class SerieComponentAttribute : Attribute { public readonly List<Type> types = new List<Type>(); - public SerieExtraComponentAttribute() + public SerieComponentAttribute() { } - public SerieExtraComponentAttribute(Type type1) + public SerieComponentAttribute(Type type1) { AddType(type1); } - public SerieExtraComponentAttribute(Type type1, Type type2) + public SerieComponentAttribute(Type type1, Type type2) { AddType(type1); AddType(type2); } - public SerieExtraComponentAttribute(Type type1, Type type2, Type type3) + public SerieComponentAttribute(Type type1, Type type2, Type type3) { AddType(type1); AddType(type2); AddType(type3); } - public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4) + public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4) { AddType(type1); AddType(type2); AddType(type3); AddType(type4); } - public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5) + public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5) { AddType(type1); AddType(type2); @@ -40,7 +44,7 @@ namespace XCharts.Runtime AddType(type4); AddType(type5); } - public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6) + public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6) { AddType(type1); AddType(type2); @@ -49,7 +53,7 @@ namespace XCharts.Runtime AddType(type5); AddType(type6); } - public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7) + public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7) { AddType(type1); AddType(type2); @@ -67,7 +71,7 @@ namespace XCharts.Runtime types.Add(type); } - public bool Contains<T>() where T : ISerieExtraComponent + public bool Contains<T>() where T : ISerieComponent { return Contains(typeof(T)); } diff --git a/Runtime/Internal/Attributes/SerieExtraComponentAttribute.cs.meta b/Runtime/Internal/Attributes/SerieComponentAttribute.cs.meta similarity index 100% rename from Runtime/Internal/Attributes/SerieExtraComponentAttribute.cs.meta rename to Runtime/Internal/Attributes/SerieComponentAttribute.cs.meta diff --git a/Runtime/Internal/Attributes/SerieConvertAttribute.cs b/Runtime/Internal/Attributes/SerieConvertAttribute.cs index 15861197..6e888f96 100644 --- a/Runtime/Internal/Attributes/SerieConvertAttribute.cs +++ b/Runtime/Internal/Attributes/SerieConvertAttribute.cs @@ -2,10 +2,11 @@ using System; namespace XCharts.Runtime { - [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] /// <summary> - /// What serie can convert to me + /// The attribute for which serie types can be converted to. + /// |可转化为哪些Serie类型。 /// </summary> + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public sealed class SerieConvertAttribute : Attribute { public readonly Type type0; diff --git a/Runtime/Internal/Attributes/SerieDataExtraComponentAttribute.cs b/Runtime/Internal/Attributes/SerieDataComponentAttribute.cs similarity index 61% rename from Runtime/Internal/Attributes/SerieDataExtraComponentAttribute.cs rename to Runtime/Internal/Attributes/SerieDataComponentAttribute.cs index cd163795..a5b82cbb 100644 --- a/Runtime/Internal/Attributes/SerieDataExtraComponentAttribute.cs +++ b/Runtime/Internal/Attributes/SerieDataComponentAttribute.cs @@ -3,36 +3,41 @@ using System.Collections.Generic; namespace XCharts.Runtime { + /// <summary> + /// The attribute for serie data component. + /// |可添加到SerieData的组件。 + /// </summary> [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] - public sealed class SerieDataExtraComponentAttribute : Attribute + public sealed class SerieDataComponentAttribute : Attribute { public readonly List<Type> types = new List<Type>(); - public SerieDataExtraComponentAttribute() - { } - public SerieDataExtraComponentAttribute(Type type1) + public SerieDataComponentAttribute() + { + } + public SerieDataComponentAttribute(Type type1) { AddType(type1); } - public SerieDataExtraComponentAttribute(Type type1, Type type2) + public SerieDataComponentAttribute(Type type1, Type type2) { AddType(type1); AddType(type2); } - public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3) + public SerieDataComponentAttribute(Type type1, Type type2, Type type3) { AddType(type1); AddType(type2); AddType(type3); } - public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4) + public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4) { AddType(type1); AddType(type2); AddType(type3); AddType(type4); } - public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5) + public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5) { AddType(type1); AddType(type2); @@ -40,7 +45,7 @@ namespace XCharts.Runtime AddType(type4); AddType(type5); } - public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6) + public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6) { AddType(type1); AddType(type2); @@ -49,7 +54,7 @@ namespace XCharts.Runtime AddType(type5); AddType(type6); } - public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7) + public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7) { AddType(type1); AddType(type2); @@ -67,7 +72,7 @@ namespace XCharts.Runtime types.Add(type); } - public bool Contains<T>() where T : ISerieExtraComponent + public bool Contains<T>() where T : ISerieComponent { return Contains(typeof(T)); } diff --git a/Runtime/Internal/Attributes/SerieDataExtraComponentAttribute.cs.meta b/Runtime/Internal/Attributes/SerieDataComponentAttribute.cs.meta similarity index 100% rename from Runtime/Internal/Attributes/SerieDataExtraComponentAttribute.cs.meta rename to Runtime/Internal/Attributes/SerieDataComponentAttribute.cs.meta diff --git a/Runtime/Internal/BaseChart.API.cs b/Runtime/Internal/BaseChart.API.cs index c30e3fee..76c8c953 100644 --- a/Runtime/Internal/BaseChart.API.cs +++ b/Runtime/Internal/BaseChart.API.cs @@ -69,7 +69,15 @@ namespace XCharts.Runtime /// </summary> public Vector3 chartPosition { get { return m_ChartPosition; } } public Rect chartRect { get { return m_ChartRect; } } + /// <summary> + /// The callback function of chart init. + /// |图表的初始化完成回调。 + /// </summary> public Action onInit { set { m_OnInit = value; } } + /// <summary> + /// The callback function of chart update. + /// |图表的Update回调。 + /// </summary> public Action onUpdate { set { m_OnUpdate = value; } } /// <summary> /// 自定义绘制回调。在绘制Serie前调用。 diff --git a/Runtime/Internal/BaseChart.Component.cs b/Runtime/Internal/BaseChart.Component.cs index 62dab6a7..dd57e897 100644 --- a/Runtime/Internal/BaseChart.Component.cs +++ b/Runtime/Internal/BaseChart.Component.cs @@ -41,7 +41,7 @@ namespace XCharts.Runtime public T AddChartComponent<T>() where T : MainComponent { - return (T) AddChartComponent(typeof(T)); + return (T)AddChartComponent(typeof(T)); } public T AddChartComponentWhenNoExist<T>() where T : MainComponent @@ -118,7 +118,7 @@ namespace XCharts.Runtime if (attrubte.handler == null) return; - var handler = (MainComponentHandler) Activator.CreateInstance(attrubte.handler); + var handler = (MainComponentHandler)Activator.CreateInstance(attrubte.handler); handler.attribute = attrubte; handler.chart = this; handler.SetComponent(component); @@ -221,9 +221,9 @@ namespace XCharts.Runtime return GetChartComponentNum(typeof(T)); } + private static List<MainComponent> list; public int GetChartComponentNum(Type type) { - List<MainComponent> list; if (m_ComponentMaps.TryGetValue(type, out list)) return list.Count; else @@ -245,6 +245,7 @@ namespace XCharts.Runtime return m_ComponentMaps[typeof(T)]; } + [Obsolete("'GetOrAddChartComponent' is obsolete, Use 'EnsureChartComponent' instead.")] public T GetOrAddChartComponent<T>() where T : MainComponent { var component = GetChartComponent<T>(); @@ -253,6 +254,15 @@ namespace XCharts.Runtime else return component; } + + /// <summary> + /// Ensure the chart has the component, if not, add it. + /// Note: it may fail to add. + /// |确保图表有该组件,如果没有则添加。注意:有可能添加不成功。 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns>component, or null if add failed.</returns> + [Since("v3.6.0")] public T EnsureChartComponent<T>() where T : MainComponent { var component = GetChartComponent<T>(); @@ -261,7 +271,7 @@ namespace XCharts.Runtime else return component; } - + public bool TryGetChartComponent<T>(out T component, int index = 0) where T : MainComponent { @@ -270,7 +280,7 @@ namespace XCharts.Runtime { if (com is T && com.index == index) { - component = (T) com; + component = (T)com; return true; } } @@ -425,11 +435,11 @@ namespace XCharts.Runtime var yAxis = GetChartComponent<YAxis>(); if (yAxis.IsCategory()) { - return yAxis.GetData((int) yAxis.context.pointerValue, dataZoom); + return yAxis.GetData((int)yAxis.context.pointerValue, dataZoom); } else if (xAxis.IsCategory()) { - return xAxis.GetData((int) xAxis.context.pointerValue, dataZoom); + return xAxis.GetData((int)xAxis.context.pointerValue, dataZoom); } return null; } @@ -439,11 +449,11 @@ namespace XCharts.Runtime var yAxis = GetChartComponent<YAxis>(serie.yAxisIndex); if (yAxis.IsCategory()) { - return yAxis.GetData((int) yAxis.context.pointerValue, dataZoom); + return yAxis.GetData((int)yAxis.context.pointerValue, dataZoom); } else if (xAxis.IsCategory()) { - return xAxis.GetData((int) xAxis.context.pointerValue, dataZoom); + return xAxis.GetData((int)xAxis.context.pointerValue, dataZoom); } return null; } diff --git a/Runtime/Internal/Misc/ISerieComponent.cs b/Runtime/Internal/Misc/ISerieComponent.cs new file mode 100644 index 00000000..9a863d4d --- /dev/null +++ b/Runtime/Internal/Misc/ISerieComponent.cs @@ -0,0 +1,11 @@ +namespace XCharts.Runtime +{ + /// <summary> + /// The interface for serie component. + /// |可用于Serie的组件。 + /// </summary> + public interface ISerieComponent + { + bool show { get; set; } + } +} \ No newline at end of file diff --git a/Runtime/Internal/Misc/ISerieExtraComponent.cs.meta b/Runtime/Internal/Misc/ISerieComponent.cs.meta similarity index 100% rename from Runtime/Internal/Misc/ISerieExtraComponent.cs.meta rename to Runtime/Internal/Misc/ISerieComponent.cs.meta diff --git a/Runtime/Internal/Misc/ISerieContainer.cs b/Runtime/Internal/Misc/ISerieContainer.cs index 5e09dc4c..53300a57 100644 --- a/Runtime/Internal/Misc/ISerieContainer.cs +++ b/Runtime/Internal/Misc/ISerieContainer.cs @@ -2,7 +2,6 @@ namespace XCharts.Runtime { public interface ISerieContainer { - //bool runtimeIsPointerEnter { get; } int index { get; } bool IsPointerEnter(); } diff --git a/Runtime/Internal/Misc/ISerieDataComponent.cs b/Runtime/Internal/Misc/ISerieDataComponent.cs index 0187300c..278c5903 100644 --- a/Runtime/Internal/Misc/ISerieDataComponent.cs +++ b/Runtime/Internal/Misc/ISerieDataComponent.cs @@ -1,9 +1,10 @@ -using UnityEngine; -using UnityEngine.EventSystems; -using UnityEngine.UI; - namespace XCharts.Runtime { + /// <summary> + /// The interface for serie data component. + /// |可用于SerieData的组件。 + /// </summary> public interface ISerieDataComponent - { } + { + } } \ No newline at end of file diff --git a/Runtime/Internal/Misc/ISerieExtraComponent.cs b/Runtime/Internal/Misc/ISerieExtraComponent.cs deleted file mode 100644 index dda88d4c..00000000 --- a/Runtime/Internal/Misc/ISerieExtraComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using UnityEngine; -using UnityEngine.EventSystems; -using UnityEngine.UI; - -namespace XCharts.Runtime -{ - public interface ISerieExtraComponent - { - bool show { get; set; } - } -} \ No newline at end of file diff --git a/Runtime/Serie/Bar/Bar.cs b/Runtime/Serie/Bar/Bar.cs index 0074102d..21066d66 100644 --- a/Runtime/Serie/Bar/Bar.cs +++ b/Runtime/Serie/Bar/Bar.cs @@ -5,8 +5,8 @@ namespace XCharts.Runtime [SerieConvert(typeof(Line), typeof(Pie))] [CoordOptions(typeof(GridCoord), typeof(PolarCoord))] [DefaultAnimation(AnimationType.BottomToTop)] - [SerieExtraComponent(typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] - [SerieDataExtraComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieComponent(typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieDataComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] [SerieDataExtraField("m_Ignore")] public class Bar : Serie, INeedSerieContainer { diff --git a/Runtime/Serie/Bar/SimplifiedBar.cs b/Runtime/Serie/Bar/SimplifiedBar.cs index 8a6c2a0b..0e9703f9 100644 --- a/Runtime/Serie/Bar/SimplifiedBar.cs +++ b/Runtime/Serie/Bar/SimplifiedBar.cs @@ -8,8 +8,8 @@ namespace XCharts.Runtime [SerieConvert(typeof(SimplifiedLine), typeof(Bar))] [CoordOptions(typeof(GridCoord))] [DefaultAnimation(AnimationType.LeftToRight)] - [SerieExtraComponent()] - [SerieDataExtraComponent()] + [SerieComponent()] + [SerieDataComponent()] [SerieDataExtraField()] public class SimplifiedBar : Serie, INeedSerieContainer, ISimplifiedSerie { diff --git a/Runtime/Serie/Candlestick/Candlestick.cs b/Runtime/Serie/Candlestick/Candlestick.cs index 08ff439c..092ec99d 100644 --- a/Runtime/Serie/Candlestick/Candlestick.cs +++ b/Runtime/Serie/Candlestick/Candlestick.cs @@ -5,8 +5,8 @@ namespace XCharts.Runtime [System.Serializable] [SerieHandler(typeof(CandlestickHandler), true)] [DefaultAnimation(AnimationType.LeftToRight)] - [SerieExtraComponent()] - [SerieDataExtraComponent(typeof(ItemStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieComponent()] + [SerieDataComponent(typeof(ItemStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] [SerieDataExtraField()] public class Candlestick : Serie, INeedSerieContainer { diff --git a/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs b/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs index 8bddbe28..003c72fe 100644 --- a/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs +++ b/Runtime/Serie/Candlestick/SimplifiedCandlestick.cs @@ -5,8 +5,8 @@ namespace XCharts.Runtime [System.Serializable] [SerieHandler(typeof(SimplifiedCandlestickHandler), true)] [DefaultAnimation(AnimationType.LeftToRight)] - [SerieExtraComponent()] - [SerieDataExtraComponent()] + [SerieComponent()] + [SerieDataComponent()] [SerieDataExtraField()] public class SimplifiedCandlestick : Serie, INeedSerieContainer, ISimplifiedSerie { diff --git a/Runtime/Serie/Heatmap/Heatmap.cs b/Runtime/Serie/Heatmap/Heatmap.cs index 54a50e98..6897e5ec 100644 --- a/Runtime/Serie/Heatmap/Heatmap.cs +++ b/Runtime/Serie/Heatmap/Heatmap.cs @@ -25,8 +25,8 @@ namespace XCharts.Runtime [DefaultAnimation(AnimationType.LeftToRight)] [RequireChartComponent(typeof(VisualMap))] [CoordOptions(typeof(GridCoord), typeof(PolarCoord))] - [SerieExtraComponent(typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] - [SerieDataExtraComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieComponent(typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieDataComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] [SerieDataExtraField()] public class Heatmap : Serie, INeedSerieContainer { diff --git a/Runtime/Serie/Line/Line.cs b/Runtime/Serie/Line/Line.cs index a86c32e0..68176cd6 100644 --- a/Runtime/Serie/Line/Line.cs +++ b/Runtime/Serie/Line/Line.cs @@ -7,7 +7,7 @@ namespace XCharts.Runtime [SerieConvert(typeof(Bar), typeof(Pie))] [CoordOptions(typeof(GridCoord), typeof(PolarCoord))] [DefaultAnimation(AnimationType.LeftToRight)] - [SerieExtraComponent( + [SerieComponent( typeof(LabelStyle), typeof(EndLabelStyle), typeof(LineArrow), @@ -15,7 +15,7 @@ namespace XCharts.Runtime typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] - [SerieDataExtraComponent( + [SerieDataComponent( typeof(ItemStyle), typeof(LabelStyle), typeof(SerieSymbol), diff --git a/Runtime/Serie/Line/SimplifiedLine.cs b/Runtime/Serie/Line/SimplifiedLine.cs index 3401218c..c1a3b041 100644 --- a/Runtime/Serie/Line/SimplifiedLine.cs +++ b/Runtime/Serie/Line/SimplifiedLine.cs @@ -8,8 +8,8 @@ namespace XCharts.Runtime [SerieConvert(typeof(SimplifiedBar), typeof(Line))] [CoordOptions(typeof(GridCoord))] [DefaultAnimation(AnimationType.LeftToRight)] - [SerieExtraComponent(typeof(AreaStyle))] - [SerieDataExtraComponent()] + [SerieComponent(typeof(AreaStyle))] + [SerieDataComponent()] [SerieDataExtraField()] public class SimplifiedLine : Serie, INeedSerieContainer, ISimplifiedSerie { diff --git a/Runtime/Serie/Parallel/Parallel.cs b/Runtime/Serie/Parallel/Parallel.cs index 09b65279..0062b50c 100644 --- a/Runtime/Serie/Parallel/Parallel.cs +++ b/Runtime/Serie/Parallel/Parallel.cs @@ -6,8 +6,8 @@ namespace XCharts.Runtime [System.Serializable] [SerieHandler(typeof(ParallelHandler), true)] [RequireChartComponent(typeof(ParallelCoord))] - [SerieExtraComponent(typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] - [SerieDataExtraComponent(typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieComponent(typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieDataComponent(typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] [SerieDataExtraField()] public class Parallel : Serie, INeedSerieContainer { diff --git a/Runtime/Serie/Pie/Pie.cs b/Runtime/Serie/Pie/Pie.cs index 5d89a5dc..9d173270 100644 --- a/Runtime/Serie/Pie/Pie.cs +++ b/Runtime/Serie/Pie/Pie.cs @@ -4,8 +4,8 @@ namespace XCharts.Runtime [SerieConvert(typeof(Line), typeof(Bar))] [SerieHandler(typeof(PieHandler), true)] [DefaultAnimation(AnimationType.Clockwise)] - [SerieExtraComponent(typeof(LabelStyle), typeof(LabelLine), typeof(TitleStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] - [SerieDataExtraComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(LabelLine), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieComponent(typeof(LabelStyle), typeof(LabelLine), typeof(TitleStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieDataComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(LabelLine), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] [SerieDataExtraField("m_Ignore", "m_Selected", "m_Radius")] public class Pie : Serie { diff --git a/Runtime/Serie/Radar/Radar.cs b/Runtime/Serie/Radar/Radar.cs index a0524271..626465e9 100644 --- a/Runtime/Serie/Radar/Radar.cs +++ b/Runtime/Serie/Radar/Radar.cs @@ -6,8 +6,8 @@ namespace XCharts.Runtime [System.Serializable] [SerieHandler(typeof(RadarHandler), true)] [RequireChartComponent(typeof(RadarCoord))] - [SerieExtraComponent(typeof(LabelStyle), typeof(AreaStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] - [SerieDataExtraComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(AreaStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieComponent(typeof(LabelStyle), typeof(AreaStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieDataComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(AreaStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] [SerieDataExtraField()] public class Radar : Serie, INeedSerieContainer { diff --git a/Runtime/Serie/Ring/Ring.cs b/Runtime/Serie/Ring/Ring.cs index 6610cdd2..ebd9b660 100644 --- a/Runtime/Serie/Ring/Ring.cs +++ b/Runtime/Serie/Ring/Ring.cs @@ -4,8 +4,8 @@ namespace XCharts.Runtime { [System.Serializable] [SerieHandler(typeof(RingHandler), true)] - [SerieExtraComponent(typeof(LabelStyle), typeof(LabelLine), typeof(TitleStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] - [SerieDataExtraComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(LabelLine), typeof(TitleStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieComponent(typeof(LabelStyle), typeof(LabelLine), typeof(TitleStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieDataComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(LabelLine), typeof(TitleStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] [SerieDataExtraField()] public class Ring : Serie { @@ -17,14 +17,14 @@ namespace XCharts.Runtime serie.gap = 10; serie.radius = new float[] { 0.3f, 0.35f }; - var label = serie.AddExtraComponent<LabelStyle>(); + var label = serie.EnsureComponent<LabelStyle>(); label.show = true; label.position = LabelStyle.Position.Center; label.formatter = "{d:f0}%"; label.textStyle.autoColor = true; label.textStyle.fontSize = 28; - var titleStyle = serie.AddExtraComponent<TitleStyle>(); + var titleStyle = serie.EnsureComponent<TitleStyle>(); titleStyle.show = false; titleStyle.offset = new Vector2(0, 30); diff --git a/Runtime/Serie/Scatter/EffectScatter.cs b/Runtime/Serie/Scatter/EffectScatter.cs index 55696652..ca10028e 100644 --- a/Runtime/Serie/Scatter/EffectScatter.cs +++ b/Runtime/Serie/Scatter/EffectScatter.cs @@ -5,8 +5,8 @@ namespace XCharts.Runtime [System.Serializable] [SerieHandler(typeof(EffectScatterHandler), true)] [CoordOptions(typeof(GridCoord), typeof(SingleAxisCoord))] - [SerieExtraComponent(typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] - [SerieDataExtraComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieComponent(typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieDataComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] [SerieDataExtraField("m_Radius")] public class EffectScatter : BaseScatter { diff --git a/Runtime/Serie/Scatter/Scatter.cs b/Runtime/Serie/Scatter/Scatter.cs index daf2ee56..a6367539 100644 --- a/Runtime/Serie/Scatter/Scatter.cs +++ b/Runtime/Serie/Scatter/Scatter.cs @@ -5,8 +5,8 @@ namespace XCharts.Runtime [System.Serializable] [SerieHandler(typeof(ScatterHandler), true)] [CoordOptions(typeof(GridCoord), typeof(SingleAxisCoord))] - [SerieExtraComponent(typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] - [SerieDataExtraComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieComponent(typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] + [SerieDataComponent(typeof(ItemStyle), typeof(LabelStyle), typeof(EmphasisStyle), typeof(BlurStyle), typeof(SelectStyle))] [SerieDataExtraField("m_Radius")] public class Scatter : BaseScatter { diff --git a/Runtime/Serie/Serie.ExtraComponent.cs b/Runtime/Serie/Serie.ExtraComponent.cs index 06eb4726..ac7d546a 100644 --- a/Runtime/Serie/Serie.ExtraComponent.cs +++ b/Runtime/Serie/Serie.ExtraComponent.cs @@ -8,7 +8,8 @@ namespace XCharts.Runtime public partial class Serie { public static Dictionary<Type, string> extraComponentMap = new Dictionary<Type, string> - { { typeof(LabelStyle), "m_Labels" }, + { + { typeof(LabelStyle), "m_Labels" }, { typeof(LabelLine), "m_LabelLines" }, { typeof(EndLabelStyle), "m_EndLabels" }, { typeof(LineArrow), "m_LineArrows" }, @@ -71,7 +72,11 @@ namespace XCharts.Runtime /// </summary> public SelectStyle selectStyle { get { return m_SelectStyles.Count > 0 ? m_SelectStyles[0] : null; } } - public void RemoveAllExtraComponent() + /// <summary> + /// Remove all extra components. + /// |移除所有额外组件。 + /// </summary> + public void RemoveAllComponents() { var serieType = GetType(); foreach (var kv in extraComponentMap) @@ -81,16 +86,72 @@ namespace XCharts.Runtime SetAllDirty(); } - public T AddExtraComponent<T>() where T : ChildComponent, ISerieExtraComponent + [Obsolete("Use EnsureComponent<T>() instead.")] + public T AddExtraComponent<T>() where T : ChildComponent, ISerieComponent { - return AddExtraComponent(typeof(T)) as T; + return EnsureComponent<T>(); } - public ISerieExtraComponent AddExtraComponent(Type type) + public T GetComponent<T>() where T : ChildComponent, ISerieComponent { - if (GetType().IsDefined(typeof(SerieExtraComponentAttribute), false)) + return GetComponent(typeof(T)) as T; + } + + /// <summary> + /// Ensure the serie has the component. If not, add it. + /// |确保系列有该组件。如果没有,则添加。 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns>component or null</returns> + public T EnsureComponent<T>() where T : ChildComponent, ISerieComponent + { + return EnsureComponent(typeof(T)) as T; + } + + public bool CanAddComponent<T>() where T : ChildComponent, ISerieComponent + { + return CanAddComponent(typeof(T)); + } + + public bool CanAddComponent(Type type) + { + if (GetType().IsDefined(typeof(SerieComponentAttribute), false)) { - var attr = GetType().GetAttribute<SerieExtraComponentAttribute>(); + var attr = GetType().GetAttribute<SerieComponentAttribute>(); + if (attr.Contains(type)) + { + return true; + } + } + return false; + } + + public ISerieComponent GetComponent(Type type) + { + if (GetType().IsDefined(typeof(SerieComponentAttribute), false)) + { + var attr = GetType().GetAttribute<SerieComponentAttribute>(); + if (attr.Contains(type)) + { + var fieldName = string.Empty; + if (extraComponentMap.TryGetValue(type, out fieldName)) + { + var field = typeof(Serie).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic); + if (ReflectionUtil.InvokeListCount(this, field) > 0) + { + return ReflectionUtil.InvokeListGet<ISerieComponent>(this, field, 0); + } + } + } + } + return null; + } + + public ISerieComponent EnsureComponent(Type type) + { + if (GetType().IsDefined(typeof(SerieComponentAttribute), false)) + { + var attr = GetType().GetAttribute<SerieComponentAttribute>(); if (attr.Contains(type)) { var fieldName = string.Empty; @@ -99,32 +160,32 @@ namespace XCharts.Runtime var field = typeof(Serie).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic); if (ReflectionUtil.InvokeListCount(this, field) <= 0) { - var extraComponent = Activator.CreateInstance(type) as ISerieExtraComponent; + var extraComponent = Activator.CreateInstance(type) as ISerieComponent; ReflectionUtil.InvokeListAdd(this, field, extraComponent); SetAllDirty(); return extraComponent; } else { - return ReflectionUtil.InvokeListGet<ISerieExtraComponent>(this, field, 0); + return ReflectionUtil.InvokeListGet<ISerieComponent>(this, field, 0); } } } } - throw new System.Exception(string.Format("Serie {0} not support extra component: {1}", + throw new System.Exception(string.Format("Serie {0} not support component: {1}", GetType().Name, type.Name)); } - public void RemoveExtraComponent<T>() where T : ISerieExtraComponent + public void RemoveComponent<T>() where T : ISerieComponent { - RemoveExtraComponent(typeof(T)); + RemoveComponent(typeof(T)); } - public void RemoveExtraComponent(Type type) + public void RemoveComponent(Type type) { - if (GetType().IsDefined(typeof(SerieExtraComponentAttribute), false)) + if (GetType().IsDefined(typeof(SerieComponentAttribute), false)) { - var attr = GetType().GetAttribute<SerieExtraComponentAttribute>(); + var attr = GetType().GetAttribute<SerieComponentAttribute>(); if (attr.Contains(type)) { var fieldName = string.Empty; @@ -137,17 +198,6 @@ namespace XCharts.Runtime } } } - throw new System.Exception(string.Format("Serie {0} not support extra component: {1}", - GetType().Name, type.Name)); - } - - private void RemoveExtraComponentList<T>(List<T> list) where T : ISerieExtraComponent - { - if (list.Count > 0) - { - list.Clear(); - SetAllDirty(); - } } } } \ No newline at end of file diff --git a/Runtime/Serie/SerieData.cs b/Runtime/Serie/SerieData.cs index 081cf9b2..226ee361 100644 --- a/Runtime/Serie/SerieData.cs +++ b/Runtime/Serie/SerieData.cs @@ -234,71 +234,157 @@ namespace XCharts.Runtime m_SelectStyles.Clear(); } + [Obsolete("GetOrAddComponent is obsolete. Use EnsureComponent instead.")] public T GetOrAddComponent<T>() where T : ChildComponent, ISerieDataComponent { - return GetOrAddComponent(typeof(T)) as T; + return EnsureComponent<T>(); } - public ISerieDataComponent GetOrAddComponent(Type type) + /// <summary> + /// Get the component of the serie data. return null if not exist. + /// |获取数据项的指定类型的组件,如果不存在则返回null。 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public T GetComponent<T>() where T : ChildComponent, ISerieDataComponent + { + return GetComponentInternal(typeof(T), false) as T; + } + + /// <summary> + /// Ensure the serie data has the component, if not, add it. + /// |确保数据项有指定类型的组件,如果没有则添加。 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + [Since("v3.6.0")] + public T EnsureComponent<T>() where T : ChildComponent, ISerieDataComponent + { + return GetComponentInternal(typeof(T), true) as T; + } + + /// <summary> + /// Ensure the serie data has the component, if not, add it. + /// |确保数据项有指定类型的组件,如果没有则添加。 + /// </summary> + /// <param name="type"></param> + /// <returns></returns> + [Since("v3.6.0")] + public ISerieDataComponent EnsureComponent(Type type) + { + return GetComponentInternal(type, true); + } + + private ISerieDataComponent GetComponentInternal(Type type, bool addIfNotExist) { if (type == typeof(ItemStyle)) { if (m_ItemStyles.Count == 0) - m_ItemStyles.Add(new ItemStyle() { show = true }); + { + if (addIfNotExist) + m_ItemStyles.Add(new ItemStyle() { show = true }); + else + return null; + } return m_ItemStyles[0]; } else if (type == typeof(LabelStyle)) { if (m_Labels.Count == 0) - m_Labels.Add(new LabelStyle() { show = true }); + { + if (addIfNotExist) + m_Labels.Add(new LabelStyle() { show = true }); + else + return null; + } return m_Labels[0]; } else if (type == typeof(LabelLine)) { if (m_LabelLines.Count == 0) - m_LabelLines.Add(new LabelLine() { show = true }); + { + if (addIfNotExist) + m_LabelLines.Add(new LabelLine() { show = true }); + else + return null; + } return m_LabelLines[0]; } else if (type == typeof(EmphasisStyle)) { if (m_EmphasisStyles.Count == 0) - m_EmphasisStyles.Add(new EmphasisStyle() { show = true }); + { + if (addIfNotExist) + m_EmphasisStyles.Add(new EmphasisStyle() { show = true }); + else + return null; + } return m_EmphasisStyles[0]; } else if (type == typeof(BlurStyle)) { if (m_BlurStyles.Count == 0) - m_BlurStyles.Add(new BlurStyle() { show = true }); + { + if (addIfNotExist) + m_BlurStyles.Add(new BlurStyle() { show = true }); + else + return null; + } return m_BlurStyles[0]; } else if (type == typeof(SelectStyle)) { if (m_SelectStyles.Count == 0) - m_SelectStyles.Add(new SelectStyle() { show = true }); + { + if (addIfNotExist) + m_SelectStyles.Add(new SelectStyle() { show = true }); + else + return null; + } return m_SelectStyles[0]; } else if (type == typeof(SerieSymbol)) { if (m_Symbols.Count == 0) - m_Symbols.Add(new SerieSymbol() { show = true }); + { + if (addIfNotExist) + m_Symbols.Add(new SerieSymbol() { show = true }); + else + return null; + } return m_Symbols[0]; } else if (type == typeof(LineStyle)) { if (m_LineStyles.Count == 0) - m_LineStyles.Add(new LineStyle() { show = true }); + { + if (addIfNotExist) + m_LineStyles.Add(new LineStyle() { show = true }); + else + return null; + } return m_LineStyles[0]; } else if (type == typeof(AreaStyle)) { if (m_AreaStyles.Count == 0) - m_AreaStyles.Add(new AreaStyle() { show = true }); + { + if (addIfNotExist) + m_AreaStyles.Add(new AreaStyle() { show = true }); + else + return null; + } return m_AreaStyles[0]; } else if (type == typeof(TitleStyle)) { if (m_TitleStyles.Count == 0) - m_TitleStyles.Add(new TitleStyle() { show = true }); + { + if (addIfNotExist) + m_TitleStyles.Add(new TitleStyle() { show = true }); + else + return null; + } return m_TitleStyles[0]; } else From 7a367d24abab210b943b52459dd9d003e85a203d Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 13 Feb 2023 07:20:50 +0800 Subject: [PATCH 29/55] =?UTF-8?q?=E9=87=8D=E6=9E=84ChartHelper.GetOrAddCom?= =?UTF-8?q?ponent=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Component/Background/BackgroundHandler.cs | 2 +- Runtime/Component/Legend/LegendHelper.cs | 6 +-- Runtime/Component/Tooltip/TooltipView.cs | 6 +-- Runtime/Internal/Utilities/ChartHelper.cs | 47 +++++++++++++++---- Runtime/Serie/SerieHandler.cs | 2 +- 5 files changed, 45 insertions(+), 18 deletions(-) diff --git a/Runtime/Component/Background/BackgroundHandler.cs b/Runtime/Component/Background/BackgroundHandler.cs index e99535c0..77c6d8ff 100644 --- a/Runtime/Component/Background/BackgroundHandler.cs +++ b/Runtime/Component/Background/BackgroundHandler.cs @@ -19,7 +19,7 @@ namespace XCharts.Runtime component.gameObject = backgroundObj; backgroundObj.hideFlags = chart.chartHideFlags; - var backgroundImage = ChartHelper.GetOrAddComponent<Image>(backgroundObj); + var backgroundImage = ChartHelper.EnsureComponent<Image>(backgroundObj); ChartHelper.UpdateRectTransform(backgroundObj, chart.chartMinAnchor, chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta); backgroundImage.sprite = component.image; diff --git a/Runtime/Component/Legend/LegendHelper.cs b/Runtime/Component/Legend/LegendHelper.cs index 9151d94d..3ca396a4 100644 --- a/Runtime/Component/Legend/LegendHelper.cs +++ b/Runtime/Component/Legend/LegendHelper.cs @@ -50,11 +50,11 @@ namespace XCharts.Runtime var objPivot = new Vector2(0, 1); var btnObj = ChartHelper.AddObject(objName, parent, objAnchorMin, objAnchorMax, objPivot, sizeDelta); var iconObj = ChartHelper.AddObject("icon", btnObj.transform, anchorMin, anchorMax, pivot, iconSizeDelta); - var img = ChartHelper.GetOrAddComponent<Image>(btnObj); + var img = ChartHelper.EnsureComponent<Image>(btnObj); img.color = Color.clear; img.raycastTarget = true; - ChartHelper.GetOrAddComponent<Button>(btnObj); - ChartHelper.GetOrAddComponent<Image>(iconObj); + ChartHelper.EnsureComponent<Button>(btnObj); + ChartHelper.EnsureComponent<Image>(iconObj); var label = ChartHelper.AddChartLabel("content", btnObj.transform, legend.labelStyle, theme.legend, content, contentColor, TextAnchor.MiddleLeft); diff --git a/Runtime/Component/Tooltip/TooltipView.cs b/Runtime/Component/Tooltip/TooltipView.cs index 3e47f94d..ba2d84bc 100644 --- a/Runtime/Component/Tooltip/TooltipView.cs +++ b/Runtime/Component/Tooltip/TooltipView.cs @@ -217,19 +217,19 @@ namespace XCharts.Runtime view.gameObject.transform.localPosition = Vector3.zero; view.transform = view.gameObject.transform; - view.background = ChartHelper.GetOrAddComponent<Image>(view.gameObject); + view.background = ChartHelper.EnsureComponent<Image>(view.gameObject); view.background.sprite = tooltip.backgroundImage; view.background.type = tooltip.backgroundType; view.background.color = ChartHelper.IsClearColor(tooltip.backgroundColor) ? Color.white : tooltip.backgroundColor; - view.border = ChartHelper.GetOrAddComponent<Outline>(view.gameObject); + view.border = ChartHelper.EnsureComponent<Outline>(view.gameObject); view.border.enabled = tooltip.borderWidth > 0; view.border.useGraphicAlpha = false; view.border.effectColor = tooltip.borderColor; view.border.effectDistance = new Vector2(tooltip.borderWidth, -tooltip.borderWidth); - view.layout = ChartHelper.GetOrAddComponent<VerticalLayoutGroup>(view.gameObject); + view.layout = ChartHelper.EnsureComponent<VerticalLayoutGroup>(view.gameObject); view.layout.childControlHeight = false; view.layout.childControlWidth = false; view.layout.childForceExpandHeight = false; diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index 517a79f8..f2894d03 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -169,12 +169,39 @@ namespace XCharts.Runtime #endif } } + + [System.Obsolete("Use EnsureComponent instead")] public static T GetOrAddComponent<T>(Transform transform) where T : Component { - return GetOrAddComponent<T>(transform.gameObject); + return EnsureComponent<T>(transform.gameObject); } + [System.Obsolete("Use EnsureComponent instead")] public static T GetOrAddComponent<T>(GameObject gameObject) where T : Component + { + return EnsureComponent<T>(gameObject); + } + + /// <summary> + /// Ensure that the transform has the specified component, add it if not. + /// |确保对象有指定的组件,如果没有则添加。 + /// </summary> + /// <param name="transform"></param> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public static T EnsureComponent<T>(Transform transform) where T : Component + { + return EnsureComponent<T>(transform.gameObject); + } + + /// <summary> + /// Ensure that the game object has the specified component, add it if not. + /// | 确保对象有指定的组件,如果没有则添加。 + /// </summary> + /// <param name="gameObject"></param> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public static T EnsureComponent<T>(GameObject gameObject) where T : Component { if (gameObject.GetComponent<T>() == null) { @@ -214,7 +241,7 @@ namespace XCharts.Runtime obj.transform.localRotation = Quaternion.Euler(0, 0, 0); obj.layer = parent.gameObject.layer; } - RectTransform rect = GetOrAddComponent<RectTransform>(obj); + RectTransform rect = EnsureComponent<RectTransform>(obj); rect.localPosition = Vector3.zero; rect.sizeDelta = sizeDelta; rect.anchorMin = anchorMin; @@ -228,7 +255,7 @@ namespace XCharts.Runtime Vector2 anchorMax, Vector2 pivot, Vector2 sizeDelta) { if (obj == null) return; - RectTransform rect = GetOrAddComponent<RectTransform>(obj); + RectTransform rect = EnsureComponent<RectTransform>(obj); rect.sizeDelta = sizeDelta; rect.anchorMin = anchorMin; rect.anchorMax = anchorMax; @@ -253,7 +280,7 @@ namespace XCharts.Runtime chartText.tmpText.raycastTarget = false; chartText.tmpText.enableWordWrapping = textStyle.autoWrap; #else - chartText.text = GetOrAddComponent<Text>(txtObj); + chartText.text = EnsureComponent<Text>(txtObj); chartText.text.font = textStyle.font == null ? theme.font : textStyle.font; chartText.text.fontStyle = textStyle.fontStyle; chartText.text.horizontalOverflow = textStyle.autoWrap ? HorizontalWrapMode.Wrap : HorizontalWrapMode.Overflow; @@ -272,7 +299,7 @@ namespace XCharts.Runtime chartText.SetLineSpacing(textStyle.lineSpacing); chartText.SetActive(textStyle.show); - RectTransform rect = GetOrAddComponent<RectTransform>(txtObj); + RectTransform rect = EnsureComponent<RectTransform>(txtObj); rect.localPosition = Vector3.zero; rect.sizeDelta = sizeDelta; rect.anchorMin = anchorMin; @@ -287,7 +314,7 @@ namespace XCharts.Runtime var painterObj = ChartHelper.AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); painterObj.hideFlags = hideFlags; painterObj.transform.SetSiblingIndex(siblingIndex); - return ChartHelper.GetOrAddComponent<Painter>(painterObj); + return ChartHelper.EnsureComponent<Painter>(painterObj); } public static Image AddIcon(string name, Transform parent, IconStyle iconStyle) @@ -303,7 +330,7 @@ namespace XCharts.Runtime var pivot = new Vector2(0.5f, 0.5f); var sizeDelta = new Vector2(width, height); GameObject iconObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); - var img = GetOrAddComponent<Image>(iconObj); + var img = EnsureComponent<Image>(iconObj); if (img.raycastTarget != false) img.raycastTarget = false; if (img.type != type) @@ -362,7 +389,7 @@ namespace XCharts.Runtime var alignment = textStyle.GetAlignment(autoAlignment); UpdateAnchorAndPivotByTextAlignment(alignment, out anchorMin, out anchorMax, out pivot); var labelObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); - var label = GetOrAddComponent<ChartLabel>(labelObj); + var label = EnsureComponent<ChartLabel>(labelObj); label.text = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme, autoColor, autoAlignment, label.text); label.icon = ChartHelper.AddIcon("Icon", label.gameObject.transform, labelStyle.icon); @@ -397,7 +424,7 @@ namespace XCharts.Runtime UpdateAnchorAndPivotByTextAlignment(alignment, out anchorMin, out anchorMax, out pivot); var vector0_5 = new Vector2(0.5f, 0.5f); var labelObj = AddObject(name, parent, vector0_5, vector0_5, vector0_5, sizeDelta); - var label = GetOrAddComponent<ChartLabel>(labelObj); + var label = EnsureComponent<ChartLabel>(labelObj); label.text = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme, autoColor, autoAlignment, label.text); label.icon = ChartHelper.AddIcon("Icon", label.gameObject.transform, labelStyle.icon); @@ -787,7 +814,7 @@ namespace XCharts.Runtime public static void AddEventListener(GameObject obj, EventTriggerType type, UnityEngine.Events.UnityAction<BaseEventData> call) { - EventTrigger trigger = GetOrAddComponent<EventTrigger>(obj.gameObject); + EventTrigger trigger = EnsureComponent<EventTrigger>(obj.gameObject); EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = type; entry.callback = new EventTrigger.TriggerEvent(); diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index 401fbb43..e1ae60e8 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -189,7 +189,7 @@ namespace XCharts.Runtime { if (m_SerieRoot != null) { - var rect = ChartHelper.GetOrAddComponent<RectTransform>(m_SerieRoot); + var rect = ChartHelper.EnsureComponent<RectTransform>(m_SerieRoot); rect.localPosition = Vector3.zero; rect.sizeDelta = chart.chartSizeDelta; rect.anchorMin = chart.chartMinAnchor; From 9f94541b9ee61c573fdfca35ba17c03b28e730bf Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 13 Feb 2023 07:21:48 +0800 Subject: [PATCH 30/55] =?UTF-8?q?=E8=BD=AC=E7=A7=BBinputsystem=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=88=B0=E4=B8=BB=E7=AB=99=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/img/inputsystem01.png | Bin 37503 -> 0 bytes Documentation~/zh/img/inputsystem02.png | Bin 59948 -> 0 bytes Documentation~/zh/img/inputsystem03.png | Bin 60145 -> 0 bytes Documentation~/zh/inputsystem.md | 17 ----------------- 4 files changed, 17 deletions(-) delete mode 100644 Documentation~/zh/img/inputsystem01.png delete mode 100644 Documentation~/zh/img/inputsystem02.png delete mode 100644 Documentation~/zh/img/inputsystem03.png delete mode 100644 Documentation~/zh/inputsystem.md diff --git a/Documentation~/zh/img/inputsystem01.png b/Documentation~/zh/img/inputsystem01.png deleted file mode 100644 index c2716e639f41d948bd06755e01fb9cf8ed5baddd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37503 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[j#OV9~`^_MFY0A}1 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 Wr+)VA=gAH{_%qNo(W%hFVE-Q+&<(u+ diff --git a/Documentation~/zh/img/inputsystem02.png b/Documentation~/zh/img/inputsystem02.png deleted file mode 100644 index 5178a460789092ff0f428906412738446c48d01a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59948 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 U;eTZxt-v20O~d{9d#wZi50CmwxBvhE diff --git a/Documentation~/zh/img/inputsystem03.png b/Documentation~/zh/img/inputsystem03.png deleted file mode 100644 index 95ad50a33f63a5db115659a2a0336c33ea436cbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60145 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 L_0(Re*oOZfWO~ji diff --git a/Documentation~/zh/inputsystem.md b/Documentation~/zh/inputsystem.md deleted file mode 100644 index ce401c66..00000000 --- a/Documentation~/zh/inputsystem.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: 入门教程:从 Input Manager 转到 Input System -sidebar_position: 1 -slug: /inputsystem ---- - -# 教程:从 Input Manager 转到 Input System - -## 1. 按图示修改项目配置中输入模式为 Input System -![Project Settings](img/inputsystem02.png) - -## 2. 使用 Unity Package Manager 安装 Input System -![UPM](img/inputsystem01.png) -## 3. 选中场景中 EventSystem 游戏对象,更换输入模组 -![Input Module](img/inputsystem03.png) - - From 9c069296edf5ca96a03b00ef129cb5040494d6a1 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 13 Feb 2023 07:22:07 +0800 Subject: [PATCH 31/55] update doc --- Documentation~/en/api.md | 77 +++++++++++++++-------------- Documentation~/en/configuration.md | 20 ++++---- Documentation~/en/tutorial01.md | 20 ++++---- Documentation~/zh/api.md | 79 +++++++++++++++--------------- Documentation~/zh/changelog.md | 3 +- Documentation~/zh/configuration.md | 24 ++++----- Documentation~/zh/faq.md | 2 +- Documentation~/zh/support.md | 3 +- Documentation~/zh/tutorial01.md | 22 ++++----- README.md | 2 +- 10 files changed, 128 insertions(+), 124 deletions(-) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index c0b4c566..599a6f46 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -27,9 +27,9 @@ slug: /api |[PieChart](#piechart)|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)| |[PropertyUtil](#propertyutil)|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)| |[ReflectionUtil](#reflectionutil)|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)| -|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)| -|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)| -|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)| +|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieComponentAttribute](#seriecomponentattribute)| +|[SerieContext](#seriecontext)|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataComponentAttribute](#seriedatacomponentattribute)| +|[SerieDataContext](#seriedatacontext)|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieHandler](#seriehandler)| |[SerieHandler<T>](#seriehandlert)|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)| |[SerieLabelHelper](#serielabelhelper)|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)| |[SeriesHelper](#serieshelper)|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)| @@ -133,7 +133,7 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver | ConvertSerie() |public bool ConvertSerie(Serie serie, Type type)| | ConvertSerie<T>() |public bool ConvertSerie<T>(Serie serie) where T : Serie| | ConvertXYAxis() |public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | -| EnsureChartComponent<T>() |public T EnsureChartComponent<T>() where T : MainComponent| +| EnsureChartComponent<T>() |public T EnsureChartComponent<T>() where T : MainComponent<br/>Ensure the chart has the component, if not, add it. Note: it may fail to add. | | GenerateDefaultSerieName() |public string GenerateDefaultSerieName()| | GetAllSerieDataCount() |public int GetAllSerieDataCount()| | GetChartBackgroundColor() |public Color32 GetChartBackgroundColor()| @@ -321,7 +321,6 @@ Inherits or Implemented: [BaseChart](#basechart) | GetBlurColor() |public static Color32 GetBlurColor(Color32 color, float a = 0.3f)| | GetColor() |public static Color32 GetColor(string hexColorStr)| | GetDire() |public static Vector3 GetDire(float angle, bool isDegree = false)| -| GetFloatAccuracy() |public static int GetFloatAccuracy(double value)| | GetFullName() |public static string GetFullName(Transform transform)| | GetHighlightColor() |public static Color32 GetHighlightColor(Color32 color, float rate = 0.8f)| | GetLastValue() |public static Vector3 GetLastValue(List<Vector3> list)| @@ -635,6 +634,8 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) | Approximately() |public static bool Approximately(double a, double b)| | Clamp() |public static double Clamp(double d, double min, double max)| | Clamp01() |public static double Clamp01(double value)| +| GetPrecision() |public static int GetPrecision(double value)| +| IsInteger() |public static bool IsInteger(double value)| | Lerp() |public static double Lerp(double a, double b, double t)| ## ObjectPool<T> where T @@ -737,6 +738,23 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [BaseChart](#basechart) +## SerieComponentAttribute + +Inherits or Implemented: [Attribute](#attribute) + +|public method|description| +|--|--| +| Contains() |public bool Contains(Type type)| +| Contains<T>() |public bool Contains<T>() where T : ISerieComponent| +| SerieComponentAttribute() |public SerieComponentAttribute()| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| + ## SerieContext ## SerieConvertAttribute @@ -752,28 +770,28 @@ Inherits or Implemented: [Attribute](#attribute) | SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2, Type serie3)| | SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2, Type serie3, Type serie4)| -## SerieDataContext - -|public method|description| -|--|--| -| Reset() |public void Reset()| - -## SerieDataExtraComponentAttribute +## SerieDataComponentAttribute Inherits or Implemented: [Attribute](#attribute) |public method|description| |--|--| | Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : ISerieExtraComponent| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute()| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| +| Contains<T>() |public bool Contains<T>() where T : ISerieComponent| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute()| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| + +## SerieDataContext + +|public method|description| +|--|--| +| Reset() |public void Reset()| ## SerieDataExtraFieldAttribute @@ -791,23 +809,6 @@ Inherits or Implemented: [Attribute](#attribute) | SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6)| | SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6, string field7)| -## SerieExtraComponentAttribute - -Inherits or Implemented: [Attribute](#attribute) - -|public method|description| -|--|--| -| Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : ISerieExtraComponent| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute()| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| - ## SerieHandler |public method|description| diff --git a/Documentation~/en/configuration.md b/Documentation~/en/configuration.md index 7fcdb2c7..07e4b56b 100644 --- a/Documentation~/en/configuration.md +++ b/Documentation~/en/configuration.md @@ -54,7 +54,7 @@ slug: /configuration |[TitleStyle](#titlestyle)|[TitleTheme](#titletheme)|[TooltipTheme](#tooltiptheme)|[VisualMapRange](#visualmaprange)| |[VisualMapTheme](#visualmaptheme)| -## ISerieExtraComponent +## ISerieComponent ||||| |--|--|--|--| @@ -116,7 +116,7 @@ the animation of serie. ## AreaStyle -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) The style of area. @@ -355,7 +355,7 @@ Inherits or Implemented: [Serie](#serie),[INeedSerieContainer](#ineedseriecontai ## BlurStyle -Inherits or Implemented: [StateStyle](#statestyle),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [StateStyle](#statestyle),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) > Since `v3.2.0` @@ -508,7 +508,7 @@ Inherits or Implemented: [BaseScatter](#basescatter) ## EmphasisStyle -Inherits or Implemented: [StateStyle](#statestyle),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [StateStyle](#statestyle),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) > Since `v3.2.0` @@ -570,7 +570,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent) ## ImageStyle -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) |field|default|since|comment| |--|--|--|--| @@ -643,7 +643,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieDataComponent] ## LabelLine -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) 标签的引导线 @@ -662,7 +662,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent ## LabelStyle -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) Text label of chart, to explain some data information about graphic item like value, name and so on. @@ -757,7 +757,7 @@ Inherits or Implemented: [Serie](#serie),[INeedSerieContainer](#ineedseriecontai ## LineArrow -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent) |field|default|since|comment| |--|--|--|--| @@ -990,7 +990,7 @@ Inherits or Implemented: [BaseScatter](#basescatter) ## SelectStyle -Inherits or Implemented: [StateStyle](#statestyle),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [StateStyle](#statestyle),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) > Since `v3.2.0` @@ -1344,7 +1344,7 @@ Title component, including main title and subtitle. ## TitleStyle -Inherits or Implemented: [LabelStyle](#labelstyle),[ISerieDataComponent](#iseriedatacomponent),[ISerieExtraComponent](#iserieextracomponent) +Inherits or Implemented: [LabelStyle](#labelstyle),[ISerieDataComponent](#iseriedatacomponent),[ISerieComponent](#iseriecomponent) the title of serie. diff --git a/Documentation~/en/tutorial01.md b/Documentation~/en/tutorial01.md index 64080abf..621a4e0d 100644 --- a/Documentation~/en/tutorial01.md +++ b/Documentation~/en/tutorial01.md @@ -100,29 +100,29 @@ chart.SetSize(580, 300);//代码动态设置尺寸,或直接操作chart.rectTr 设置标题: ```C# -var title = chart.GetOrAddChartComponent<Title>(); +var title = chart.EnsureChartComponent<Title>(); title.text = "Simple Line"; ``` 设置提示框和图例是否显示: ```C# -var tooltip = chart.GetOrAddChartComponent<Tooltip>(); +var tooltip = chart.EnsureChartComponent<Tooltip>(); tooltip.show = true; -var legend = chart.GetOrAddChartComponent<Legend>(); +var legend = chart.EnsureChartComponent<Legend>(); legend.show = false; ``` 设置坐标轴: ```C# -var xAxis = chart.GetOrAddChartComponent<XAxis>(); +var xAxis = chart.EnsureChartComponent<XAxis>(); xAxis.splitNumber = 10; xAxis.boundaryGap = true; xAxis.type = Axis.AxisType.Category; -var yAxis = chart.GetOrAddChartComponent<YAxis>(); +var yAxis = chart.EnsureChartComponent<YAxis>(); yAxis.type = Axis.AxisType.Value; ``` @@ -195,11 +195,11 @@ XCharts支持TextMeshPro,但默认是不开启的,需要自己手动切换 需要先获取组件,再修改里面的参数: ```C# -var title = chart.GetOrAddChartComponent<Title>(); +var title = chart.EnsureChartComponent<Title>(); title.text = "Simple LineChart"; title.subText = "normal line"; -var xAxis = chart.GetOrAddChartComponent<XAxis>(); +var xAxis = chart.EnsureChartComponent<XAxis>(); xAxis.splitNumber = 10; xAxis.boundaryGap = true; xAxis.type = Axis.AxisType.Category; @@ -234,9 +234,9 @@ serie.roundCap = true; 给Serie添加额外组件: ```C# -serie.AddExtraComponent<AreaStyle>(); +serie.EnsureComponent<AreaStyle>(); -var label = serie1.AddExtraComponent<LabelStyle>(); +var label = serie1.EnsureComponent<LabelStyle>(); label.offset = new Vector3(0,20,0); ``` @@ -247,7 +247,7 @@ var serieData = chart.AddData(0, 20); //var serieData = serie.GetSerieData(0); //从已有数据中获取 serieData.radius = 10; -var itemStyle = serieData.GetOrAddComponent<ItemStyle>(); //给数据项添加ItemStyle组件 +var itemStyle = serieData.EnsureComponent<ItemStyle>(); //给数据项添加ItemStyle组件 itemStyle.color = Color.blue; ``` diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 255fe22d..a7ec92fd 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 41 slug: /api --- @@ -27,9 +27,9 @@ slug: /api |[PieChart](#piechart)|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)| |[PropertyUtil](#propertyutil)|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)| |[ReflectionUtil](#reflectionutil)|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)| -|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieContext](#seriecontext)| -|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataContext](#seriedatacontext)|[SerieDataExtraComponentAttribute](#seriedataextracomponentattribute)| -|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieExtraComponentAttribute](#serieextracomponentattribute)|[SerieHandler](#seriehandler)| +|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieComponentAttribute](#seriecomponentattribute)| +|[SerieContext](#seriecontext)|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataComponentAttribute](#seriedatacomponentattribute)| +|[SerieDataContext](#seriedatacontext)|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieHandler](#seriehandler)| |[SerieHandler<T>](#seriehandlert)|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)| |[SerieLabelHelper](#serielabelhelper)|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)| |[SeriesHelper](#serieshelper)|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)| @@ -133,7 +133,7 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver | ConvertSerie() |public bool ConvertSerie(Serie serie, Type type)| | ConvertSerie<T>() |public bool ConvertSerie<T>(Serie serie) where T : Serie| | ConvertXYAxis() |public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | -| EnsureChartComponent<T>() |public T EnsureChartComponent<T>() where T : MainComponent| +| EnsureChartComponent<T>() |public T EnsureChartComponent<T>() where T : MainComponent<br/>确保图表有该组件,如果没有则添加。注意:有可能添加不成功。 | | GenerateDefaultSerieName() |public string GenerateDefaultSerieName()| | GetAllSerieDataCount() |public int GetAllSerieDataCount()| | GetChartBackgroundColor() |public Color32 GetChartBackgroundColor()| @@ -321,7 +321,6 @@ Inherits or Implemented: [BaseChart](#basechart) | GetBlurColor() |public static Color32 GetBlurColor(Color32 color, float a = 0.3f)| | GetColor() |public static Color32 GetColor(string hexColorStr)| | GetDire() |public static Vector3 GetDire(float angle, bool isDegree = false)| -| GetFloatAccuracy() |public static int GetFloatAccuracy(double value)| | GetFullName() |public static string GetFullName(Transform transform)| | GetHighlightColor() |public static Color32 GetHighlightColor(Color32 color, float rate = 0.8f)| | GetLastValue() |public static Vector3 GetLastValue(List<Vector3> list)| @@ -635,6 +634,8 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) | Approximately() |public static bool Approximately(double a, double b)| | Clamp() |public static double Clamp(double d, double min, double max)| | Clamp01() |public static double Clamp01(double value)| +| GetPrecision() |public static int GetPrecision(double value)| +| IsInteger() |public static bool IsInteger(double value)| | Lerp() |public static double Lerp(double a, double b, double t)| ## ObjectPool<T> where T @@ -737,6 +738,23 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [BaseChart](#basechart) +## SerieComponentAttribute + +Inherits or Implemented: [Attribute](#attribute) + +|public method|description| +|--|--| +| Contains() |public bool Contains(Type type)| +| Contains<T>() |public bool Contains<T>() where T : ISerieComponent| +| SerieComponentAttribute() |public SerieComponentAttribute()| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| +| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| + ## SerieContext ## SerieConvertAttribute @@ -752,28 +770,28 @@ Inherits or Implemented: [Attribute](#attribute) | SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2, Type serie3)| | SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2, Type serie3, Type serie4)| -## SerieDataContext - -|public method|description| -|--|--| -| Reset() |public void Reset()| - -## SerieDataExtraComponentAttribute +## SerieDataComponentAttribute Inherits or Implemented: [Attribute](#attribute) |public method|description| |--|--| | Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : ISerieExtraComponent| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute()| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| -| SerieDataExtraComponentAttribute() |public SerieDataExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| +| Contains<T>() |public bool Contains<T>() where T : ISerieComponent| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute()| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| +| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| + +## SerieDataContext + +|public method|description| +|--|--| +| Reset() |public void Reset()| ## SerieDataExtraFieldAttribute @@ -791,23 +809,6 @@ Inherits or Implemented: [Attribute](#attribute) | SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6)| | SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6, string field7)| -## SerieExtraComponentAttribute - -Inherits or Implemented: [Attribute](#attribute) - -|public method|description| -|--|--| -| Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : ISerieExtraComponent| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute()| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| -| SerieExtraComponentAttribute() |public SerieExtraComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| - ## SerieHandler |public method|description| diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 88225e58..4de6548a 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 61 slug: /changelog --- @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.02.12) 重构`Component`相关代码,调整API接口 * (2023.02.10) 修复`Axis`在`Log`轴时某些情况下最小值不正确的问题 * (2023.02.10) 优化`Axis`的数值`Label`的默认显示格式 * (2023.02.08) 增加`DataZoom`的`startLock`和`endLock`参数支持锁定 diff --git a/Documentation~/zh/configuration.md b/Documentation~/zh/configuration.md index af75cdde..6dd6b967 100644 --- a/Documentation~/zh/configuration.md +++ b/Documentation~/zh/configuration.md @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 31 slug: /configuration --- @@ -54,7 +54,7 @@ slug: /configuration |[TitleStyle](#titlestyle)|[TitleTheme](#titletheme)|[TooltipTheme](#tooltiptheme)|[VisualMapRange](#visualmaprange)| |[VisualMapTheme](#visualmaptheme)| -## ISerieExtraComponent 系列的额外组件 +## ISerieComponent 可添加到Serie的组件 ||||| |--|--|--|--| @@ -62,7 +62,7 @@ slug: /configuration |[LabelLine](#labelline)|[LabelStyle](#labelstyle)|[LineArrow](#linearrow)|[SelectStyle](#selectstyle)| |[TitleStyle](#titlestyle)| -## ISerieDataComponent 数据项的额外组件 +## ISerieDataComponent 可添加到SerieData的组件 ||||| |--|--|--|--| @@ -116,7 +116,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent) ## AreaStyle -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) 区域填充样式。 @@ -355,7 +355,7 @@ Inherits or Implemented: [Serie](#serie),[INeedSerieContainer](#ineedseriecontai ## BlurStyle -Inherits or Implemented: [StateStyle](#statestyle),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [StateStyle](#statestyle),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) > 从 `v3.2.0` 开始支持 @@ -508,7 +508,7 @@ Inherits or Implemented: [BaseScatter](#basescatter) ## EmphasisStyle -Inherits or Implemented: [StateStyle](#statestyle),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [StateStyle](#statestyle),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) > 从 `v3.2.0` 开始支持 @@ -570,7 +570,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent) ## ImageStyle -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) |field|default|since|comment| |--|--|--|--| @@ -643,7 +643,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieDataComponent] ## LabelLine -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) 标签的引导线 @@ -662,7 +662,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent ## LabelStyle -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) 图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。 @@ -757,7 +757,7 @@ Inherits or Implemented: [Serie](#serie),[INeedSerieContainer](#ineedseriecontai ## LineArrow -Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieExtraComponent](#iserieextracomponent) +Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#iseriecomponent) |field|default|since|comment| |--|--|--|--| @@ -990,7 +990,7 @@ Inherits or Implemented: [BaseScatter](#basescatter) ## SelectStyle -Inherits or Implemented: [StateStyle](#statestyle),[ISerieExtraComponent](#iserieextracomponent),[ISerieDataComponent](#iseriedatacomponent) +Inherits or Implemented: [StateStyle](#statestyle),[ISerieComponent](#iseriecomponent),[ISerieDataComponent](#iseriedatacomponent) > 从 `v3.2.0` 开始支持 @@ -1344,7 +1344,7 @@ Inherits or Implemented: [MainComponent](#maincomponent),[IPropertyChanged](#ipr ## TitleStyle -Inherits or Implemented: [LabelStyle](#labelstyle),[ISerieDataComponent](#iseriedatacomponent),[ISerieExtraComponent](#iserieextracomponent) +Inherits or Implemented: [LabelStyle](#labelstyle),[ISerieDataComponent](#iseriedatacomponent),[ISerieComponent](#iseriecomponent) 标题相关设置。 diff --git a/Documentation~/zh/faq.md b/Documentation~/zh/faq.md index 666238c1..c9a221e8 100644 --- a/Documentation~/zh/faq.md +++ b/Documentation~/zh/faq.md @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 51 slug: /faq --- diff --git a/Documentation~/zh/support.md b/Documentation~/zh/support.md index ddbf9ab3..440edfc5 100644 --- a/Documentation~/zh/support.md +++ b/Documentation~/zh/support.md @@ -1,5 +1,6 @@ --- -sidebar_position: 6 +title: 技术支持和订阅服务 +sidebar_position: 21 slug: /support --- diff --git a/Documentation~/zh/tutorial01.md b/Documentation~/zh/tutorial01.md index 3d027094..855cac94 100644 --- a/Documentation~/zh/tutorial01.md +++ b/Documentation~/zh/tutorial01.md @@ -1,6 +1,6 @@ --- title: 入门教程:5分钟上手 XCharts 3.0 -sidebar_position: 1 +sidebar_position: 11 slug: /tutorial01 --- @@ -105,29 +105,29 @@ chart.SetSize(580, 300);//代码动态设置尺寸,或直接操作chart.rectTr 设置标题: ```C# -var title = chart.GetOrAddChartComponent<Title>(); +var title = chart.EnsureChartComponent<Title>(); title.text = "Simple Line"; ``` 设置提示框和图例是否显示: ```C# -var tooltip = chart.GetOrAddChartComponent<Tooltip>(); +var tooltip = chart.EnsureChartComponent<Tooltip>(); tooltip.show = true; -var legend = chart.GetOrAddChartComponent<Legend>(); +var legend = chart.EnsureChartComponent<Legend>(); legend.show = false; ``` 设置坐标轴: ```C# -var xAxis = chart.GetOrAddChartComponent<XAxis>(); +var xAxis = chart.EnsureChartComponent<XAxis>(); xAxis.splitNumber = 10; xAxis.boundaryGap = true; xAxis.type = Axis.AxisType.Category; -var yAxis = chart.GetOrAddChartComponent<YAxis>(); +var yAxis = chart.EnsureChartComponent<YAxis>(); yAxis.type = Axis.AxisType.Value; ``` @@ -201,11 +201,11 @@ XCharts支持TextMeshPro,但默认是不开启的,需要自己手动切换 需要先获取组件,再修改里面的参数: ```C# -var title = chart.GetOrAddChartComponent<Title>(); +var title = chart.EnsureChartComponent<Title>(); title.text = "Simple LineChart"; title.subText = "normal line"; -var xAxis = chart.GetOrAddChartComponent<XAxis>(); +var xAxis = chart.EnsureChartComponent<XAxis>(); xAxis.splitNumber = 10; xAxis.boundaryGap = true; xAxis.type = Axis.AxisType.Category; @@ -240,9 +240,9 @@ serie.roundCap = true; 给Serie添加额外组件: ```C# -serie.AddExtraComponent<AreaStyle>(); +serie.EnsureComponent<AreaStyle>(); -var label = serie1.AddExtraComponent<LabelStyle>(); +var label = serie1.EnsureComponent<LabelStyle>(); label.offset = new Vector3(0,20,0); ``` @@ -253,7 +253,7 @@ var serieData = chart.AddData(0, 20); //var serieData = serie.GetSerieData(0); //从已有数据中获取 serieData.radius = 10; -var itemStyle = serieData.GetOrAddComponent<ItemStyle>(); //给数据项添加ItemStyle组件 +var itemStyle = serieData.EnsureComponent<ItemStyle>(); //给数据项添加ItemStyle组件 itemStyle.color = Color.blue; ``` diff --git a/README.md b/README.md index faf54529..62871c53 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ - 支持万级大数据量绘制,支持采样绘制。 - 支持`TexMeshPro`。 - 支持所有`5.6`以上的`Unity`版本。 -- 支持 Input System ([如何从 Input Manager 转 Input System](Documentation~/zh/inputsystem.md))。 +- 支持 Input System ([如何从 Input Manager 转 Input System](https://xcharts-team.github.io/docs/master/tutorial03/inputsystem))。 ## 截图 From b102fed9fec9cee423d970193daf279070a7feb7 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Tue, 14 Feb 2023 13:18:39 +0800 Subject: [PATCH 32/55] update doc --- Documentation~/en/api.md | 129 +++++++++++++----- Documentation~/en/configuration.md | 204 +++++++++++++++++++++-------- Documentation~/zh/api.md | 127 +++++++++++++----- Documentation~/zh/configuration.md | 202 ++++++++++++++++++++-------- 4 files changed, 490 insertions(+), 172 deletions(-) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index 599a6f46..c5aa7fd5 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 41 slug: /api --- @@ -7,39 +7,98 @@ slug: /api ## All Class -|||| -|--|--|--| -|[AnimationStyleHelper](#animationstylehelper)|[AxisContext](#axiscontext)|[AxisHandler<T>](#axishandlert)| -|[AxisHelper](#axishelper)|[BarChart](#barchart)|[BaseChart](#basechart)| -|[BaseGraph](#basegraph)|[CandlestickChart](#candlestickchart)|[ChartCached](#chartcached)| -|[ChartConst](#chartconst)|[ChartDrawer](#chartdrawer)|[ChartHelper](#charthelper)| -|[ChartLabel](#chartlabel)|[ChartObject](#chartobject)|[CheckHelper](#checkhelper)| -|[ColorUtil](#colorutil)|[ComponentHandlerAttribute](#componenthandlerattribute)|[ComponentHelper](#componenthelper)| -|[CoordOptionsAttribute](#coordoptionsattribute)|[DataZoomContext](#datazoomcontext)|[DataZoomHelper](#datazoomhelper)| -|[DateTimeUtil](#datetimeutil)|[DefaultAnimationAttribute](#defaultanimationattribute)|[DefineSymbolsUtil](#definesymbolsutil)| -|[FormatterHelper](#formatterhelper)|[GridCoordContext](#gridcoordcontext)|[HeatmapChart](#heatmapchart)| -|[IgnoreDoc](#ignoredoc)|[InputHelper](#inputhelper)|[InteractData](#interactdata)| -|[LayerHelper](#layerhelper)|[LegendContext](#legendcontext)|[LegendHelper](#legendhelper)| -|[LegendItem](#legenditem)|[LineChart](#linechart)|[ListFor](#listfor)| -|[ListForComponent](#listforcomponent)|[ListForSerie](#listforserie)|[MainComponentContext](#maincomponentcontext)| -|[MainComponentHandler](#maincomponenthandler)|[MainComponentHandler<T>](#maincomponenthandlert)|[MathUtil](#mathutil)| -|[Painter](#painter)|[ParallelChart](#parallelchart)|[ParallelCoordContext](#parallelcoordcontext)| -|[PieChart](#piechart)|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)| -|[PropertyUtil](#propertyutil)|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)| -|[ReflectionUtil](#reflectionutil)|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)| -|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieComponentAttribute](#seriecomponentattribute)| -|[SerieContext](#seriecontext)|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataComponentAttribute](#seriedatacomponentattribute)| -|[SerieDataContext](#seriedatacontext)|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieHandler](#seriehandler)| -|[SerieHandler<T>](#seriehandlert)|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)| -|[SerieLabelHelper](#serielabelhelper)|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)| -|[SeriesHelper](#serieshelper)|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)| -|[SimplifiedLineChart](#simplifiedlinechart)|[Since](#since)|[SVG](#svg)| -|[SVGImage](#svgimage)|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)| -|[TooltipContext](#tooltipcontext)|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)| -|[TooltipView](#tooltipview)|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)| -|[UGLExample](#uglexample)|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)| -|[VisualMapHelper](#visualmaphelper)|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)| -|[XCThemeMgr](#xcthememgr)| +- [AnimationStyleHelper](#animationstylehelper) +- [AxisContext](#axiscontext) +- [AxisHandler<T>](#axishandlert) +- [AxisHelper](#axishelper) +- [BarChart](#barchart) +- [BaseChart](#basechart) +- [BaseGraph](#basegraph) +- [CandlestickChart](#candlestickchart) +- [ChartCached](#chartcached) +- [ChartConst](#chartconst) +- [ChartDrawer](#chartdrawer) +- [ChartHelper](#charthelper) +- [ChartLabel](#chartlabel) +- [ChartObject](#chartobject) +- [CheckHelper](#checkhelper) +- [ColorUtil](#colorutil) +- [ComponentHandlerAttribute](#componenthandlerattribute) +- [ComponentHelper](#componenthelper) +- [CoordOptionsAttribute](#coordoptionsattribute) +- [DataZoomContext](#datazoomcontext) +- [DataZoomHelper](#datazoomhelper) +- [DateTimeUtil](#datetimeutil) +- [DefaultAnimationAttribute](#defaultanimationattribute) +- [DefineSymbolsUtil](#definesymbolsutil) +- [FormatterHelper](#formatterhelper) +- [GridCoordContext](#gridcoordcontext) +- [HeatmapChart](#heatmapchart) +- [IgnoreDoc](#ignoredoc) +- [InputHelper](#inputhelper) +- [InteractData](#interactdata) +- [LayerHelper](#layerhelper) +- [LegendContext](#legendcontext) +- [LegendHelper](#legendhelper) +- [LegendItem](#legenditem) +- [LineChart](#linechart) +- [ListFor](#listfor) +- [ListForComponent](#listforcomponent) +- [ListForSerie](#listforserie) +- [MainComponentContext](#maincomponentcontext) +- [MainComponentHandler](#maincomponenthandler) +- [MainComponentHandler<T>](#maincomponenthandlert) +- [MathUtil](#mathutil) +- [Painter](#painter) +- [ParallelChart](#parallelchart) +- [ParallelCoordContext](#parallelcoordcontext) +- [PieChart](#piechart) +- [PolarChart](#polarchart) +- [PolarCoordContext](#polarcoordcontext) +- [PropertyUtil](#propertyutil) +- [RadarChart](#radarchart) +- [RadarCoordContext](#radarcoordcontext) +- [ReflectionUtil](#reflectionutil) +- [RequireChartComponentAttribute](#requirechartcomponentattribute) +- [RingChart](#ringchart) +- [RuntimeUtil](#runtimeutil) +- [ScatterChart](#scatterchart) +- [SerieComponentAttribute](#seriecomponentattribute) +- [SerieContext](#seriecontext) +- [SerieConvertAttribute](#serieconvertattribute) +- [SerieDataComponentAttribute](#seriedatacomponentattribute) +- [SerieDataContext](#seriedatacontext) +- [SerieDataExtraFieldAttribute](#seriedataextrafieldattribute) +- [SerieHandler](#seriehandler) +- [SerieHandler<T>](#seriehandlert) +- [SerieHandlerAttribute](#seriehandlerattribute) +- [SerieHelper](#seriehelper) +- [SerieLabelHelper](#serielabelhelper) +- [SerieLabelPool](#serielabelpool) +- [SerieParams](#serieparams) +- [SeriesHelper](#serieshelper) +- [SimplifiedBarChart](#simplifiedbarchart) +- [SimplifiedCandlestickChart](#simplifiedcandlestickchart) +- [SimplifiedLineChart](#simplifiedlinechart) +- [Since](#since) +- [SVG](#svg) +- [SVGImage](#svgimage) +- [SVGPath](#svgpath) +- [SVGPathSeg](#svgpathseg) +- [TooltipContext](#tooltipcontext) +- [TooltipData](#tooltipdata) +- [TooltipHelper](#tooltiphelper) +- [TooltipView](#tooltipview) +- [TooltipViewItem](#tooltipviewitem) +- [UGL](#ugl) +- [UGLExample](#uglexample) +- [UGLHelper](#uglhelper) +- [VisualMapContext](#visualmapcontext) +- [VisualMapHelper](#visualmaphelper) +- [XChartsMgr](#xchartsmgr) +- [XCResourceImporterWindow](#xcresourceimporterwindow) +- [XCThemeMgr](#xcthememgr) + ## AnimationStyleHelper @@ -316,6 +375,8 @@ Inherits or Implemented: [BaseChart](#basechart) | DestoryGameObject() |public static void DestoryGameObject(Transform parent, string childName)| | DestoryGameObjectByMatch() |public static void DestoryGameObjectByMatch(Transform parent, string containString)| | DestroyAllChildren() |public static void DestroyAllChildren(Transform parent)| +| EnsureComponent<T>() |public static T EnsureComponent<T>(GameObject gameObject) where T : Component<br/>Ensure that the game object has the specified component, add it if not. | +| EnsureComponent<T>() |public static T EnsureComponent<T>(Transform transform) where T : Component<br/>Ensure that the transform has the specified component, add it if not. | | GetActualValue() |public static float GetActualValue(float valueOrRate, float total, float maxRate = 1.5f)| | GetAngle360() |public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | | GetBlurColor() |public static Color32 GetBlurColor(Color32 color, float a = 0.3f)| diff --git a/Documentation~/en/configuration.md b/Documentation~/en/configuration.md index 07e4b56b..193f0b19 100644 --- a/Documentation~/en/configuration.md +++ b/Documentation~/en/configuration.md @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 31 slug: /configuration --- @@ -7,76 +7,174 @@ slug: /configuration ## Serie -||||| -|--|--|--|--| -|[Bar](#bar)|[BaseScatter](#basescatter)|[Candlestick](#candlestick)|[EffectScatter](#effectscatter)| -|[Heatmap](#heatmap)|[Line](#line)|[Parallel](#parallel)|[Pie](#pie)| -|[Radar](#radar)|[Ring](#ring)|[Scatter](#scatter)|[Serie](#serie)| -|[SimplifiedBar](#simplifiedbar)|[SimplifiedCandlestick](#simplifiedcandlestick)|[SimplifiedLine](#simplifiedline)| +- [Bar](#bar) +- [BaseScatter](#basescatter) +- [Candlestick](#candlestick) +- [EffectScatter](#effectscatter) +- [Heatmap](#heatmap) +- [Line](#line) +- [Parallel](#parallel) +- [Pie](#pie) +- [Radar](#radar) +- [Ring](#ring) +- [Scatter](#scatter) +- [Serie](#serie) +- [SimplifiedBar](#simplifiedbar) +- [SimplifiedCandlestick](#simplifiedcandlestick) +- [SimplifiedLine](#simplifiedline) + ## Theme -||||| -|--|--|--|--| -|[AngleAxisTheme](#angleaxistheme)|[AxisTheme](#axistheme)|[BaseAxisTheme](#baseaxistheme)|[ComponentTheme](#componenttheme)| -|[DataZoomTheme](#datazoomtheme)|[LegendTheme](#legendtheme)|[PolarAxisTheme](#polaraxistheme)|[RadarAxisTheme](#radaraxistheme)| -|[RadiusAxisTheme](#radiusaxistheme)|[SerieTheme](#serietheme)|[SubTitleTheme](#subtitletheme)|[Theme](#theme)| -|[ThemeStyle](#themestyle)|[TitleTheme](#titletheme)|[TooltipTheme](#tooltiptheme)|[VisualMapTheme](#visualmaptheme)| +- [AngleAxisTheme](#angleaxistheme) +- [AxisTheme](#axistheme) +- [BaseAxisTheme](#baseaxistheme) +- [ComponentTheme](#componenttheme) +- [DataZoomTheme](#datazoomtheme) +- [LegendTheme](#legendtheme) +- [PolarAxisTheme](#polaraxistheme) +- [RadarAxisTheme](#radaraxistheme) +- [RadiusAxisTheme](#radiusaxistheme) +- [SerieTheme](#serietheme) +- [SubTitleTheme](#subtitletheme) +- [Theme](#theme) +- [ThemeStyle](#themestyle) +- [TitleTheme](#titletheme) +- [TooltipTheme](#tooltiptheme) +- [VisualMapTheme](#visualmaptheme) + ## MainComponent -||||| -|--|--|--|--| -|[AngleAxis](#angleaxis)|[Axis](#axis)|[Background](#background)|[CalendarCoord](#calendarcoord)| -|[Comment](#comment)|[CoordSystem](#coordsystem)|[DataZoom](#datazoom)|[GridCoord](#gridcoord)| -|[Legend](#legend)|[MarkArea](#markarea)|[MarkLine](#markline)|[ParallelAxis](#parallelaxis)| -|[ParallelCoord](#parallelcoord)|[PolarCoord](#polarcoord)|[RadarCoord](#radarcoord)|[RadiusAxis](#radiusaxis)| -|[Settings](#settings)|[SingleAxis](#singleaxis)|[SingleAxisCoord](#singleaxiscoord)|[Title](#title)| -|[Tooltip](#tooltip)|[VisualMap](#visualmap)|[XAxis](#xaxis)|[YAxis](#yaxis)| +- [AngleAxis](#angleaxis) +- [Axis](#axis) +- [Background](#background) +- [CalendarCoord](#calendarcoord) +- [Comment](#comment) +- [CoordSystem](#coordsystem) +- [DataZoom](#datazoom) +- [GridCoord](#gridcoord) +- [Legend](#legend) +- [MarkArea](#markarea) +- [MarkLine](#markline) +- [ParallelAxis](#parallelaxis) +- [ParallelCoord](#parallelcoord) +- [PolarCoord](#polarcoord) +- [RadarCoord](#radarcoord) +- [RadiusAxis](#radiusaxis) +- [Settings](#settings) +- [SingleAxis](#singleaxis) +- [SingleAxisCoord](#singleaxiscoord) +- [Title](#title) +- [Tooltip](#tooltip) +- [VisualMap](#visualmap) +- [XAxis](#xaxis) +- [YAxis](#yaxis) + ## ChildComponent -||||| -|--|--|--|--| -|[AngleAxisTheme](#angleaxistheme)|[AnimationStyle](#animationstyle)|[AreaStyle](#areastyle)|[ArrowStyle](#arrowstyle)| -|[AxisLabel](#axislabel)|[AxisLine](#axisline)|[AxisMinorSplitLine](#axisminorsplitline)|[AxisMinorTick](#axisminortick)| -|[AxisName](#axisname)|[AxisSplitArea](#axissplitarea)|[AxisSplitLine](#axissplitline)|[AxisTheme](#axistheme)| -|[AxisTick](#axistick)|[BaseAxisTheme](#baseaxistheme)|[BaseLine](#baseline)|[BlurStyle](#blurstyle)| -|[CommentItem](#commentitem)|[CommentMarkStyle](#commentmarkstyle)|[ComponentTheme](#componenttheme)|[DataZoomTheme](#datazoomtheme)| -|[EmphasisStyle](#emphasisstyle)|[EndLabelStyle](#endlabelstyle)|[IconStyle](#iconstyle)|[ImageStyle](#imagestyle)| -|[ItemStyle](#itemstyle)|[LabelLine](#labelline)|[LabelStyle](#labelstyle)|[LegendTheme](#legendtheme)| -|[Level](#level)|[LevelStyle](#levelstyle)|[LineArrow](#linearrow)|[LineStyle](#linestyle)| -|[Location](#location)|[MarkAreaData](#markareadata)|[MarkLineData](#marklinedata)|[MarqueeStyle](#marqueestyle)| -|[Padding](#padding)|[PolarAxisTheme](#polaraxistheme)|[RadarAxisTheme](#radaraxistheme)|[RadiusAxisTheme](#radiusaxistheme)| -|[SelectStyle](#selectstyle)|[SerieData](#seriedata)|[SerieSymbol](#seriesymbol)|[SerieTheme](#serietheme)| -|[StageColor](#stagecolor)|[StateStyle](#statestyle)|[SubTitleTheme](#subtitletheme)|[SymbolStyle](#symbolstyle)| -|[TextLimit](#textlimit)|[TextPadding](#textpadding)|[TextStyle](#textstyle)|[ThemeStyle](#themestyle)| -|[TitleStyle](#titlestyle)|[TitleTheme](#titletheme)|[TooltipTheme](#tooltiptheme)|[VisualMapRange](#visualmaprange)| -|[VisualMapTheme](#visualmaptheme)| +- [AngleAxisTheme](#angleaxistheme) +- [AnimationStyle](#animationstyle) +- [AreaStyle](#areastyle) +- [ArrowStyle](#arrowstyle) +- [AxisLabel](#axislabel) +- [AxisLine](#axisline) +- [AxisMinorSplitLine](#axisminorsplitline) +- [AxisMinorTick](#axisminortick) +- [AxisName](#axisname) +- [AxisSplitArea](#axissplitarea) +- [AxisSplitLine](#axissplitline) +- [AxisTheme](#axistheme) +- [AxisTick](#axistick) +- [BaseAxisTheme](#baseaxistheme) +- [BaseLine](#baseline) +- [BlurStyle](#blurstyle) +- [CommentItem](#commentitem) +- [CommentMarkStyle](#commentmarkstyle) +- [ComponentTheme](#componenttheme) +- [DataZoomTheme](#datazoomtheme) +- [EmphasisStyle](#emphasisstyle) +- [EndLabelStyle](#endlabelstyle) +- [IconStyle](#iconstyle) +- [ImageStyle](#imagestyle) +- [ItemStyle](#itemstyle) +- [LabelLine](#labelline) +- [LabelStyle](#labelstyle) +- [LegendTheme](#legendtheme) +- [Level](#level) +- [LevelStyle](#levelstyle) +- [LineArrow](#linearrow) +- [LineStyle](#linestyle) +- [Location](#location) +- [MarkAreaData](#markareadata) +- [MarkLineData](#marklinedata) +- [MarqueeStyle](#marqueestyle) +- [Padding](#padding) +- [PolarAxisTheme](#polaraxistheme) +- [RadarAxisTheme](#radaraxistheme) +- [RadiusAxisTheme](#radiusaxistheme) +- [SelectStyle](#selectstyle) +- [SerieData](#seriedata) +- [SerieSymbol](#seriesymbol) +- [SerieTheme](#serietheme) +- [StageColor](#stagecolor) +- [StateStyle](#statestyle) +- [SubTitleTheme](#subtitletheme) +- [SymbolStyle](#symbolstyle) +- [TextLimit](#textlimit) +- [TextPadding](#textpadding) +- [TextStyle](#textstyle) +- [ThemeStyle](#themestyle) +- [TitleStyle](#titlestyle) +- [TitleTheme](#titletheme) +- [TooltipTheme](#tooltiptheme) +- [VisualMapRange](#visualmaprange) +- [VisualMapTheme](#visualmaptheme) + ## ISerieComponent -||||| -|--|--|--|--| -|[AreaStyle](#areastyle)|[BlurStyle](#blurstyle)|[EmphasisStyle](#emphasisstyle)|[ImageStyle](#imagestyle)| -|[LabelLine](#labelline)|[LabelStyle](#labelstyle)|[LineArrow](#linearrow)|[SelectStyle](#selectstyle)| -|[TitleStyle](#titlestyle)| +- [AreaStyle](#areastyle) +- [BlurStyle](#blurstyle) +- [EmphasisStyle](#emphasisstyle) +- [ImageStyle](#imagestyle) +- [LabelLine](#labelline) +- [LabelStyle](#labelstyle) +- [LineArrow](#linearrow) +- [SelectStyle](#selectstyle) +- [TitleStyle](#titlestyle) + ## ISerieDataComponent -||||| -|--|--|--|--| -|[AreaStyle](#areastyle)|[BlurStyle](#blurstyle)|[EmphasisStyle](#emphasisstyle)|[ImageStyle](#imagestyle)| -|[ItemStyle](#itemstyle)|[LabelLine](#labelline)|[LabelStyle](#labelstyle)|[LineStyle](#linestyle)| -|[SelectStyle](#selectstyle)|[SerieSymbol](#seriesymbol)|[TitleStyle](#titlestyle)| +- [AreaStyle](#areastyle) +- [BlurStyle](#blurstyle) +- [EmphasisStyle](#emphasisstyle) +- [ImageStyle](#imagestyle) +- [ItemStyle](#itemstyle) +- [LabelLine](#labelline) +- [LabelStyle](#labelstyle) +- [LineStyle](#linestyle) +- [SelectStyle](#selectstyle) +- [SerieSymbol](#seriesymbol) +- [TitleStyle](#titlestyle) + ## Other Component -||||| -|--|--|--|--| -|[BaseSerie](#baseserie)|[ChartText](#charttext)|[ChildComponent](#childcomponent)|[DebugInfo](#debuginfo)| -|[Indicator](#indicator)|[Lang](#lang)|[LangCandlestick](#langcandlestick)|[LangTime](#langtime)| -|[MainComponent](#maincomponent)|[XCResourcesImporter](#xcresourcesimporter)|[XCSettings](#xcsettings)| +- [BaseSerie](#baseserie) +- [ChartText](#charttext) +- [ChildComponent](#childcomponent) +- [DebugInfo](#debuginfo) +- [Indicator](#indicator) +- [Lang](#lang) +- [LangCandlestick](#langcandlestick) +- [LangTime](#langtime) +- [MainComponent](#maincomponent) +- [XCResourcesImporter](#xcresourcesimporter) +- [XCSettings](#xcsettings) + ## AngleAxis diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index a7ec92fd..5a9f3078 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -7,39 +7,98 @@ slug: /api ## 所有类 -|||| -|--|--|--| -|[AnimationStyleHelper](#animationstylehelper)|[AxisContext](#axiscontext)|[AxisHandler<T>](#axishandlert)| -|[AxisHelper](#axishelper)|[BarChart](#barchart)|[BaseChart](#basechart)| -|[BaseGraph](#basegraph)|[CandlestickChart](#candlestickchart)|[ChartCached](#chartcached)| -|[ChartConst](#chartconst)|[ChartDrawer](#chartdrawer)|[ChartHelper](#charthelper)| -|[ChartLabel](#chartlabel)|[ChartObject](#chartobject)|[CheckHelper](#checkhelper)| -|[ColorUtil](#colorutil)|[ComponentHandlerAttribute](#componenthandlerattribute)|[ComponentHelper](#componenthelper)| -|[CoordOptionsAttribute](#coordoptionsattribute)|[DataZoomContext](#datazoomcontext)|[DataZoomHelper](#datazoomhelper)| -|[DateTimeUtil](#datetimeutil)|[DefaultAnimationAttribute](#defaultanimationattribute)|[DefineSymbolsUtil](#definesymbolsutil)| -|[FormatterHelper](#formatterhelper)|[GridCoordContext](#gridcoordcontext)|[HeatmapChart](#heatmapchart)| -|[IgnoreDoc](#ignoredoc)|[InputHelper](#inputhelper)|[InteractData](#interactdata)| -|[LayerHelper](#layerhelper)|[LegendContext](#legendcontext)|[LegendHelper](#legendhelper)| -|[LegendItem](#legenditem)|[LineChart](#linechart)|[ListFor](#listfor)| -|[ListForComponent](#listforcomponent)|[ListForSerie](#listforserie)|[MainComponentContext](#maincomponentcontext)| -|[MainComponentHandler](#maincomponenthandler)|[MainComponentHandler<T>](#maincomponenthandlert)|[MathUtil](#mathutil)| -|[Painter](#painter)|[ParallelChart](#parallelchart)|[ParallelCoordContext](#parallelcoordcontext)| -|[PieChart](#piechart)|[PolarChart](#polarchart)|[PolarCoordContext](#polarcoordcontext)| -|[PropertyUtil](#propertyutil)|[RadarChart](#radarchart)|[RadarCoordContext](#radarcoordcontext)| -|[ReflectionUtil](#reflectionutil)|[RequireChartComponentAttribute](#requirechartcomponentattribute)|[RingChart](#ringchart)| -|[RuntimeUtil](#runtimeutil)|[ScatterChart](#scatterchart)|[SerieComponentAttribute](#seriecomponentattribute)| -|[SerieContext](#seriecontext)|[SerieConvertAttribute](#serieconvertattribute)|[SerieDataComponentAttribute](#seriedatacomponentattribute)| -|[SerieDataContext](#seriedatacontext)|[SerieDataExtraFieldAttribute](#seriedataextrafieldattribute)|[SerieHandler](#seriehandler)| -|[SerieHandler<T>](#seriehandlert)|[SerieHandlerAttribute](#seriehandlerattribute)|[SerieHelper](#seriehelper)| -|[SerieLabelHelper](#serielabelhelper)|[SerieLabelPool](#serielabelpool)|[SerieParams](#serieparams)| -|[SeriesHelper](#serieshelper)|[SimplifiedBarChart](#simplifiedbarchart)|[SimplifiedCandlestickChart](#simplifiedcandlestickchart)| -|[SimplifiedLineChart](#simplifiedlinechart)|[Since](#since)|[SVG](#svg)| -|[SVGImage](#svgimage)|[SVGPath](#svgpath)|[SVGPathSeg](#svgpathseg)| -|[TooltipContext](#tooltipcontext)|[TooltipData](#tooltipdata)|[TooltipHelper](#tooltiphelper)| -|[TooltipView](#tooltipview)|[TooltipViewItem](#tooltipviewitem)|[UGL](#ugl)| -|[UGLExample](#uglexample)|[UGLHelper](#uglhelper)|[VisualMapContext](#visualmapcontext)| -|[VisualMapHelper](#visualmaphelper)|[XChartsMgr](#xchartsmgr)|[XCResourceImporterWindow](#xcresourceimporterwindow)| -|[XCThemeMgr](#xcthememgr)| +- [AnimationStyleHelper](#animationstylehelper) +- [AxisContext](#axiscontext) +- [AxisHandler<T>](#axishandlert) +- [AxisHelper](#axishelper) +- [BarChart](#barchart) +- [BaseChart](#basechart) +- [BaseGraph](#basegraph) +- [CandlestickChart](#candlestickchart) +- [ChartCached](#chartcached) +- [ChartConst](#chartconst) +- [ChartDrawer](#chartdrawer) +- [ChartHelper](#charthelper) +- [ChartLabel](#chartlabel) +- [ChartObject](#chartobject) +- [CheckHelper](#checkhelper) +- [ColorUtil](#colorutil) +- [ComponentHandlerAttribute](#componenthandlerattribute) +- [ComponentHelper](#componenthelper) +- [CoordOptionsAttribute](#coordoptionsattribute) +- [DataZoomContext](#datazoomcontext) +- [DataZoomHelper](#datazoomhelper) +- [DateTimeUtil](#datetimeutil) +- [DefaultAnimationAttribute](#defaultanimationattribute) +- [DefineSymbolsUtil](#definesymbolsutil) +- [FormatterHelper](#formatterhelper) +- [GridCoordContext](#gridcoordcontext) +- [HeatmapChart](#heatmapchart) +- [IgnoreDoc](#ignoredoc) +- [InputHelper](#inputhelper) +- [InteractData](#interactdata) +- [LayerHelper](#layerhelper) +- [LegendContext](#legendcontext) +- [LegendHelper](#legendhelper) +- [LegendItem](#legenditem) +- [LineChart](#linechart) +- [ListFor](#listfor) +- [ListForComponent](#listforcomponent) +- [ListForSerie](#listforserie) +- [MainComponentContext](#maincomponentcontext) +- [MainComponentHandler](#maincomponenthandler) +- [MainComponentHandler<T>](#maincomponenthandlert) +- [MathUtil](#mathutil) +- [Painter](#painter) +- [ParallelChart](#parallelchart) +- [ParallelCoordContext](#parallelcoordcontext) +- [PieChart](#piechart) +- [PolarChart](#polarchart) +- [PolarCoordContext](#polarcoordcontext) +- [PropertyUtil](#propertyutil) +- [RadarChart](#radarchart) +- [RadarCoordContext](#radarcoordcontext) +- [ReflectionUtil](#reflectionutil) +- [RequireChartComponentAttribute](#requirechartcomponentattribute) +- [RingChart](#ringchart) +- [RuntimeUtil](#runtimeutil) +- [ScatterChart](#scatterchart) +- [SerieComponentAttribute](#seriecomponentattribute) +- [SerieContext](#seriecontext) +- [SerieConvertAttribute](#serieconvertattribute) +- [SerieDataComponentAttribute](#seriedatacomponentattribute) +- [SerieDataContext](#seriedatacontext) +- [SerieDataExtraFieldAttribute](#seriedataextrafieldattribute) +- [SerieHandler](#seriehandler) +- [SerieHandler<T>](#seriehandlert) +- [SerieHandlerAttribute](#seriehandlerattribute) +- [SerieHelper](#seriehelper) +- [SerieLabelHelper](#serielabelhelper) +- [SerieLabelPool](#serielabelpool) +- [SerieParams](#serieparams) +- [SeriesHelper](#serieshelper) +- [SimplifiedBarChart](#simplifiedbarchart) +- [SimplifiedCandlestickChart](#simplifiedcandlestickchart) +- [SimplifiedLineChart](#simplifiedlinechart) +- [Since](#since) +- [SVG](#svg) +- [SVGImage](#svgimage) +- [SVGPath](#svgpath) +- [SVGPathSeg](#svgpathseg) +- [TooltipContext](#tooltipcontext) +- [TooltipData](#tooltipdata) +- [TooltipHelper](#tooltiphelper) +- [TooltipView](#tooltipview) +- [TooltipViewItem](#tooltipviewitem) +- [UGL](#ugl) +- [UGLExample](#uglexample) +- [UGLHelper](#uglhelper) +- [VisualMapContext](#visualmapcontext) +- [VisualMapHelper](#visualmaphelper) +- [XChartsMgr](#xchartsmgr) +- [XCResourceImporterWindow](#xcresourceimporterwindow) +- [XCThemeMgr](#xcthememgr) + ## AnimationStyleHelper @@ -316,6 +375,8 @@ Inherits or Implemented: [BaseChart](#basechart) | DestoryGameObject() |public static void DestoryGameObject(Transform parent, string childName)| | DestoryGameObjectByMatch() |public static void DestoryGameObjectByMatch(Transform parent, string containString)| | DestroyAllChildren() |public static void DestroyAllChildren(Transform parent)| +| EnsureComponent<T>() |public static T EnsureComponent<T>(GameObject gameObject) where T : Component<br/>确保对象有指定的组件,如果没有则添加。 | +| EnsureComponent<T>() |public static T EnsureComponent<T>(Transform transform) where T : Component<br/>确保对象有指定的组件,如果没有则添加。 | | GetActualValue() |public static float GetActualValue(float valueOrRate, float total, float maxRate = 1.5f)| | GetAngle360() |public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | | GetBlurColor() |public static Color32 GetBlurColor(Color32 color, float a = 0.3f)| diff --git a/Documentation~/zh/configuration.md b/Documentation~/zh/configuration.md index 6dd6b967..47faa9a4 100644 --- a/Documentation~/zh/configuration.md +++ b/Documentation~/zh/configuration.md @@ -7,76 +7,174 @@ slug: /configuration ## Serie 系列 -||||| -|--|--|--|--| -|[Bar](#bar)|[BaseScatter](#basescatter)|[Candlestick](#candlestick)|[EffectScatter](#effectscatter)| -|[Heatmap](#heatmap)|[Line](#line)|[Parallel](#parallel)|[Pie](#pie)| -|[Radar](#radar)|[Ring](#ring)|[Scatter](#scatter)|[Serie](#serie)| -|[SimplifiedBar](#simplifiedbar)|[SimplifiedCandlestick](#simplifiedcandlestick)|[SimplifiedLine](#simplifiedline)| +- [Bar](#bar) +- [BaseScatter](#basescatter) +- [Candlestick](#candlestick) +- [EffectScatter](#effectscatter) +- [Heatmap](#heatmap) +- [Line](#line) +- [Parallel](#parallel) +- [Pie](#pie) +- [Radar](#radar) +- [Ring](#ring) +- [Scatter](#scatter) +- [Serie](#serie) +- [SimplifiedBar](#simplifiedbar) +- [SimplifiedCandlestick](#simplifiedcandlestick) +- [SimplifiedLine](#simplifiedline) + ## Theme 主题 -||||| -|--|--|--|--| -|[AngleAxisTheme](#angleaxistheme)|[AxisTheme](#axistheme)|[BaseAxisTheme](#baseaxistheme)|[ComponentTheme](#componenttheme)| -|[DataZoomTheme](#datazoomtheme)|[LegendTheme](#legendtheme)|[PolarAxisTheme](#polaraxistheme)|[RadarAxisTheme](#radaraxistheme)| -|[RadiusAxisTheme](#radiusaxistheme)|[SerieTheme](#serietheme)|[SubTitleTheme](#subtitletheme)|[Theme](#theme)| -|[ThemeStyle](#themestyle)|[TitleTheme](#titletheme)|[TooltipTheme](#tooltiptheme)|[VisualMapTheme](#visualmaptheme)| +- [AngleAxisTheme](#angleaxistheme) +- [AxisTheme](#axistheme) +- [BaseAxisTheme](#baseaxistheme) +- [ComponentTheme](#componenttheme) +- [DataZoomTheme](#datazoomtheme) +- [LegendTheme](#legendtheme) +- [PolarAxisTheme](#polaraxistheme) +- [RadarAxisTheme](#radaraxistheme) +- [RadiusAxisTheme](#radiusaxistheme) +- [SerieTheme](#serietheme) +- [SubTitleTheme](#subtitletheme) +- [Theme](#theme) +- [ThemeStyle](#themestyle) +- [TitleTheme](#titletheme) +- [TooltipTheme](#tooltiptheme) +- [VisualMapTheme](#visualmaptheme) + ## MainComponent 主组件 -||||| -|--|--|--|--| -|[AngleAxis](#angleaxis)|[Axis](#axis)|[Background](#background)|[CalendarCoord](#calendarcoord)| -|[Comment](#comment)|[CoordSystem](#coordsystem)|[DataZoom](#datazoom)|[GridCoord](#gridcoord)| -|[Legend](#legend)|[MarkArea](#markarea)|[MarkLine](#markline)|[ParallelAxis](#parallelaxis)| -|[ParallelCoord](#parallelcoord)|[PolarCoord](#polarcoord)|[RadarCoord](#radarcoord)|[RadiusAxis](#radiusaxis)| -|[Settings](#settings)|[SingleAxis](#singleaxis)|[SingleAxisCoord](#singleaxiscoord)|[Title](#title)| -|[Tooltip](#tooltip)|[VisualMap](#visualmap)|[XAxis](#xaxis)|[YAxis](#yaxis)| +- [AngleAxis](#angleaxis) +- [Axis](#axis) +- [Background](#background) +- [CalendarCoord](#calendarcoord) +- [Comment](#comment) +- [CoordSystem](#coordsystem) +- [DataZoom](#datazoom) +- [GridCoord](#gridcoord) +- [Legend](#legend) +- [MarkArea](#markarea) +- [MarkLine](#markline) +- [ParallelAxis](#parallelaxis) +- [ParallelCoord](#parallelcoord) +- [PolarCoord](#polarcoord) +- [RadarCoord](#radarcoord) +- [RadiusAxis](#radiusaxis) +- [Settings](#settings) +- [SingleAxis](#singleaxis) +- [SingleAxisCoord](#singleaxiscoord) +- [Title](#title) +- [Tooltip](#tooltip) +- [VisualMap](#visualmap) +- [XAxis](#xaxis) +- [YAxis](#yaxis) + ## ChildComponent 子组件 -||||| -|--|--|--|--| -|[AngleAxisTheme](#angleaxistheme)|[AnimationStyle](#animationstyle)|[AreaStyle](#areastyle)|[ArrowStyle](#arrowstyle)| -|[AxisLabel](#axislabel)|[AxisLine](#axisline)|[AxisMinorSplitLine](#axisminorsplitline)|[AxisMinorTick](#axisminortick)| -|[AxisName](#axisname)|[AxisSplitArea](#axissplitarea)|[AxisSplitLine](#axissplitline)|[AxisTheme](#axistheme)| -|[AxisTick](#axistick)|[BaseAxisTheme](#baseaxistheme)|[BaseLine](#baseline)|[BlurStyle](#blurstyle)| -|[CommentItem](#commentitem)|[CommentMarkStyle](#commentmarkstyle)|[ComponentTheme](#componenttheme)|[DataZoomTheme](#datazoomtheme)| -|[EmphasisStyle](#emphasisstyle)|[EndLabelStyle](#endlabelstyle)|[IconStyle](#iconstyle)|[ImageStyle](#imagestyle)| -|[ItemStyle](#itemstyle)|[LabelLine](#labelline)|[LabelStyle](#labelstyle)|[LegendTheme](#legendtheme)| -|[Level](#level)|[LevelStyle](#levelstyle)|[LineArrow](#linearrow)|[LineStyle](#linestyle)| -|[Location](#location)|[MarkAreaData](#markareadata)|[MarkLineData](#marklinedata)|[MarqueeStyle](#marqueestyle)| -|[Padding](#padding)|[PolarAxisTheme](#polaraxistheme)|[RadarAxisTheme](#radaraxistheme)|[RadiusAxisTheme](#radiusaxistheme)| -|[SelectStyle](#selectstyle)|[SerieData](#seriedata)|[SerieSymbol](#seriesymbol)|[SerieTheme](#serietheme)| -|[StageColor](#stagecolor)|[StateStyle](#statestyle)|[SubTitleTheme](#subtitletheme)|[SymbolStyle](#symbolstyle)| -|[TextLimit](#textlimit)|[TextPadding](#textpadding)|[TextStyle](#textstyle)|[ThemeStyle](#themestyle)| -|[TitleStyle](#titlestyle)|[TitleTheme](#titletheme)|[TooltipTheme](#tooltiptheme)|[VisualMapRange](#visualmaprange)| -|[VisualMapTheme](#visualmaptheme)| +- [AngleAxisTheme](#angleaxistheme) +- [AnimationStyle](#animationstyle) +- [AreaStyle](#areastyle) +- [ArrowStyle](#arrowstyle) +- [AxisLabel](#axislabel) +- [AxisLine](#axisline) +- [AxisMinorSplitLine](#axisminorsplitline) +- [AxisMinorTick](#axisminortick) +- [AxisName](#axisname) +- [AxisSplitArea](#axissplitarea) +- [AxisSplitLine](#axissplitline) +- [AxisTheme](#axistheme) +- [AxisTick](#axistick) +- [BaseAxisTheme](#baseaxistheme) +- [BaseLine](#baseline) +- [BlurStyle](#blurstyle) +- [CommentItem](#commentitem) +- [CommentMarkStyle](#commentmarkstyle) +- [ComponentTheme](#componenttheme) +- [DataZoomTheme](#datazoomtheme) +- [EmphasisStyle](#emphasisstyle) +- [EndLabelStyle](#endlabelstyle) +- [IconStyle](#iconstyle) +- [ImageStyle](#imagestyle) +- [ItemStyle](#itemstyle) +- [LabelLine](#labelline) +- [LabelStyle](#labelstyle) +- [LegendTheme](#legendtheme) +- [Level](#level) +- [LevelStyle](#levelstyle) +- [LineArrow](#linearrow) +- [LineStyle](#linestyle) +- [Location](#location) +- [MarkAreaData](#markareadata) +- [MarkLineData](#marklinedata) +- [MarqueeStyle](#marqueestyle) +- [Padding](#padding) +- [PolarAxisTheme](#polaraxistheme) +- [RadarAxisTheme](#radaraxistheme) +- [RadiusAxisTheme](#radiusaxistheme) +- [SelectStyle](#selectstyle) +- [SerieData](#seriedata) +- [SerieSymbol](#seriesymbol) +- [SerieTheme](#serietheme) +- [StageColor](#stagecolor) +- [StateStyle](#statestyle) +- [SubTitleTheme](#subtitletheme) +- [SymbolStyle](#symbolstyle) +- [TextLimit](#textlimit) +- [TextPadding](#textpadding) +- [TextStyle](#textstyle) +- [ThemeStyle](#themestyle) +- [TitleStyle](#titlestyle) +- [TitleTheme](#titletheme) +- [TooltipTheme](#tooltiptheme) +- [VisualMapRange](#visualmaprange) +- [VisualMapTheme](#visualmaptheme) + ## ISerieComponent 可添加到Serie的组件 -||||| -|--|--|--|--| -|[AreaStyle](#areastyle)|[BlurStyle](#blurstyle)|[EmphasisStyle](#emphasisstyle)|[ImageStyle](#imagestyle)| -|[LabelLine](#labelline)|[LabelStyle](#labelstyle)|[LineArrow](#linearrow)|[SelectStyle](#selectstyle)| -|[TitleStyle](#titlestyle)| +- [AreaStyle](#areastyle) +- [BlurStyle](#blurstyle) +- [EmphasisStyle](#emphasisstyle) +- [ImageStyle](#imagestyle) +- [LabelLine](#labelline) +- [LabelStyle](#labelstyle) +- [LineArrow](#linearrow) +- [SelectStyle](#selectstyle) +- [TitleStyle](#titlestyle) + ## ISerieDataComponent 可添加到SerieData的组件 -||||| -|--|--|--|--| -|[AreaStyle](#areastyle)|[BlurStyle](#blurstyle)|[EmphasisStyle](#emphasisstyle)|[ImageStyle](#imagestyle)| -|[ItemStyle](#itemstyle)|[LabelLine](#labelline)|[LabelStyle](#labelstyle)|[LineStyle](#linestyle)| -|[SelectStyle](#selectstyle)|[SerieSymbol](#seriesymbol)|[TitleStyle](#titlestyle)| +- [AreaStyle](#areastyle) +- [BlurStyle](#blurstyle) +- [EmphasisStyle](#emphasisstyle) +- [ImageStyle](#imagestyle) +- [ItemStyle](#itemstyle) +- [LabelLine](#labelline) +- [LabelStyle](#labelstyle) +- [LineStyle](#linestyle) +- [SelectStyle](#selectstyle) +- [SerieSymbol](#seriesymbol) +- [TitleStyle](#titlestyle) + ## Other 其他组件 -||||| -|--|--|--|--| -|[BaseSerie](#baseserie)|[ChartText](#charttext)|[ChildComponent](#childcomponent)|[DebugInfo](#debuginfo)| -|[Indicator](#indicator)|[Lang](#lang)|[LangCandlestick](#langcandlestick)|[LangTime](#langtime)| -|[MainComponent](#maincomponent)|[XCResourcesImporter](#xcresourcesimporter)|[XCSettings](#xcsettings)| +- [BaseSerie](#baseserie) +- [ChartText](#charttext) +- [ChildComponent](#childcomponent) +- [DebugInfo](#debuginfo) +- [Indicator](#indicator) +- [Lang](#lang) +- [LangCandlestick](#langcandlestick) +- [LangTime](#langtime) +- [MainComponent](#maincomponent) +- [XCResourcesImporter](#xcresourcesimporter) +- [XCSettings](#xcsettings) + ## AngleAxis From 33246c2a1fb8100b467084dc2d8dc506a6ce708d Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Wed, 15 Feb 2023 21:47:08 +0800 Subject: [PATCH 33/55] update doc --- Documentation~/zh/api.md | 2 +- Documentation~/zh/configuration.md | 2 +- Documentation~/zh/faq.md | 2 +- Documentation~/zh/support.md | 4 ++-- README.md | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 5a9f3078..dfe8204b 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -1,5 +1,5 @@ --- -sidebar_position: 41 +sidebar_position: 31 slug: /api --- diff --git a/Documentation~/zh/configuration.md b/Documentation~/zh/configuration.md index 47faa9a4..df5e296b 100644 --- a/Documentation~/zh/configuration.md +++ b/Documentation~/zh/configuration.md @@ -1,5 +1,5 @@ --- -sidebar_position: 31 +sidebar_position: 21 slug: /configuration --- diff --git a/Documentation~/zh/faq.md b/Documentation~/zh/faq.md index c9a221e8..51054ce8 100644 --- a/Documentation~/zh/faq.md +++ b/Documentation~/zh/faq.md @@ -1,5 +1,5 @@ --- -sidebar_position: 51 +sidebar_position: 41 slug: /faq --- diff --git a/Documentation~/zh/support.md b/Documentation~/zh/support.md index 440edfc5..e6a7c0e3 100644 --- a/Documentation~/zh/support.md +++ b/Documentation~/zh/support.md @@ -1,6 +1,6 @@ --- -title: 技术支持和订阅服务 -sidebar_position: 21 +title: 订阅服务 +sidebar_position: 51 slug: /support --- diff --git a/README.md b/README.md index 62871c53..b1bf2f3c 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ - 支持万级大数据量绘制,支持采样绘制。 - 支持`TexMeshPro`。 - 支持所有`5.6`以上的`Unity`版本。 -- 支持 Input System ([如何从 Input Manager 转 Input System](https://xcharts-team.github.io/docs/master/tutorial03/inputsystem))。 +- 支持 Input System ([如何从 Input Manager 转 Input System](https://xcharts-team.github.io/docs/inputsystem))。 ## 截图 From 398fee2d9781ba4a8a1424183dac16f3d2fcdc3a Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Wed, 22 Feb 2023 22:08:40 +0800 Subject: [PATCH 34/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8DTMP=E4=B8=8B=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Component/Child/Location.cs | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/Runtime/Component/Child/Location.cs b/Runtime/Component/Child/Location.cs index c61de59a..cc576bd2 100644 --- a/Runtime/Component/Child/Location.cs +++ b/Runtime/Component/Child/Location.cs @@ -275,11 +275,7 @@ namespace XCharts.Runtime case Align.BottomCenter: case Align.BottomLeft: case Align.BottomRight: -#if dUI_TextMeshPro - case TextAlignmentOptions.Bottom: - case TextAlignmentOptions.BottomLeft: - case TextAlignmentOptions.BottomRight: -#endif + return true; default: return false; @@ -293,11 +289,6 @@ namespace XCharts.Runtime case Align.TopCenter: case Align.TopLeft: case Align.TopRight: -#if dUI_TextMeshPro - case TextAlignmentOptions.Top: - case TextAlignmentOptions.TopLeft: - case TextAlignmentOptions.TopRight: -#endif return true; default: return false; @@ -311,11 +302,6 @@ namespace XCharts.Runtime case Align.Center: case Align.CenterLeft: case Align.CenterRight: -#if dUI_TextMeshPro - case TextAlignmentOptions.Center: - case TextAlignmentOptions.CenterLeft: - case TextAlignmentOptions.CenterRight: -#endif return true; default: return false; From 8c6d013341c5f135812874add228fa17e42f8c5b Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Sun, 26 Feb 2023 22:49:19 +0800 Subject: [PATCH 35/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`DataZoom`=E7=9A=84`sta?= =?UTF-8?q?rtEndFunction`=E5=A7=94=E6=89=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Component/DataZoom/DataZoom.cs | 5 +++++ Runtime/Component/DataZoom/DataZoomHandler.cs | 2 ++ Runtime/Internal/Misc/DelegateFunction.cs | 6 ++++++ 4 files changed, 14 insertions(+) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 4de6548a..c1561784 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.02.26) 增加`DataZoom`的`startEndFunction`委托 * (2023.02.12) 重构`Component`相关代码,调整API接口 * (2023.02.10) 修复`Axis`在`Log`轴时某些情况下最小值不正确的问题 * (2023.02.10) 优化`Axis`的数值`Label`的默认显示格式 diff --git a/Runtime/Component/DataZoom/DataZoom.cs b/Runtime/Component/DataZoom/DataZoom.cs index 27b82507..84cf83ad 100644 --- a/Runtime/Component/DataZoom/DataZoom.cs +++ b/Runtime/Component/DataZoom/DataZoom.cs @@ -93,6 +93,7 @@ namespace XCharts.Runtime [SerializeField][Since("v3.6.0")] private bool m_EndLock; public DataZoomContext context = new DataZoomContext(); + private CustomDataZoomStartEndFunction m_StartEndFunction; /// <summary> /// Whether to show dataZoom. @@ -393,6 +394,10 @@ namespace XCharts.Runtime get { return m_MarqueeStyle; } set { if (PropertyUtil.SetClass(ref m_MarqueeStyle, value)) SetAllDirty(); } } + /// <summary> + /// start和end变更委托。 + /// </summary> + public CustomDataZoomStartEndFunction startEndFunction { get { return m_StartEndFunction; } set { m_StartEndFunction = value; } } class AxisIndexValueInfo { diff --git a/Runtime/Component/DataZoom/DataZoomHandler.cs b/Runtime/Component/DataZoom/DataZoomHandler.cs index fd06635d..a98cd540 100644 --- a/Runtime/Component/DataZoom/DataZoomHandler.cs +++ b/Runtime/Component/DataZoom/DataZoomHandler.cs @@ -397,6 +397,8 @@ namespace XCharts.Runtime if (end < start) end = start; + if (dataZoom.startEndFunction != null) + dataZoom.startEndFunction(ref start, ref end); if (!dataZoom.startLock) dataZoom.start = start; diff --git a/Runtime/Internal/Misc/DelegateFunction.cs b/Runtime/Internal/Misc/DelegateFunction.cs index 224616bd..15b1e9db 100644 --- a/Runtime/Internal/Misc/DelegateFunction.cs +++ b/Runtime/Internal/Misc/DelegateFunction.cs @@ -22,4 +22,10 @@ namespace XCharts.Runtime /// <returns></returns> public delegate float SymbolSizeFunction(List<double> data); public delegate void CustomDrawGaugePointerFunction(VertexHelper vh, int serieIndex, int dataIndex, float currentAngle); + /// <summary> + /// DataZoom的start和end变更时的委托方法。 + /// </summary> + /// <param name="start"></param> + /// <param name="end"></param> + public delegate void CustomDataZoomStartEndFunction(ref float start, ref float end); } \ No newline at end of file From c42ca0f097afc9f90f31968d3ec578a5ee7fe764 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Tue, 28 Feb 2023 13:11:18 +0800 Subject: [PATCH 36/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Legend`=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E6=97=B6`Serie`=E7=9A=84`Label`=E4=B8=8D=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Internal/BaseChart.Serie.cs | 1 + Runtime/Serie/SerieHandler.cs | 1 + 3 files changed, 3 insertions(+) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index c1561784..df87dfd9 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.02.28) 修复`Legend`点击时`Serie`的`Label`不刷新的问题 * (2023.02.26) 增加`DataZoom`的`startEndFunction`委托 * (2023.02.12) 重构`Component`相关代码,调整API接口 * (2023.02.10) 修复`Axis`在`Log`轴时某些情况下最小值不正确的问题 diff --git a/Runtime/Internal/BaseChart.Serie.cs b/Runtime/Internal/BaseChart.Serie.cs index 27e39bc9..282e5da5 100644 --- a/Runtime/Internal/BaseChart.Serie.cs +++ b/Runtime/Internal/BaseChart.Serie.cs @@ -647,6 +647,7 @@ namespace XCharts.Runtime public void SetSerieActive(Serie serie, bool active) { serie.show = active; + serie.RefreshLabel(); serie.AnimationReset(); if (active) serie.AnimationFadeIn(); UpdateLegendColor(serie.serieName, active); diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index e1ae60e8..184983a3 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -385,6 +385,7 @@ namespace XCharts.Runtime var isIgnore = serie.IsIgnoreIndex(serieData.index, defaultDimension); if (serie.show && currLabel != null && + currLabel.show && serieData.context.canShowLabel && !isIgnore) { From 64c9b97eb9517b289ed873ebe4d9debc926a73e9 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Fri, 3 Mar 2023 22:41:00 +0800 Subject: [PATCH 37/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Animation`=E5=8F=98?= =?UTF-8?q?=E6=9B=B4=E5=8A=A8=E7=94=BB=E5=8F=AF=E8=83=BD=E6=97=A0=E6=95=88?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Runtime/Component/Animation/AnimationStyle.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index df87dfd9..c003c30f 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.03.03) 修复`Animation`变更动画可能无效的问题 * (2023.02.28) 修复`Legend`点击时`Serie`的`Label`不刷新的问题 * (2023.02.26) 增加`DataZoom`的`startEndFunction`委托 * (2023.02.12) 重构`Component`相关代码,调整API接口 diff --git a/Runtime/Component/Animation/AnimationStyle.cs b/Runtime/Component/Animation/AnimationStyle.cs index 586e66a3..beaabd01 100644 --- a/Runtime/Component/Animation/AnimationStyle.cs +++ b/Runtime/Component/Animation/AnimationStyle.cs @@ -622,7 +622,7 @@ namespace XCharts.Runtime public float GetUpdateAnimationDuration() { - if (m_Enable && m_DataChangeEnable && IsFinish()) + if (m_Enable && m_DataChangeEnable) return m_DataChangeDuration; else return 0; From bf152a3a714d504df36e32a756cda68841e94f19 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Sat, 4 Mar 2023 21:09:50 +0800 Subject: [PATCH 38/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`Legend`=E7=9A=84`Posit?= =?UTF-8?q?ions`=E5=8F=AF=E8=87=AA=E5=AE=9A=E4=B9=89=E5=9B=BE=E4=BE=8B?= =?UTF-8?q?=E7=9A=84=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/en/configuration.md | 1 + Documentation~/zh/api.md | 2 +- Documentation~/zh/changelog.md | 1 + Documentation~/zh/configuration.md | 3 ++- Editor/MainComponents/LegendEditor.cs | 1 + Runtime/Component/Legend/Legend.cs | 18 ++++++++++++++++++ Runtime/Component/Legend/LegendHelper.cs | 6 ++++-- 7 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Documentation~/en/configuration.md b/Documentation~/en/configuration.md index 193f0b19..82391778 100644 --- a/Documentation~/en/configuration.md +++ b/Documentation~/en/configuration.md @@ -820,6 +820,7 @@ Legend component.The legend component shows different sets of tags, colors, and |colors|||the colors of legend item. |background||v3.1.0|the sytle of background. [ImageStyle](#imagestyle)| |padding||v3.1.0|the paddinng of item and background. [Padding](#padding)| +|positions||v3.6.0|the custom positions of legend item. ## LegendTheme diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index dfe8204b..5a9f3078 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -1,5 +1,5 @@ --- -sidebar_position: 31 +sidebar_position: 41 slug: /api --- diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index c003c30f..694e2d9d 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.03.04) 增加`Legend`的`Positions`可自定义图例的位置 * (2023.03.03) 修复`Animation`变更动画可能无效的问题 * (2023.02.28) 修复`Legend`点击时`Serie`的`Label`不刷新的问题 * (2023.02.26) 增加`DataZoom`的`startEndFunction`委托 diff --git a/Documentation~/zh/configuration.md b/Documentation~/zh/configuration.md index df5e296b..667d912c 100644 --- a/Documentation~/zh/configuration.md +++ b/Documentation~/zh/configuration.md @@ -1,5 +1,5 @@ --- -sidebar_position: 21 +sidebar_position: 31 slug: /configuration --- @@ -820,6 +820,7 @@ Inherits or Implemented: [MainComponent](#maincomponent),[IPropertyChanged](#ipr |colors|||图例标记的颜色列表。 |background||v3.1.0|背景图样式。 [ImageStyle](#imagestyle)| |padding||v3.1.0|图例标记和背景的间距。 [Padding](#padding)| +|positions||v3.6.0|图例标记的自定义位置列表。 ## LegendTheme diff --git a/Editor/MainComponents/LegendEditor.cs b/Editor/MainComponents/LegendEditor.cs index db3d8063..340b567b 100644 --- a/Editor/MainComponents/LegendEditor.cs +++ b/Editor/MainComponents/LegendEditor.cs @@ -24,6 +24,7 @@ namespace XCharts.Editor PropertyField("m_Padding"); PropertyListField("m_Icons"); PropertyListField("m_Colors"); + PropertyListField("m_Positions"); PropertyListField("m_Data"); --EditorGUI.indentLevel; } diff --git a/Runtime/Component/Legend/Legend.cs b/Runtime/Component/Legend/Legend.cs index 9b8e53b4..283110fa 100644 --- a/Runtime/Component/Legend/Legend.cs +++ b/Runtime/Component/Legend/Legend.cs @@ -86,6 +86,7 @@ namespace XCharts.Runtime [SerializeField] private List<Color> m_Colors = new List<Color>(); [SerializeField][Since("v3.1.0")] protected ImageStyle m_Background = new ImageStyle() { show = false }; [SerializeField][Since("v3.1.0")] protected Padding m_Padding = new Padding(); + [SerializeField][Since("v3.6.0")] private List<Vector3> m_Positions = new List<Vector3>(); public LegendContext context = new LegendContext(); @@ -257,6 +258,15 @@ namespace XCharts.Runtime set { if (value != null) { m_Colors = value; SetAllDirty(); } } } /// <summary> + /// the custom positions of legend item. + /// |图例标记的自定义位置列表。 + /// </summary> + public List<Vector3> positions + { + get { return m_Positions; } + set { if (value != null) { m_Positions = value; SetAllDirty(); } } + } + /// <summary> /// 图表是否需要刷新(图例组件不需要刷新图表) /// </summary> public override bool vertsDirty { get { return false; } } @@ -428,6 +438,14 @@ namespace XCharts.Runtime return Color.white; } + public Vector3 GetPosition(int index, Vector3 defaultPos) + { + if (index >= 0 && index < m_Positions.Count) + return m_Positions[index]; + else + return defaultPos; + } + /// <summary> /// Callback handling when parameters change. /// |参数变更时的回调处理。 diff --git a/Runtime/Component/Legend/LegendHelper.cs b/Runtime/Component/Legend/LegendHelper.cs index 3ca396a4..352c8a78 100644 --- a/Runtime/Component/Legend/LegendHelper.cs +++ b/Runtime/Component/Legend/LegendHelper.cs @@ -156,6 +156,7 @@ namespace XCharts.Runtime var currHeight = 0f; var offsetX = 0f; var row = 0; + var index = 0; foreach (var kv in legend.context.buttonList) { var item = kv.Value; @@ -165,7 +166,7 @@ namespace XCharts.Runtime offsetX += legend.context.eachWidthDict[row]; row++; } - item.SetPosition(new Vector3(startX + offsetX, startY - currHeight)); + item.SetPosition(legend.GetPosition(index++, new Vector3(startX + offsetX, startY - currHeight))); currHeight += item.height + legend.itemGap; } } @@ -173,6 +174,7 @@ namespace XCharts.Runtime { var currWidth = 0f; var offsetY = 0f; + var index = 0; foreach (var kv in legend.context.buttonList) { var item = kv.Value; @@ -181,7 +183,7 @@ namespace XCharts.Runtime currWidth = 0; offsetY += legend.context.eachHeight; } - item.SetPosition(new Vector3(startX + currWidth, startY - offsetY)); + item.SetPosition(legend.GetPosition(index++, new Vector3(startX + currWidth, startY - offsetY))); currWidth += item.width + legend.itemGap; } } From 465af108aa253dc3e203da49d749a91a17ed1cb0 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 9 Mar 2023 21:31:26 +0800 Subject: [PATCH 39/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`Chart`=E7=9A=84`onSeri?= =?UTF-8?q?eClick`=EF=BC=8C`onSerieDown`=EF=BC=8C`onSerieEnter`=E5=92=8C`o?= =?UTF-8?q?nSerieExit`=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/en/api.md | 20 ++++ Documentation~/zh/api.md | 20 ++++ Documentation~/zh/changelog.md | 2 + Editor/Series/PieEditor.cs | 1 + Examples/Example30_PieChart.cs | 2 +- Examples/Example_Test.cs | 19 ++++ README.md | 14 +-- Runtime/Internal/BaseChart.API.cs | 31 ++++++- Runtime/Internal/BaseChart.cs | 6 +- Runtime/Internal/BaseGraph.cs | 3 +- Runtime/Internal/Misc/SerieEventData.cs | 46 ++++++++++ Runtime/Internal/Misc/SerieEventData.cs.meta | 11 +++ Runtime/Internal/Pools/SerieEventDataPool.cs | 33 +++++++ .../Internal/Pools/SerieEventDataPool.cs.meta | 11 +++ Runtime/Internal/Utilities/ChartHelper.cs | 7 +- Runtime/Serie/Bar/BarHandler.cs | 16 +--- Runtime/Serie/Bar/SimplifiedBarHandler.cs | 3 +- Runtime/Serie/Heatmap/HeatmapHandler.cs | 16 ++-- Runtime/Serie/Line/LineHandler.cs | 25 ++++- Runtime/Serie/Line/SimplifiedLineHandler.cs | 3 +- Runtime/Serie/Parallel/ParallelHandler.cs | 3 - Runtime/Serie/Pie/PieHandler.cs | 56 +++++------ Runtime/Serie/Radar/RadarHandler.cs | 39 +++++--- Runtime/Serie/Ring/RingHandler.cs | 3 +- Runtime/Serie/Scatter/BaseScatterHandler.cs | 3 +- Runtime/Serie/Serie.cs | 21 +++++ Runtime/Serie/SerieContext.cs | 4 + Runtime/Serie/SerieHandler.cs | 92 +++++++++++++++++-- 28 files changed, 408 insertions(+), 102 deletions(-) create mode 100644 Runtime/Internal/Misc/SerieEventData.cs create mode 100644 Runtime/Internal/Misc/SerieEventData.cs.meta create mode 100644 Runtime/Internal/Pools/SerieEventDataPool.cs create mode 100644 Runtime/Internal/Pools/SerieEventDataPool.cs.meta diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index c5aa7fd5..980de0cd 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -69,6 +69,8 @@ slug: /api - [SerieDataComponentAttribute](#seriedatacomponentattribute) - [SerieDataContext](#seriedatacontext) - [SerieDataExtraFieldAttribute](#seriedataextrafieldattribute) +- [SerieEventData](#serieeventdata) +- [SerieEventDataPool](#serieeventdatapool) - [SerieHandler](#seriehandler) - [SerieHandler<T>](#seriehandlert) - [SerieHandlerAttribute](#seriehandlerattribute) @@ -870,6 +872,19 @@ Inherits or Implemented: [Attribute](#attribute) | SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6)| | SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6, string field7)| +## SerieEventData + +|public method|description| +|--|--| +| Reset() |public void Reset()| + +## SerieEventDataPool + +|public method|description| +|--|--| +| Get() |public static SerieEventData Get(Vector3 pos, int serieIndex, int dataIndex, int dimension, double value)| +| Release() |public static void Release(SerieEventData toRelease)| + ## SerieHandler |public method|description| @@ -896,6 +911,7 @@ Inherits or Implemented: [Attribute](#attribute) | RefreshLabelNextFrame() |public virtual void RefreshLabelNextFrame() { }| | RemoveComponent() |public virtual void RemoveComponent() { }| | Update() |public virtual void Update() { }| +| UpdateSerieContext() |public virtual void UpdateSerieContext() { }| ## SerieHandler<T> @@ -904,6 +920,8 @@ Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](# |public method|description| |--|--| | DrawLabelLineSymbol() |public void DrawLabelLineSymbol(VertexHelper vh, LabelLine labelLine, Vector3 startPos, Vector3 endPos, Color32 defaultColor)| +| GetPointerItemDataDimension() |public override int GetPointerItemDataDimension()| +| GetPointerItemDataIndex() |public override int GetPointerItemDataIndex()| | GetSerieDataAutoColor() |public virtual Color GetSerieDataAutoColor(SerieData serieData)| | GetSerieDataLabelOffset() |public virtual Vector3 GetSerieDataLabelOffset(SerieData serieData, LabelStyle label)| | GetSerieDataLabelPosition() |public virtual Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)| @@ -912,6 +930,8 @@ Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](# | OnLegendButtonClick() |public override void OnLegendButtonClick(int index, string legendName, bool show)| | OnLegendButtonEnter() |public override void OnLegendButtonEnter(int index, string legendName)| | OnLegendButtonExit() |public override void OnLegendButtonExit(int index, string legendName)| +| OnPointerClick() |public override void OnPointerClick(PointerEventData eventData)| +| OnPointerDown() |public override void OnPointerDown(PointerEventData eventData)| | RefreshEndLabelInternal() |public virtual void RefreshEndLabelInternal()| | RefreshLabelInternal() |public override void RefreshLabelInternal()| | RefreshLabelNextFrame() |public override void RefreshLabelNextFrame()| diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 5a9f3078..42d4dae3 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -69,6 +69,8 @@ slug: /api - [SerieDataComponentAttribute](#seriedatacomponentattribute) - [SerieDataContext](#seriedatacontext) - [SerieDataExtraFieldAttribute](#seriedataextrafieldattribute) +- [SerieEventData](#serieeventdata) +- [SerieEventDataPool](#serieeventdatapool) - [SerieHandler](#seriehandler) - [SerieHandler<T>](#seriehandlert) - [SerieHandlerAttribute](#seriehandlerattribute) @@ -870,6 +872,19 @@ Inherits or Implemented: [Attribute](#attribute) | SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6)| | SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6, string field7)| +## SerieEventData + +|public method|description| +|--|--| +| Reset() |public void Reset()| + +## SerieEventDataPool + +|public method|description| +|--|--| +| Get() |public static SerieEventData Get(Vector3 pos, int serieIndex, int dataIndex, int dimension, double value)| +| Release() |public static void Release(SerieEventData toRelease)| + ## SerieHandler |public method|description| @@ -896,6 +911,7 @@ Inherits or Implemented: [Attribute](#attribute) | RefreshLabelNextFrame() |public virtual void RefreshLabelNextFrame() { }| | RemoveComponent() |public virtual void RemoveComponent() { }| | Update() |public virtual void Update() { }| +| UpdateSerieContext() |public virtual void UpdateSerieContext() { }| ## SerieHandler<T> @@ -904,6 +920,8 @@ Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](# |public method|description| |--|--| | DrawLabelLineSymbol() |public void DrawLabelLineSymbol(VertexHelper vh, LabelLine labelLine, Vector3 startPos, Vector3 endPos, Color32 defaultColor)| +| GetPointerItemDataDimension() |public override int GetPointerItemDataDimension()| +| GetPointerItemDataIndex() |public override int GetPointerItemDataIndex()| | GetSerieDataAutoColor() |public virtual Color GetSerieDataAutoColor(SerieData serieData)| | GetSerieDataLabelOffset() |public virtual Vector3 GetSerieDataLabelOffset(SerieData serieData, LabelStyle label)| | GetSerieDataLabelPosition() |public virtual Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)| @@ -912,6 +930,8 @@ Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](# | OnLegendButtonClick() |public override void OnLegendButtonClick(int index, string legendName, bool show)| | OnLegendButtonEnter() |public override void OnLegendButtonEnter(int index, string legendName)| | OnLegendButtonExit() |public override void OnLegendButtonExit(int index, string legendName)| +| OnPointerClick() |public override void OnPointerClick(PointerEventData eventData)| +| OnPointerDown() |public override void OnPointerDown(PointerEventData eventData)| | RefreshEndLabelInternal() |public virtual void RefreshEndLabelInternal()| | RefreshLabelInternal() |public override void RefreshLabelInternal()| | RefreshLabelNextFrame() |public override void RefreshLabelNextFrame()| diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 694e2d9d..872efefb 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,8 @@ slug: /changelog ## master +* (2023.03.09) 增加`Chart`的`onSerieClick`,`onSerieDown`,`onSerieEnter`和`onSerieExit`回调 +* (2023.03.09) 修复`Pie`的点击选中偏移不生效的问题 * (2023.03.04) 增加`Legend`的`Positions`可自定义图例的位置 * (2023.03.03) 修复`Animation`变更动画可能无效的问题 * (2023.02.28) 修复`Legend`点击时`Serie`的`Label`不刷新的问题 diff --git a/Editor/Series/PieEditor.cs b/Editor/Series/PieEditor.cs index 7a66372f..f8e19be5 100644 --- a/Editor/Series/PieEditor.cs +++ b/Editor/Series/PieEditor.cs @@ -18,6 +18,7 @@ namespace XCharts.Editor PropertyField("m_RoundCap"); PropertyField("m_Ignore"); PropertyField("m_IgnoreValue"); + PropertyField("m_ClickOffset"); }); PropertyField("m_ItemStyle"); PropertyField("m_Animation"); diff --git a/Examples/Example30_PieChart.cs b/Examples/Example30_PieChart.cs index e6e5f912..a92d19b7 100644 --- a/Examples/Example30_PieChart.cs +++ b/Examples/Example30_PieChart.cs @@ -64,7 +64,7 @@ namespace XCharts.Example chart.AddData(0, 135, "视频广告"); chart.AddData(0, 1548, "搜索引擎"); - chart.onPointerClickPie = delegate (PointerEventData e, int serieIndex, int dataIndex) + chart.onSerieClick = delegate (SerieEventData data) { }; diff --git a/Examples/Example_Test.cs b/Examples/Example_Test.cs index 33018a71..b70b7c5c 100644 --- a/Examples/Example_Test.cs +++ b/Examples/Example_Test.cs @@ -1,4 +1,5 @@ using UnityEngine; +using UnityEngine.EventSystems; using UnityEngine.UI; using XCharts.Runtime; #if INPUT_SYSTEM_ENABLED @@ -14,6 +15,9 @@ namespace XCharts.Example void Awake() { chart = gameObject.GetComponent<BaseChart>(); + chart.onSerieClick = OnPointerClickLine; + chart.onSerieEnter = OnPointerEnterLine; + chart.onSerieExit = OnPointerExitLine; var btnTrans = transform.parent.Find("Button"); if (btnTrans) { @@ -21,6 +25,21 @@ namespace XCharts.Example } } + void OnPointerClickLine(SerieEventData data) + { + Debug.Log("OnPointerClick: " + data.serieIndex+ " " + data.dataIndex +" "+ data.dimension); + } + + void OnPointerEnterLine(SerieEventData data) + { + Debug.Log("OnPointerEnter: " + data.serieIndex + " " + data.dataIndex + " " + data.dimension); + } + + void OnPointerExitLine(SerieEventData data) + { + Debug.Log("OnPointerExit: " + data.serieIndex + " " + data.dataIndex + " " + data.dimension); + } + void Update() { if (Input.GetKeyDown(KeyCode.Space)) diff --git a/README.md b/README.md index b1bf2f3c..4bf30cd0 100644 --- a/README.md +++ b/README.md @@ -18,27 +18,27 @@ <a href="https://github.com/XCharts-Team/XCharts/releases"> <img src="https://img.shields.io/github/v/release/XCharts-Team/XCharts?include_prereleases"></img> </a> - <a href=""> + <a href="https://github.com/XCharts-Team/XCharts"> <img src="https://img.shields.io/github/repo-size/monitor1394/unity-ugui-xcharts"></img> </a> - <a href=""> + <a href="https://github.com/XCharts-Team/XCharts"> <img src="https://img.shields.io/github/languages/code-size/monitor1394/unity-ugui-xcharts"></img> </a> - <a href=""> + <a href="https://xcharts-team.github.io/docs/tutorial01"> <img src="https://img.shields.io/badge/Unity-5.6+-green"></img> </a> - <a href=""> + <a href="https://xcharts-team.github.io/docs/tutorial01"> <img src="https://img.shields.io/badge/TextMeshPro-YES-green"></img> </a> </p> <p align="center"> - <a href=""> + <a href="https://github.com/XCharts-Team/XCharts/stargazers"> <img src="https://img.shields.io/github/stars/XCharts-Team/XCharts?style=social"></img> </a> - <a href=""> + <a href="https://github.com/XCharts-Team/XCharts/forks"> <img src="https://img.shields.io/github/forks/XCharts-Team/XCharts?style=social"></img> </a> - <a href=""> + <a href="https://github.com/XCharts-Team/XCharts/issues"> <img src="https://img.shields.io/github/issues-closed/XCharts-Team/XCharts?color=green&label=%20%20%20%20issues&logoColor=green&style=social"></img> </a> </p> diff --git a/Runtime/Internal/BaseChart.API.cs b/Runtime/Internal/BaseChart.API.cs index 76c8c953..fb8cf4d0 100644 --- a/Runtime/Internal/BaseChart.API.cs +++ b/Runtime/Internal/BaseChart.API.cs @@ -104,21 +104,48 @@ namespace XCharts.Runtime /// </summary> public CustomDrawGaugePointerFunction customDrawGaugePointerFunction { set { m_CustomDrawGaugePointerFunction = value; } get { return m_CustomDrawGaugePointerFunction; } } /// <summary> + /// the callback function of pointer click serie. + /// |鼠标点击Serie回调。 + /// </summary> + [Since("v3.6.0")] + public Action<SerieEventData> onSerieClick { set { m_OnSerieClick = value; m_ForceOpenRaycastTarget = true; } get { return m_OnSerieClick; } } + /// <summary> + /// the callback function of pointer down serie. + /// |鼠标按下Serie回调。 + /// </summary> + [Since("v3.6.0")] + public Action<SerieEventData> onSerieDown { set { m_OnSerieDown = value; m_ForceOpenRaycastTarget = true; } get { return m_OnSerieDown; } } + /// <summary> + /// the callback function of pointer enter serie. + /// |鼠标进入Serie回调。 + /// </summary> + [Since("v3.6.0")] + public Action<SerieEventData> onSerieEnter { set { m_OnSerieEnter = value; m_ForceOpenRaycastTarget = true; } get { return m_OnSerieEnter; } } + /// <summary> + /// the callback function of pointer exit serie. + /// |鼠标离开Serie回调。 + /// </summary> + [Since("v3.6.0")] + public Action<SerieEventData> onSerieExit { set { m_OnSerieExit = value; m_ForceOpenRaycastTarget = true; } get { return m_OnSerieExit; } } + /// <summary> /// the callback function of pointer click pie area. /// |点击饼图区域回调。参数:PointerEventData,SerieIndex,SerieDataIndex /// </summary> - public Action<PointerEventData, int, int> onPointerClickPie { set { m_OnPointerClickPie = value; m_ForceOpenRaycastTarget = true; } get { return m_OnPointerClickPie; } } + [Obsolete("Use \"onSerieClick\" instead", true)] + public Action<PointerEventData, int, int> onPointerClickPie { get; set; } /// <summary> /// the callback function of pointer enter pie area. /// |鼠标进入和离开饼图区域回调,SerieDataIndex为-1时表示离开。参数:PointerEventData,SerieIndex,SerieDataIndex /// </summary> [Since("v3.3.0")] + [Obsolete("Use \"onSerieEnter\" instead", true)] public Action<int, int> onPointerEnterPie { set { m_OnPointerEnterPie = value; m_ForceOpenRaycastTarget = true; } get { return m_OnPointerEnterPie; } } /// <summary> /// the callback function of click bar. /// |点击柱形图柱条回调。参数:eventData, dataIndex /// </summary> - public Action<PointerEventData, int> onPointerClickBar { set { m_OnPointerClickBar = value; m_ForceOpenRaycastTarget = true; } get { return m_OnPointerClickBar; } } + [Obsolete("Use \"onSerieClick\" instead", true)] + public Action<PointerEventData, int> onPointerClickBar { get; set; } /// <summary> /// 坐标轴变更数据索引时回调。参数:axis, dataIndex/dataValue /// </summary> diff --git a/Runtime/Internal/BaseChart.cs b/Runtime/Internal/BaseChart.cs index 3d90a2d3..46b3d4f9 100644 --- a/Runtime/Internal/BaseChart.cs +++ b/Runtime/Internal/BaseChart.cs @@ -89,9 +89,11 @@ namespace XCharts.Runtime protected Action<VertexHelper> m_OnDrawTop; protected Action<VertexHelper, Serie> m_OnDrawSerieBefore; protected Action<VertexHelper, Serie> m_OnDrawSerieAfter; - protected Action<PointerEventData, int, int> m_OnPointerClickPie; + protected Action<SerieEventData> m_OnSerieClick; + protected Action<SerieEventData> m_OnSerieDown; + protected Action<SerieEventData> m_OnSerieEnter; + protected Action<SerieEventData> m_OnSerieExit; protected Action<int, int> m_OnPointerEnterPie; - protected Action<PointerEventData, int> m_OnPointerClickBar; protected Action<Axis, double> m_OnAxisPointerValueChanged; protected Action<Legend, int, string, bool> m_OnLegendClick; protected Action<Legend, int, string> m_OnLegendEnter; diff --git a/Runtime/Internal/BaseGraph.cs b/Runtime/Internal/BaseGraph.cs index d5481354..b9ffb696 100644 --- a/Runtime/Internal/BaseGraph.cs +++ b/Runtime/Internal/BaseGraph.cs @@ -228,7 +228,7 @@ namespace XCharts.Runtime protected virtual void CheckRefreshChart() { - if (m_RefreshChart) + if (m_RefreshChart && m_Painter != null) { m_Painter.Refresh(); m_RefreshChart = false; @@ -237,6 +237,7 @@ namespace XCharts.Runtime protected virtual void CheckRefreshPainter() { + if (m_Painter == null) return; m_Painter.CheckRefresh(); } diff --git a/Runtime/Internal/Misc/SerieEventData.cs b/Runtime/Internal/Misc/SerieEventData.cs new file mode 100644 index 00000000..4d3ff773 --- /dev/null +++ b/Runtime/Internal/Misc/SerieEventData.cs @@ -0,0 +1,46 @@ +using UnityEngine; + +namespace XCharts.Runtime +{ + /// <summary> + /// the data of serie event. + /// |serie事件的数据。 + /// </summary> + public class SerieEventData + { + /// <summary> + /// the position of pointer in chart. + /// |鼠标在chart中的位置。 + /// </summary> + public Vector3 pointerPos { get; set; } + /// <summary> + /// the index of serie in chart.series. + /// |在chart.series中的索引。 + /// </summary> + public int serieIndex { get; set; } + /// <summary> + /// the index of data in serie.data. + /// |在serie.data中的索引。 + /// </summary> + public int dataIndex { get; set; } + /// <summary> + /// the dimension of data. + /// |数据的维度。 + /// </summary> + public int dimension { get; set; } + /// <summary> + /// the value of data. + /// |数据的值。 + /// </summary> + public double value { get; set; } + + public void Reset() + { + serieIndex = -1; + dataIndex = -1; + dimension = -1; + value = 0; + pointerPos = Vector3.zero; + } + } +} \ No newline at end of file diff --git a/Runtime/Internal/Misc/SerieEventData.cs.meta b/Runtime/Internal/Misc/SerieEventData.cs.meta new file mode 100644 index 00000000..8d23ec0c --- /dev/null +++ b/Runtime/Internal/Misc/SerieEventData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fdfaa773d93294d78b2fb4b8f42708a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Internal/Pools/SerieEventDataPool.cs b/Runtime/Internal/Pools/SerieEventDataPool.cs new file mode 100644 index 00000000..899d51f0 --- /dev/null +++ b/Runtime/Internal/Pools/SerieEventDataPool.cs @@ -0,0 +1,33 @@ +using UnityEngine; + +namespace XCharts.Runtime +{ + public static class SerieEventDataPool + { + private static readonly ObjectPool<SerieEventData> s_ListPool = new ObjectPool<SerieEventData>(null, OnClear); + + static void OnGet(SerieEventData data) + { + } + + static void OnClear(SerieEventData data) + { + data.Reset(); + } + + public static SerieEventData Get(Vector3 pos, int serieIndex, int dataIndex, int dimension, double value) + { + var data = s_ListPool.Get(); + data.serieIndex = serieIndex; + data.dataIndex = dataIndex; + data.pointerPos = pos; + data.dimension = dimension; + return data; + } + + public static void Release(SerieEventData toRelease) + { + s_ListPool.Release(toRelease); + } + } +} \ No newline at end of file diff --git a/Runtime/Internal/Pools/SerieEventDataPool.cs.meta b/Runtime/Internal/Pools/SerieEventDataPool.cs.meta new file mode 100644 index 00000000..40316cc8 --- /dev/null +++ b/Runtime/Internal/Pools/SerieEventDataPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 30d123dd5c38446f18183f50336322bb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index f2894d03..8578120e 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -161,11 +161,11 @@ namespace XCharts.Runtime { #if UNITY_EDITOR if (!Application.isPlaying) - GameObject.DestroyImmediate(component as GameObject, true); + GameObject.DestroyImmediate(component as UnityEngine.Object); else - GameObject.Destroy(component as GameObject); + GameObject.Destroy(component as UnityEngine.Object); #else - GameObject.Destroy(component as GameObject); + GameObject.Destroy(component as UnityEngine.Object); #endif } } @@ -389,6 +389,7 @@ namespace XCharts.Runtime var alignment = textStyle.GetAlignment(autoAlignment); UpdateAnchorAndPivotByTextAlignment(alignment, out anchorMin, out anchorMax, out pivot); var labelObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); + ChartHelper.RemoveComponent<Text>(labelObj); var label = EnsureComponent<ChartLabel>(labelObj); label.text = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme, autoColor, autoAlignment, label.text); diff --git a/Runtime/Serie/Bar/BarHandler.cs b/Runtime/Serie/Bar/BarHandler.cs index 3f8c5707..bde1fcc3 100644 --- a/Runtime/Serie/Bar/BarHandler.cs +++ b/Runtime/Serie/Bar/BarHandler.cs @@ -78,16 +78,6 @@ namespace XCharts.Runtime } } - public override void OnPointerDown(PointerEventData eventData) - { - if (!serie.context.pointerEnter) return; - if (serie.context.pointerItemDataIndex < 0) return; - if (chart.onPointerClickBar != null) - { - chart.onPointerClickBar(eventData, serie.context.pointerItemDataIndex); - } - } - private void UpdateSerieGridContext() { if (m_SerieGrid == null) @@ -240,7 +230,7 @@ namespace XCharts.Runtime if (isPercentStack) { var valueTotal = chart.GetSerieSameStackTotalValue<Bar>(serie.stack, i); - barHig = valueTotal != 0 ? (float) (relativedValue / valueTotal * relativedAxisLength) : 0; + barHig = valueTotal != 0 ? (float)(relativedValue / valueTotal * relativedAxisLength) : 0; } else { @@ -314,7 +304,7 @@ namespace XCharts.Runtime if (axis.context.minMaxRange <= 0) pY = grid.context.y; else { - var valueLen = (float) ((value - axis.context.minValue) / axis.context.minMaxRange) * grid.context.height; + var valueLen = (float)((value - axis.context.minValue) / axis.context.minMaxRange) * grid.context.height; pY = grid.context.y + valueLen - categoryWidth * 0.5f; } } @@ -336,7 +326,7 @@ namespace XCharts.Runtime if (axis.context.minMaxRange <= 0) pX = grid.context.x; else { - var valueLen = (float) ((value - axis.context.minValue) / axis.context.minMaxRange) * grid.context.width; + var valueLen = (float)((value - axis.context.minValue) / axis.context.minMaxRange) * grid.context.width; pX = grid.context.x + valueLen - categoryWidth * 0.5f; } } diff --git a/Runtime/Serie/Bar/SimplifiedBarHandler.cs b/Runtime/Serie/Bar/SimplifiedBarHandler.cs index c70f4a7c..508481fe 100644 --- a/Runtime/Serie/Bar/SimplifiedBarHandler.cs +++ b/Runtime/Serie/Bar/SimplifiedBarHandler.cs @@ -14,7 +14,6 @@ namespace XCharts.Runtime public override void Update() { base.Update(); - UpdateSerieContext(); } public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category, @@ -30,7 +29,7 @@ namespace XCharts.Runtime DrawBarSerie(vh, serie, serie.context.colorIndex); } - private void UpdateSerieContext() + public override void UpdateSerieContext() { if (m_SerieGrid == null) return; diff --git a/Runtime/Serie/Heatmap/HeatmapHandler.cs b/Runtime/Serie/Heatmap/HeatmapHandler.cs index 45984f16..262a908a 100644 --- a/Runtime/Serie/Heatmap/HeatmapHandler.cs +++ b/Runtime/Serie/Heatmap/HeatmapHandler.cs @@ -27,10 +27,6 @@ namespace XCharts.Runtime public override void Update() { base.Update(); - if (serie.IsUseCoord<GridCoord>()) - UpdateSerieContext(); - else if (serie.IsUseCoord<PolarCoord>()) - UpdateSeriePolarContext(); } public override void DrawSerie(VertexHelper vh) @@ -97,7 +93,7 @@ namespace XCharts.Runtime { var xAxis = chart.GetChartComponent<XAxis>(serie.xAxisIndex); if (xAxis != null) - category = xAxis.GetData((int) serieData.GetData(0)); + category = xAxis.GetData((int)serieData.GetData(0)); } title = serie.serieName; @@ -121,7 +117,15 @@ namespace XCharts.Runtime } } - private void UpdateSerieContext() + public override void UpdateSerieContext() + { + if (serie.IsUseCoord<GridCoord>()) + UpdateSerieGridContext(); + else if (serie.IsUseCoord<PolarCoord>()) + UpdateSeriePolarContext(); + } + + private void UpdateSerieGridContext() { if (m_SerieGrid == null) return; diff --git a/Runtime/Serie/Line/LineHandler.cs b/Runtime/Serie/Line/LineHandler.cs index 10a5c5be..6ff1865c 100644 --- a/Runtime/Serie/Line/LineHandler.cs +++ b/Runtime/Serie/Line/LineHandler.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Text; using UnityEngine; +using UnityEngine.EventSystems; using UnityEngine.UI; using XUGL; @@ -69,7 +70,7 @@ namespace XCharts.Runtime var endLabelList = m_SerieGrid.context.endLabelList; if (endLabelList.Count <= 1) return; - endLabelList.Sort(delegate(ChartLabel a, ChartLabel b) + endLabelList.Sort(delegate (ChartLabel a, ChartLabel b) { if (a == null || b == null) return 1; return b.transform.position.y.CompareTo(a.transform.position.y); @@ -96,5 +97,27 @@ namespace XCharts.Runtime } } } + + public override int GetPointerItemDataIndex() + { + var symbolSize = SerieHelper.GetSysmbolSize(serie, null, chart.theme, chart.theme.serie.lineSymbolSize) * 1.5f; + var count = serie.context.dataPoints.Count; + for (int i = 0; i < count; i++) + { + var index = serie.context.dataIndexs[i]; + var serieData = serie.GetSerieData(index); + if (serieData == null) + continue; + if (serieData.context.isClip) + continue; + + var pos = serie.context.dataPoints[i]; + if (Vector2.Distance(pos, chart.pointerPos) < symbolSize) + { + return i; + } + } + return -1; + } } } \ No newline at end of file diff --git a/Runtime/Serie/Line/SimplifiedLineHandler.cs b/Runtime/Serie/Line/SimplifiedLineHandler.cs index d480010b..2e84beea 100644 --- a/Runtime/Serie/Line/SimplifiedLineHandler.cs +++ b/Runtime/Serie/Line/SimplifiedLineHandler.cs @@ -15,7 +15,6 @@ namespace XCharts.Runtime public override void Update() { base.Update(); - UpdateSerieContext(); } public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category, @@ -31,7 +30,7 @@ namespace XCharts.Runtime DrawLineSerie(vh, serie); } - private void UpdateSerieContext() + public override void UpdateSerieContext() { if (m_SerieGrid == null) return; diff --git a/Runtime/Serie/Parallel/ParallelHandler.cs b/Runtime/Serie/Parallel/ParallelHandler.cs index 26a5be3b..5c957c1d 100644 --- a/Runtime/Serie/Parallel/ParallelHandler.cs +++ b/Runtime/Serie/Parallel/ParallelHandler.cs @@ -11,7 +11,6 @@ namespace XCharts.Runtime public override void Update() { base.Update(); - UpdateSerieContext(); } public override void DrawSerie(VertexHelper vh) @@ -19,8 +18,6 @@ namespace XCharts.Runtime DrawParallelSerie(vh, serie); } - private void UpdateSerieContext() { } - private void DrawParallelSerie(VertexHelper vh, Parallel serie) { if (!serie.show) return; diff --git a/Runtime/Serie/Pie/PieHandler.cs b/Runtime/Serie/Pie/PieHandler.cs index 654403c1..f58b9aa2 100644 --- a/Runtime/Serie/Pie/PieHandler.cs +++ b/Runtime/Serie/Pie/PieHandler.cs @@ -12,7 +12,6 @@ namespace XCharts.Runtime public override void Update() { base.Update(); - UpdateSerieContext(); } public override void DrawBase(VertexHelper vh) @@ -79,32 +78,28 @@ namespace XCharts.Runtime public override void OnPointerDown(PointerEventData eventData) { - if (!chart.HasSerie<Pie>()) return; if (chart.pointerPos == Vector2.zero) return; + var dataIndex = GetPiePosIndex(serie, chart.pointerPos); var refresh = false; - for (int i = 0; i < chart.series.Count; i++) + if (dataIndex >= 0) { - var serie = chart.GetSerie(i); - if (!(serie is Pie)) continue; - var index = GetPiePosIndex(serie, chart.pointerPos); - if (index >= 0) + refresh = true; + for (int j = 0; j < serie.data.Count; j++) { - refresh = true; - for (int j = 0; j < serie.data.Count; j++) - { - if (j == index) serie.data[j].context.selected = !serie.data[j].context.selected; - else serie.data[j].context.selected = false; - } - if (chart.onPointerClickPie != null) - { - chart.onPointerClickPie(eventData, i, index); - } + if (j == dataIndex) serie.data[j].context.selected = !serie.data[j].context.selected; + else serie.data[j].context.selected = false; } } if (refresh) chart.RefreshChart(); + base.OnPointerDown(eventData); } - private void UpdateSerieContext() + public override int GetPointerItemDataIndex() + { + return GetPiePosIndex(serie, chart.pointerPos); + } + + public override void UpdateSerieContext() { var needCheck = m_LegendEnter || (chart.isPointerInChart && PointerIsInPieSerie(serie, chart.pointerPos)); var needInteract = false; @@ -123,14 +118,8 @@ namespace XCharts.Runtime serieData.context.highlight = false; serieData.interact.SetValueAndColor(ref needInteract, serieData.context.outsideRadius, color, toColor); } - if (chart.onPointerEnterPie != null) - { - chart.onPointerEnterPie(serie.index, serie.context.pointerItemDataIndex); - } if (needInteract) - { chart.RefreshPainter(serie); - } } return; } @@ -138,6 +127,7 @@ namespace XCharts.Runtime var lastPointerItemDataIndex = serie.context.pointerItemDataIndex; var dataIndex = GetPiePosIndex(serie, chart.pointerPos); serie.context.pointerItemDataIndex = -1; + serie.context.pointerEnter = dataIndex >= 0; for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; @@ -162,10 +152,6 @@ namespace XCharts.Runtime if (lastPointerItemDataIndex != serie.context.pointerItemDataIndex) { needInteract = true; - if (chart.onPointerEnterPie != null) - { - chart.onPointerEnterPie(serie.index, serie.context.pointerItemDataIndex); - } } if (needInteract) { @@ -220,21 +206,21 @@ namespace XCharts.Runtime } float degree = serie.pieRoseType == RoseType.Area ? (totalDegree / showdataCount) : - (float) (totalDegree * value / dataTotalFilterMinAngle); + (float)(totalDegree * value / dataTotalFilterMinAngle); if (serie.minAngle > 0 && degree < serie.minAngle) degree = serie.minAngle; serieData.context.toAngle = startDegree + degree; if (serieData.radius > 0) serieData.context.outsideRadius = ChartHelper.GetActualValue(serieData.radius, Mathf.Min(chart.chartWidth, chart.chartHeight)); else serieData.context.outsideRadius = serie.pieRoseType > 0 ? - serie.context.insideRadius + (float) ((serie.context.outsideRadius - serie.context.insideRadius) * value / serie.context.dataMax) : + serie.context.insideRadius + (float)((serie.context.outsideRadius - serie.context.insideRadius) * value / serie.context.dataMax) : serie.context.outsideRadius; if (serieData.context.highlight) { serieData.context.outsideRadius += chart.theme.serie.pieTooltipExtraRadius; } var offset = 0f; - if (serie.pieClickOffset && serieData.selected) + if (serie.pieClickOffset && (serieData.selected || serieData.context.selected)) { offset += chart.theme.serie.pieSelectedOffset; } @@ -258,7 +244,7 @@ namespace XCharts.Runtime serieData.context.offsetRadius = 0; serieData.context.insideRadius -= serieData.context.offsetRadius; serieData.context.outsideRadius -= serieData.context.offsetRadius; - if (serie.pieClickOffset && serieData.selected) + if (serie.pieClickOffset && (serieData.selected || serieData.context.selected)) { serieData.context.offsetRadius += chart.theme.serie.pieSelectedOffset; if (serieData.context.insideRadius > 0) @@ -350,7 +336,7 @@ namespace XCharts.Runtime serieData.interact.SetValueAndColor(ref interacting, outsideRadius, color, toColor); } - if (serie.pieClickOffset && serieData.selected) + if (serie.pieClickOffset && (serieData.selected || serieData.context.selected)) { var drawEndDegree = serieData.context.currentAngle; var needRoundCap = serie.roundCap && insideRadius > 0; @@ -493,7 +479,7 @@ namespace XCharts.Runtime } var diffAngle = (currAngle - startAngle) % 360; var isLeft = diffAngle > 180 || (diffAngle == 0 && serieData.context.startAngle > 0); - var pos5X = isLeft?pos2.x - labelLine.lineLength2 : pos2.x + labelLine.lineLength2; + var pos5X = isLeft ? pos2.x - labelLine.lineLength2 : pos2.x + labelLine.lineLength2; var pos5 = new Vector3(pos5X, pos2.y); var angle = Vector3.Angle(pos1 - center, pos2 - pos1); if (angle > 15) @@ -538,7 +524,7 @@ namespace XCharts.Runtime var serieData = serie.data[i]; if (angle >= serieData.context.startAngle && angle <= serieData.context.toAngle) { - var ndist = serieData.selected ? + var ndist = (serieData.selected || serieData.context.selected) ? Vector2.Distance(local, serieData.context.offsetCenter) : dist; if (ndist >= serieData.context.insideRadius && ndist <= serieData.context.outsideRadius) diff --git a/Runtime/Serie/Radar/RadarHandler.cs b/Runtime/Serie/Radar/RadarHandler.cs index 8fb0d2fb..d43a6667 100644 --- a/Runtime/Serie/Radar/RadarHandler.cs +++ b/Runtime/Serie/Radar/RadarHandler.cs @@ -12,7 +12,6 @@ namespace XCharts.Runtime public override void Update() { base.Update(); - UpdateSerieContext(); } public override void DrawSerie(VertexHelper vh) @@ -86,22 +85,33 @@ namespace XCharts.Runtime } } - private void UpdateSerieContext() + public override void UpdateSerieContext() { var needCheck = m_LegendEnter || (chart.isPointerInChart && (m_RadarCoord != null && m_RadarCoord.IsPointerEnter())); var needInteract = false; - var needHideAll = false; if (!needCheck) { - if (m_LastCheckContextFlag == needCheck) - return; - needHideAll = true; + if (m_LastCheckContextFlag != needCheck) + { + m_LastCheckContextFlag = needCheck; + serie.context.pointerItemDataIndex = -1; + serie.context.pointerItemDataDimension = -1; + serie.context.pointerEnter = false; + foreach (var serieData in serie.data) + { + serieData.context.highlight = false; + serieData.interact.Reset(); + } + chart.RefreshPainter(serie); + } + return; } m_LastCheckContextFlag = needCheck; serie.highlight = false; serie.context.pointerEnter = false; serie.context.pointerItemDataIndex = -1; + serie.context.pointerItemDataDimension = -1; var areaStyle = serie.areaStyle; var themeSymbolSize = chart.theme.serie.lineSymbolSize; switch (serie.radarType) @@ -112,21 +122,23 @@ namespace XCharts.Runtime var serieData = serie.data[i]; var symbol = SerieHelper.GetSerieSymbol(serie, serieData); var symbolSize = symbol.GetSize(serieData.data, chart.theme.serie.lineSymbolSize); - if (needHideAll || m_LegendEnter) + if (m_LegendEnter) { - serieData.context.highlight = needHideAll ? false : true; + serieData.context.highlight = true; serieData.interact.SetValue(ref needInteract, symbolSize, serieData.context.highlight); } else { serieData.context.highlight = false; - foreach (var pos in serieData.context.dataPoints) + for (int n = 0; n < serieData.context.dataPoints.Count; n++) { + var pos = serieData.context.dataPoints[n]; if (Vector3.Distance(chart.pointerPos, pos) < symbolSize * 2) { serie.highlight = true; serie.context.pointerEnter = true; serie.context.pointerItemDataIndex = i; + serie.context.pointerItemDataDimension = n; serieData.context.highlight = true; break; } @@ -144,6 +156,7 @@ namespace XCharts.Runtime serie.highlight = true; serie.context.pointerEnter = true; serie.context.pointerItemDataIndex = i; + serie.context.pointerItemDataDimension = n; serieData.context.highlight = true; break; } @@ -163,6 +176,7 @@ namespace XCharts.Runtime { serie.context.pointerEnter = true; serie.context.pointerItemDataIndex = i; + serie.context.pointerItemDataDimension = 1; serieData.context.highlight = true; needInteract = true; } @@ -183,6 +197,7 @@ namespace XCharts.Runtime { serie.context.pointerEnter = true; serie.context.pointerItemDataIndex = n; + serie.context.pointerItemDataDimension = 1; p1.context.highlight = true; needInteract = true; break; @@ -264,7 +279,7 @@ namespace XCharts.Runtime max = serie.context.dataMax; } } - var radius = (float) (m_RadarCoord.context.dataRadius * (value - min) / (max - min)); + var radius = (float)(m_RadarCoord.context.dataRadius * (value - min) / (max - min)); var currAngle = startAngle + (n + (m_RadarCoord.positionType == RadarCoord.PositionType.Between ? 0.5f : 0)) * angle; radius *= rate; if (n == 0) @@ -380,7 +395,7 @@ namespace XCharts.Runtime } var lineStyle = SerieHelper.GetLineStyle(serie, serieData); Color32 areaColor, areaToColor; - var colorIndex = serie.colorByData?j : serie.context.colorIndex; + var colorIndex = serie.colorByData ? j : serie.context.colorIndex; var showArea = SerieHelper.GetAreaColor(out areaColor, out areaToColor, serie, serieData, chart.theme, colorIndex - 1); var lineColor = SerieHelper.GetLineColor(serie, serieData, chart.theme, colorIndex); int dataCount = m_RadarCoord.indicatorList.Count; @@ -397,7 +412,7 @@ namespace XCharts.Runtime { lineColor = m_RadarCoord.outRangeColor; } - var radius = (float) (max < 0 ? m_RadarCoord.context.dataRadius - m_RadarCoord.context.dataRadius * value / max : + var radius = (float)(max < 0 ? m_RadarCoord.context.dataRadius - m_RadarCoord.context.dataRadius * value / max : m_RadarCoord.context.dataRadius * value / max); var currAngle = startAngle + (index + (m_RadarCoord.positionType == RadarCoord.PositionType.Between ? 0.5f : 0)) * angle; radius *= rate; diff --git a/Runtime/Serie/Ring/RingHandler.cs b/Runtime/Serie/Ring/RingHandler.cs index 08fdcd29..f31021e9 100644 --- a/Runtime/Serie/Ring/RingHandler.cs +++ b/Runtime/Serie/Ring/RingHandler.cs @@ -16,10 +16,9 @@ namespace XCharts.Runtime public override void Update() { base.Update(); - UpdateSerieContext(); } - private void UpdateSerieContext() + public override void UpdateSerieContext() { var needCheck = chart.isPointerInChart || m_LegendEnter; var needInteract = false; diff --git a/Runtime/Serie/Scatter/BaseScatterHandler.cs b/Runtime/Serie/Scatter/BaseScatterHandler.cs index eb0b895a..6be8113c 100644 --- a/Runtime/Serie/Scatter/BaseScatterHandler.cs +++ b/Runtime/Serie/Scatter/BaseScatterHandler.cs @@ -13,7 +13,6 @@ namespace XCharts.Runtime public override void Update() { base.Update(); - UpdateSerieContext(); } public override void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category, @@ -63,7 +62,7 @@ namespace XCharts.Runtime } } - private void UpdateSerieContext() + public override void UpdateSerieContext() { var needCheck = m_LegendEnter || (chart.isPointerInChart && (m_Grid == null || m_Grid.IsPointerEnter())); diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index 1f0e47ce..31b9b02d 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -309,6 +309,27 @@ namespace XCharts.Runtime [NonSerialized] public List<SerieData> m_FilterData = new List<SerieData>(); [NonSerialized] private bool m_NameDirty; + /// <summary> + /// event callback when click serie. + /// |点击系列时的回调。 + /// </summary> + public Action<SerieEventData> onClick { get; set; } + /// <summary> + /// event callback when mouse down on serie. + /// |鼠标按下时的回调。 + /// </summary> + public Action<SerieEventData> onDown { get; set; } + /// <summary> + /// event callback when mouse enter serie. + /// |鼠标进入时的回调。 + /// </summary> + public Action<SerieEventData> onEnter { get; set; } + /// <summary> + /// event callback when mouse leave serie. + /// |鼠标离开时的回调。 + /// </summary> + public Action<SerieEventData> onExit { get; set; } + /// <summary> /// The index of serie. /// |系列索引。 diff --git a/Runtime/Serie/SerieContext.cs b/Runtime/Serie/SerieContext.cs index 4408e499..12b98f0d 100644 --- a/Runtime/Serie/SerieContext.cs +++ b/Runtime/Serie/SerieContext.cs @@ -26,6 +26,10 @@ namespace XCharts.Runtime /// </summary> public int pointerItemDataIndex = -1; /// <summary> + /// 鼠标当前指示的数据项维度 + /// </summary> + public int pointerItemDataDimension = 1; + /// <summary> /// 鼠标所在轴线上的数据项索引(可能有多个) /// </summary> public List<int> pointerAxisDataIndexs = new List<int>(); diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index 184983a3..65762406 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -31,14 +31,18 @@ namespace XCharts.Runtime public virtual void OnScroll(PointerEventData eventData) { } public virtual void RefreshLabelNextFrame() { } public virtual void RefreshLabelInternal() { } + public virtual void UpdateSerieContext() { } public virtual void UpdateTooltipSerieParams(int dataIndex, bool showCategory, string category, string marker, string itemFormatter, string numericFormatter, string ignoreDataDefaultContent, - ref List<SerieParams> paramList, ref string title) { } + ref List<SerieParams> paramList, ref string title) + { } public virtual void OnLegendButtonClick(int index, string legendName, bool show) { } public virtual void OnLegendButtonEnter(int index, string legendName) { } public virtual void OnLegendButtonExit(int index, string legendName) { } internal abstract void SetSerie(Serie serie); + public virtual int GetPointerItemDataIndex() { return -1; } + public virtual int GetPointerItemDataDimension() { return 1; } } public abstract class SerieHandler<T> : SerieHandler where T : Serie @@ -62,7 +66,7 @@ namespace XCharts.Runtime internal override void SetSerie(Serie serie) { - this.serie = (T) serie; + this.serie = (T)serie; this.serie.context.param.serieType = typeof(T); m_NeedInitComponent = true; AnimationStyleHelper.UpdateSerieAnimation(serie); @@ -121,6 +125,36 @@ namespace XCharts.Runtime serie.ResetInteract(); serie.ClearVerticesDirty(); } + UpdateSerieContextInternal(); + } + + private void UpdateSerieContextInternal() + { + var lastEnter = serie.context.pointerEnter; + var lastDataIndex = serie.context.pointerItemDataIndex; + UpdateSerieContext(); + if (lastEnter != serie.context.pointerEnter || lastDataIndex != serie.context.pointerItemDataIndex) + { + if (chart.onSerieEnter != null || chart.onSerieExit != null || serie.onEnter != null || serie.onExit != null) + { + var dataIndex = GetPointerItemDataIndex(); + var dimension = GetPointerItemDataDimension(); + var value = serie.GetData(dataIndex, dimension); + var data = SerieEventDataPool.Get(chart.pointerPos, serie.index, dataIndex, dimension, value); + if (serie.context.pointerEnter) + { + if (serie.onEnter != null) serie.onEnter(data); + if (chart.onSerieEnter != null) chart.onSerieEnter(data); + } + else + { + data.dataIndex = lastDataIndex; + if (serie.onExit != null) serie.onExit(data); + if (chart.onSerieExit != null) chart.onSerieExit(data); + } + SerieEventDataPool.Release(data); + } + } } public override void RefreshLabelNextFrame() @@ -289,7 +323,7 @@ namespace XCharts.Runtime return; } InitRoot(); - var dataAutoColor = (Color) chart.GetLegendRealShowNameColor(serie.legendName); + var dataAutoColor = (Color)chart.GetLegendRealShowNameColor(serie.legendName); m_EndLabel = ChartHelper.AddChartLabel(s_SerieEndLabelObjectName, m_SerieRoot.transform, serie.endLabel, chart.theme.common, "", dataAutoColor, TextAnchor.MiddleLeft); m_EndLabel.SetActive(serie.endLabel.show); @@ -493,7 +527,7 @@ namespace XCharts.Runtime var colorIndex = serie.colorByData ? serieData.index : serie.index; Color32 color, toColor; SerieHelper.GetItemColor(out color, out toColor, serie, serieData, chart.theme, colorIndex, SerieState.Normal, false); - return (Color) color; + return (Color)color; } protected void UpdateCoordSerieParams(ref List<SerieParams> paramList, ref string title, @@ -537,7 +571,7 @@ namespace XCharts.Runtime param.columns.Add(param.marker); param.columns.Add(showCategory ? category : serie.serieName); - param.columns.Add(ignore?ignoreDataDefaultContent : ChartCached.NumberToStr(param.value, param.numericFormatter)); + param.columns.Add(ignore ? ignoreDataDefaultContent : ChartCached.NumberToStr(param.value, param.numericFormatter)); paramList.Add(param); } @@ -566,7 +600,7 @@ namespace XCharts.Runtime return; if (colorIndex < 0) - colorIndex = serie.colorByData?dataIndex : chart.GetLegendRealShowNameIndex(serieData.name); + colorIndex = serie.colorByData ? dataIndex : chart.GetLegendRealShowNameIndex(serieData.name); Color32 color, toColor; SerieHelper.GetItemColor(out color, out toColor, serie, serieData, chart.theme, colorIndex, SerieState.Normal); @@ -580,7 +614,7 @@ namespace XCharts.Runtime param.dataCount = serie.dataCount; param.value = serieData.GetData(param.dimension); param.ignore = ignore; - param.total = serie.multiDimensionLabel? serieData.GetTotalData() : serie.GetDataTotal(defaultDimension); + param.total = serie.multiDimensionLabel ? serieData.GetTotalData() : serie.GetDataTotal(defaultDimension); param.color = color; param.marker = SerieHelper.GetItemMarker(serie, serieData, marker); param.itemFormatter = itemFormatter; @@ -590,7 +624,7 @@ namespace XCharts.Runtime param.columns.Add(param.marker); param.columns.Add(serieData.name); - param.columns.Add(ignore?ignoreDataDefaultContent : ChartCached.NumberToStr(param.value, param.numericFormatter)); + param.columns.Add(ignore ? ignoreDataDefaultContent : ChartCached.NumberToStr(param.value, param.numericFormatter)); paramList.Add(param); } @@ -613,5 +647,47 @@ namespace XCharts.Runtime chart.DrawSymbol(vh, symbol.type, symbol.size, 1, pos, color, color, ColorUtil.clearColor32, color, symbol.gap, null); } + + public override void OnPointerDown(PointerEventData eventData) + { + if (serie.onDown == null && chart.onSerieDown == null) return; + if (!serie.context.pointerEnter) return; + var dataIndex = GetPointerItemDataIndex(); + if (dataIndex < 0) return; + var dimension = GetPointerItemDataDimension(); + var value = serie.GetData(dataIndex, dimension); + var data = SerieEventDataPool.Get(chart.pointerPos, serie.index, dataIndex, dimension, value); + if (chart.onSerieDown != null) + chart.onSerieDown(data); + if (serie.onDown != null) + serie.onDown(data); + SerieEventDataPool.Release(data); + } + + public override void OnPointerClick(PointerEventData eventData) + { + if (serie.onClick == null && chart.onSerieClick == null) return; + if (!serie.context.pointerEnter) return; + var dataIndex = GetPointerItemDataIndex(); + if (dataIndex < 0) return; + var dimension = GetPointerItemDataDimension(); + var value = serie.GetData(dataIndex, dimension); + var data = SerieEventDataPool.Get(chart.pointerPos, serie.index, dataIndex, dimension, value); + if (chart.onSerieClick != null) + chart.onSerieClick(data); + if (serie.onClick != null) + serie.onClick(data); + SerieEventDataPool.Release(data); + } + + public override int GetPointerItemDataIndex() + { + return serie.context.pointerItemDataIndex; + } + + public override int GetPointerItemDataDimension() + { + return serie.context.pointerItemDataDimension; + } } } \ No newline at end of file From e0f4ed946df2613781ff1e31912fe707ec68edb5 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 9 Mar 2023 22:39:05 +0800 Subject: [PATCH 40/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=9E=E8=B0=83API?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/en/api.md | 28 ++++++++++++++++++++++++++++ Documentation~/zh/api.md | 28 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index 980de0cd..c212cd11 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -155,6 +155,24 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver |public method|description| |--|--| +| onAxisPointerValueChanged |public Action<Axis, double> onAxisPointerValueChanged<br/>坐标轴变更数据索引时回调。参数:axis, dataIndex/dataValue | +| onDraw |public Action<VertexHelper> onDraw<br/>自定义绘制回调。在绘制Serie前调用。 | +| onDrawAfterSerie |public Action<VertexHelper, Serie> onDrawAfterSerie<br/>自定义Serie绘制回调。在每个Serie绘制完后调用。 | +| onDrawBeforeSerie |public Action<VertexHelper, Serie> onDrawBeforeSerie<br/>自定义Serie绘制回调。在每个Serie绘制完前调用。 | +| onDrawTop |public Action<VertexHelper> onDrawTop<br/>自定义Top层绘制回调。在绘制Tooltip前调用。 | +| onDrawUpper |public Action<VertexHelper> onDrawUpper<br/>自定义Upper层绘制回调。在绘制Tooltip前调用。 | +| onInit |public Action onInit<br/>The callback function of chart init. | +| onLegendClick |public Action<Legend, int, string, bool> onLegendClick<br/>the callback function of click legend. | +| onLegendEnter |public Action<Legend, int, string> onLegendEnter<br/>the callback function of enter legend. | +| onLegendExit |public Action<Legend, int, string> onLegendExit<br/>the callback function of exit legend. | +| onPointerClickBar |public Action<PointerEventData, int> onPointerClickBar<br/>the callback function of click bar. | +| onPointerClickPie |public Action<PointerEventData, int, int> onPointerClickPie<br/>the callback function of pointer click pie area. | +| onPointerEnterPie |public Action<int, int> onPointerEnterPie<br/>the callback function of pointer enter pie area. | +| onSerieClick |public Action<SerieEventData> onSerieClick<br/>the callback function of pointer click serie. | +| onSerieDown |public Action<SerieEventData> onSerieDown<br/>the callback function of pointer down serie. | +| onSerieEnter |public Action<SerieEventData> onSerieEnter<br/>the callback function of pointer enter serie. | +| onSerieExit |public Action<SerieEventData> onSerieExit<br/>the callback function of pointer exit serie. | +| onUpdate |public Action onUpdate<br/>The callback function of chart update. | | AddChartComponent() |public MainComponent AddChartComponent(Type type)| | AddChartComponent<T>() |public T AddChartComponent<T>() where T : MainComponent| | AddChartComponentWhenNoExist<T>() |public T AddChartComponentWhenNoExist<T>() where T : MainComponent| @@ -325,6 +343,15 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandle |public method|description| |--|--| +| onBeginDrag |public Action<PointerEventData, BaseGraph> onBeginDrag<br/>鼠标开始拖拽回调。 | +| onDrag |public Action<PointerEventData, BaseGraph> onDrag<br/>鼠标拖拽回调。 | +| onEndDrag |public Action<PointerEventData, BaseGraph> onEndDrag<br/>鼠标结束拖拽回调。 | +| onPointerClick |public Action<PointerEventData, BaseGraph> onPointerClick<br/>鼠标点击回调。 | +| onPointerDown |public Action<PointerEventData, BaseGraph> onPointerDown<br/>鼠标按下回调。 | +| onPointerEnter |public Action<PointerEventData, BaseGraph> onPointerEnter<br/>鼠标进入回调。 | +| onPointerExit |public Action<PointerEventData, BaseGraph> onPointerExit<br/>鼠标退出回调。 | +| onPointerUp |public Action<PointerEventData, BaseGraph> onPointerUp<br/>鼠标弹起回调。 | +| onScroll |public Action<PointerEventData, BaseGraph> onScroll<br/>鼠标滚动回调。 | | CheckWarning() |public string CheckWarning()<br/>检测警告信息。 | | OnBeginDrag() |public virtual void OnBeginDrag(PointerEventData eventData)| | OnDrag() |public virtual void OnDrag(PointerEventData eventData)| @@ -719,6 +746,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) |public method|description| |--|--| +| onPopulateMesh |public Action<VertexHelper, Painter> onPopulateMesh| | CheckRefresh() |public void CheckRefresh()| | Init() |public void Init()| | Refresh() |public void Refresh()| diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 42d4dae3..ffb9d368 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -155,6 +155,24 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver |public method|description| |--|--| +| onAxisPointerValueChanged |public Action<Axis, double> onAxisPointerValueChanged<br/>坐标轴变更数据索引时回调。参数:axis, dataIndex/dataValue | +| onDraw |public Action<VertexHelper> onDraw<br/>自定义绘制回调。在绘制Serie前调用。 | +| onDrawAfterSerie |public Action<VertexHelper, Serie> onDrawAfterSerie<br/>自定义Serie绘制回调。在每个Serie绘制完后调用。 | +| onDrawBeforeSerie |public Action<VertexHelper, Serie> onDrawBeforeSerie<br/>自定义Serie绘制回调。在每个Serie绘制完前调用。 | +| onDrawTop |public Action<VertexHelper> onDrawTop<br/>自定义Top层绘制回调。在绘制Tooltip前调用。 | +| onDrawUpper |public Action<VertexHelper> onDrawUpper<br/>自定义Upper层绘制回调。在绘制Tooltip前调用。 | +| onInit |public Action onInit<br/>图表的初始化完成回调。 | +| onLegendClick |public Action<Legend, int, string, bool> onLegendClick<br/>点击图例按钮回调。参数:legendIndex, legendName, show | +| onLegendEnter |public Action<Legend, int, string> onLegendEnter<br/>鼠标进入图例回调。参数:legendIndex, legendName | +| onLegendExit |public Action<Legend, int, string> onLegendExit<br/>鼠标退出图例回调。参数:legendIndex, legendName | +| onPointerClickBar |public Action<PointerEventData, int> onPointerClickBar<br/>点击柱形图柱条回调。参数:eventData, dataIndex | +| onPointerClickPie |public Action<PointerEventData, int, int> onPointerClickPie<br/>点击饼图区域回调。参数:PointerEventData,SerieIndex,SerieDataIndex | +| onPointerEnterPie |public Action<int, int> onPointerEnterPie<br/>鼠标进入和离开饼图区域回调,SerieDataIndex为-1时表示离开。参数:PointerEventData,SerieIndex,SerieDataIndex | +| onSerieClick |public Action<SerieEventData> onSerieClick<br/>鼠标点击Serie回调。 | +| onSerieDown |public Action<SerieEventData> onSerieDown<br/>鼠标按下Serie回调。 | +| onSerieEnter |public Action<SerieEventData> onSerieEnter<br/>鼠标进入Serie回调。 | +| onSerieExit |public Action<SerieEventData> onSerieExit<br/>鼠标离开Serie回调。 | +| onUpdate |public Action onUpdate<br/>图表的Update回调。 | | AddChartComponent() |public MainComponent AddChartComponent(Type type)| | AddChartComponent<T>() |public T AddChartComponent<T>() where T : MainComponent| | AddChartComponentWhenNoExist<T>() |public T AddChartComponentWhenNoExist<T>() where T : MainComponent| @@ -325,6 +343,15 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandle |public method|description| |--|--| +| onBeginDrag |public Action<PointerEventData, BaseGraph> onBeginDrag<br/>鼠标开始拖拽回调。 | +| onDrag |public Action<PointerEventData, BaseGraph> onDrag<br/>鼠标拖拽回调。 | +| onEndDrag |public Action<PointerEventData, BaseGraph> onEndDrag<br/>鼠标结束拖拽回调。 | +| onPointerClick |public Action<PointerEventData, BaseGraph> onPointerClick<br/>鼠标点击回调。 | +| onPointerDown |public Action<PointerEventData, BaseGraph> onPointerDown<br/>鼠标按下回调。 | +| onPointerEnter |public Action<PointerEventData, BaseGraph> onPointerEnter<br/>鼠标进入回调。 | +| onPointerExit |public Action<PointerEventData, BaseGraph> onPointerExit<br/>鼠标退出回调。 | +| onPointerUp |public Action<PointerEventData, BaseGraph> onPointerUp<br/>鼠标弹起回调。 | +| onScroll |public Action<PointerEventData, BaseGraph> onScroll<br/>鼠标滚动回调。 | | CheckWarning() |public string CheckWarning()<br/>检测警告信息。 | | OnBeginDrag() |public virtual void OnBeginDrag(PointerEventData eventData)| | OnDrag() |public virtual void OnDrag(PointerEventData eventData)| @@ -719,6 +746,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) |public method|description| |--|--| +| onPopulateMesh |public Action<VertexHelper, Painter> onPopulateMesh| | CheckRefresh() |public void CheckRefresh()| | Init() |public void Init()| | Refresh() |public void Refresh()| From c6e38f20034dd8da50cf8e7b2886105dad07eaa7 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 9 Mar 2023 22:49:07 +0800 Subject: [PATCH 41/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0API=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E7=9A=84since?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/en/api.md | 1468 +++++++++++++++++++------------------- Documentation~/zh/api.md | 1468 +++++++++++++++++++------------------- 2 files changed, 1468 insertions(+), 1468 deletions(-) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index c212cd11..f5fa8f13 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -104,12 +104,12 @@ slug: /api ## AnimationStyleHelper -|public method|description| +|public method|since|description| |--|--| -| CheckDataAnimation() |public static float CheckDataAnimation(BaseChart chart, Serie serie, int dataIndex, float destProgress, float startPorgress = 0)| -| GetAnimationPosition() |public static bool GetAnimationPosition(AnimationStyle animation, bool isY, Vector3 lp, Vector3 cp, float progress, ref Vector3 ip)| -| UpdateAnimationType() |public static void UpdateAnimationType(AnimationStyle animation, AnimationType defaultType)| -| UpdateSerieAnimation() |public static void UpdateSerieAnimation(Serie serie)| +|CheckDataAnimation()||public static float CheckDataAnimation(BaseChart chart, Serie serie, int dataIndex, float destProgress, float startPorgress = 0)| +|GetAnimationPosition()||public static bool GetAnimationPosition(AnimationStyle animation, bool isY, Vector3 lp, Vector3 cp, float progress, ref Vector3 ip)| +|UpdateAnimationType()||public static void UpdateAnimationType(AnimationStyle animation, AnimationType defaultType)| +|UpdateSerieAnimation()||public static void UpdateSerieAnimation(Serie serie)| ## AxisContext @@ -121,29 +121,29 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) ## AxisHelper -|public method|description| +|public method|since|description| |--|--| -| AdjustCircleLabelPos() |public static void AdjustCircleLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| -| AdjustMinMaxValue() |public static void AdjustMinMaxValue(Axis axis, ref double minValue, ref double maxValue, bool needFormat, double ceilRate = 0)<br/>调整最大最小值 | -| AdjustRadiusAxisLabelPos() |public static void AdjustRadiusAxisLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| -| GetAxisLineArrowOffset() |public static float GetAxisLineArrowOffset(Axis axis)<br/>包含箭头偏移的轴线长度 | -| GetAxisPosition() |public static float GetAxisPosition(GridCoord grid, Axis axis, double value, int dataCount = 0, DataZoom dataZoom = null)| -| GetAxisPositionValue() |public static double GetAxisPositionValue(float xy, float axisLength, double axisRange, float axisStart, float axisOffset)| -| GetAxisPositionValue() |public static double GetAxisPositionValue(GridCoord grid, Axis axis, Vector3 pos)| -| GetAxisValueDistance() |public static float GetAxisValueDistance(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上相对起点的距离 | -| GetAxisValueLength() |public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上对应的长度 | -| GetAxisValuePosition() |public static float GetAxisValuePosition(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上的坐标位置 | -| GetAxisValueSplitIndex() |public static int GetAxisValueSplitIndex(Axis axis, double value, int totalSplitNumber = -1)<br/>获得数值value在坐标轴上对应的split索引 | -| GetAxisXOrY() |public static float GetAxisXOrY(GridCoord grid, Axis axis, Axis relativedAxis)| -| GetDataWidth() |public static float GetDataWidth(Axis axis, float coordinateWidth, int dataCount, DataZoom dataZoom)<br/>获得一个类目数据在坐标系中代表的宽度 | -| GetEachWidth() |public static float GetEachWidth(Axis axis, float coordinateWidth, DataZoom dataZoom = null)| -| GetScaleNumber() |public static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null)<br/>获得分割线条数 | -| GetScaleWidth() |public static float GetScaleWidth(Axis axis, float coordinateWidth, int index, DataZoom dataZoom = null)<br/>获得分割段宽度 | -| GetSplitNumber() |public static int GetSplitNumber(Axis axis, float coordinateWid, DataZoom dataZoom)<br/>获得分割段数 | -| GetTotalSplitGridNum() |public static int GetTotalSplitGridNum(Axis axis)<br/>获得分割网格个数,包含次刻度 | -| GetXAxisXOrY() |public static float GetXAxisXOrY(GridCoord grid, Axis xAxis, Axis relativedAxis)| -| GetYAxisXOrY() |public static float GetYAxisXOrY(GridCoord grid, Axis yAxis, Axis relativedAxis)| -| NeedShowSplit() |public static bool NeedShowSplit(Axis axis)| +|AdjustCircleLabelPos()||public static void AdjustCircleLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| +|AdjustMinMaxValue()||public static void AdjustMinMaxValue(Axis axis, ref double minValue, ref double maxValue, bool needFormat, double ceilRate = 0)<br/>调整最大最小值 | +|AdjustRadiusAxisLabelPos()||public static void AdjustRadiusAxisLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| +|GetAxisLineArrowOffset()||public static float GetAxisLineArrowOffset(Axis axis)<br/>包含箭头偏移的轴线长度 | +|GetAxisPosition()||public static float GetAxisPosition(GridCoord grid, Axis axis, double value, int dataCount = 0, DataZoom dataZoom = null)| +|GetAxisPositionValue()||public static double GetAxisPositionValue(float xy, float axisLength, double axisRange, float axisStart, float axisOffset)| +|GetAxisPositionValue()||public static double GetAxisPositionValue(GridCoord grid, Axis axis, Vector3 pos)| +|GetAxisValueDistance()||public static float GetAxisValueDistance(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上相对起点的距离 | +|GetAxisValueLength()||public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上对应的长度 | +|GetAxisValuePosition()||public static float GetAxisValuePosition(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上的坐标位置 | +|GetAxisValueSplitIndex()||public static int GetAxisValueSplitIndex(Axis axis, double value, int totalSplitNumber = -1)<br/>获得数值value在坐标轴上对应的split索引 | +|GetAxisXOrY()||public static float GetAxisXOrY(GridCoord grid, Axis axis, Axis relativedAxis)| +|GetDataWidth()||public static float GetDataWidth(Axis axis, float coordinateWidth, int dataCount, DataZoom dataZoom)<br/>获得一个类目数据在坐标系中代表的宽度 | +|GetEachWidth()||public static float GetEachWidth(Axis axis, float coordinateWidth, DataZoom dataZoom = null)| +|GetScaleNumber()||public static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null)<br/>获得分割线条数 | +|GetScaleWidth()||public static float GetScaleWidth(Axis axis, float coordinateWidth, int index, DataZoom dataZoom = null)<br/>获得分割段宽度 | +|GetSplitNumber()||public static int GetSplitNumber(Axis axis, float coordinateWid, DataZoom dataZoom)<br/>获得分割段数 | +|GetTotalSplitGridNum()||public static int GetTotalSplitGridNum(Axis axis)<br/>获得分割网格个数,包含次刻度 | +|GetXAxisXOrY()||public static float GetXAxisXOrY(GridCoord grid, Axis xAxis, Axis relativedAxis)| +|GetYAxisXOrY()||public static float GetYAxisXOrY(GridCoord grid, Axis yAxis, Axis relativedAxis)| +|NeedShowSplit()||public static bool NeedShowSplit(Axis axis)| ## BarChart @@ -153,222 +153,222 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver](#iserializationcallbackreceiver) -|public method|description| +|public method|since|description| |--|--| -| onAxisPointerValueChanged |public Action<Axis, double> onAxisPointerValueChanged<br/>坐标轴变更数据索引时回调。参数:axis, dataIndex/dataValue | -| onDraw |public Action<VertexHelper> onDraw<br/>自定义绘制回调。在绘制Serie前调用。 | -| onDrawAfterSerie |public Action<VertexHelper, Serie> onDrawAfterSerie<br/>自定义Serie绘制回调。在每个Serie绘制完后调用。 | -| onDrawBeforeSerie |public Action<VertexHelper, Serie> onDrawBeforeSerie<br/>自定义Serie绘制回调。在每个Serie绘制完前调用。 | -| onDrawTop |public Action<VertexHelper> onDrawTop<br/>自定义Top层绘制回调。在绘制Tooltip前调用。 | -| onDrawUpper |public Action<VertexHelper> onDrawUpper<br/>自定义Upper层绘制回调。在绘制Tooltip前调用。 | -| onInit |public Action onInit<br/>The callback function of chart init. | -| onLegendClick |public Action<Legend, int, string, bool> onLegendClick<br/>the callback function of click legend. | -| onLegendEnter |public Action<Legend, int, string> onLegendEnter<br/>the callback function of enter legend. | -| onLegendExit |public Action<Legend, int, string> onLegendExit<br/>the callback function of exit legend. | -| onPointerClickBar |public Action<PointerEventData, int> onPointerClickBar<br/>the callback function of click bar. | -| onPointerClickPie |public Action<PointerEventData, int, int> onPointerClickPie<br/>the callback function of pointer click pie area. | -| onPointerEnterPie |public Action<int, int> onPointerEnterPie<br/>the callback function of pointer enter pie area. | -| onSerieClick |public Action<SerieEventData> onSerieClick<br/>the callback function of pointer click serie. | -| onSerieDown |public Action<SerieEventData> onSerieDown<br/>the callback function of pointer down serie. | -| onSerieEnter |public Action<SerieEventData> onSerieEnter<br/>the callback function of pointer enter serie. | -| onSerieExit |public Action<SerieEventData> onSerieExit<br/>the callback function of pointer exit serie. | -| onUpdate |public Action onUpdate<br/>The callback function of chart update. | -| AddChartComponent() |public MainComponent AddChartComponent(Type type)| -| AddChartComponent<T>() |public T AddChartComponent<T>() where T : MainComponent| -| AddChartComponentWhenNoExist<T>() |public T AddChartComponentWhenNoExist<T>() where T : MainComponent| -| AddData() |public SerieData AddData(int serieIndex, DateTime time, double yValue, string dataName = null, string dataId = null)<br/>Add a (time,y) data to serie. | -| AddData() |public SerieData AddData(int serieIndex, double data, string dataName = null, string dataId = null)<br/>Add a data to serie. | -| AddData() |public SerieData AddData(int serieIndex, double indexOrTimestamp, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)| -| AddData() |public SerieData AddData(int serieIndex, double xValue, double yValue, string dataName = null, string dataId = null)<br/>Add a (x,y) data to serie. | -| AddData() |public SerieData AddData(int serieIndex, List<double> multidimensionalData, string dataName = null, string dataId = null)<br/>Add an arbitray dimension data to serie,such as (x,y,z,...). | -| AddData() |public SerieData AddData(int serieIndex, params double[] multidimensionalData)<br/>Add an arbitray dimension data to serie,such as (x,y,z,...). | -| AddData() |public SerieData AddData(string serieName, DateTime time, double yValue, string dataName = null, string dataId = null)<br/>Add a (time,y) data to serie. | -| AddData() |public SerieData AddData(string serieName, double data, string dataName = null, string dataId = null)<br/>Add a data to serie. | -| AddData() |public SerieData AddData(string serieName, double indexOrTimestamp, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)| -| AddData() |public SerieData AddData(string serieName, double xValue, double yValue, string dataName = null, string dataId = null)<br/>Add a (x,y) data to serie. | -| AddData() |public SerieData AddData(string serieName, List<double> multidimensionalData, string dataName = null, string dataId = null)<br/>Add an arbitray dimension data to serie,such as (x,y,z,...). | -| AddData() |public SerieData AddData(string serieName, params double[] multidimensionalData)<br/>Add an arbitray dimension data to serie,such as (x,y,z,...). | -| AddSerie<T>() |public T AddSerie<T>(string serieName = null, bool show = true, bool addToHead = false) where T : Serie| -| AddXAxisData() |public void AddXAxisData(string category, int xAxisIndex = 0)<br/>Add a category data to xAxis. | -| AddXAxisIcon() |public void AddXAxisIcon(Sprite icon, int xAxisIndex = 0)<br/>Add an icon to xAxis. | -| AddYAxisData() |public void AddYAxisData(string category, int yAxisIndex = 0)<br/>Add a category data to yAxis. | -| AddYAxisIcon() |public void AddYAxisIcon(Sprite icon, int yAxisIndex = 0)<br/>Add an icon to yAxis. | -| AnimationEnable() |public void AnimationEnable(bool flag)<br/>Whether series animation enabel. | -| AnimationFadeIn() |public void AnimationFadeIn(bool reset = true)<br/>fadeIn animation. | -| AnimationFadeOut() |public void AnimationFadeOut()<br/>fadeIn animation. | -| AnimationPause() |public void AnimationPause()<br/>Pause animation. | -| AnimationReset() |public void AnimationReset()<br/>Reset animation. | -| AnimationResume() |public void AnimationResume()<br/>Stop play animation. | -| CanAddChartComponent() |public bool CanAddChartComponent(Type type)| -| CanAddSerie() |public bool CanAddSerie(Type type)| -| CanAddSerie<T>() |public bool CanAddSerie<T>() where T : Serie| -| CanMultipleComponent() |public bool CanMultipleComponent(Type type)| -| ClampInChart() |public void ClampInChart(ref Vector3 pos)| -| ClampInGrid() |public Vector3 ClampInGrid(GridCoord grid, Vector3 pos)| -| ClearComponentData() |public virtual void ClearComponentData()<br/>Clear the data of all components. | -| ClearData() |public virtual void ClearData()<br/>Clear all components and series data. Note: serie only empties the data and does not remove serie. | -| ClearSerieData() |public virtual void ClearSerieData()<br/>Clear the data of all series. | -| ClickLegendButton() |public void ClickLegendButton(int legendIndex, string legendName, bool show)<br/>点击图例按钮 | -| ConvertSerie() |public bool ConvertSerie(Serie serie, Type type)| -| ConvertSerie<T>() |public bool ConvertSerie<T>(Serie serie) where T : Serie| -| ConvertXYAxis() |public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | -| EnsureChartComponent<T>() |public T EnsureChartComponent<T>() where T : MainComponent<br/>Ensure the chart has the component, if not, add it. Note: it may fail to add. | -| GenerateDefaultSerieName() |public string GenerateDefaultSerieName()| -| GetAllSerieDataCount() |public int GetAllSerieDataCount()| -| GetChartBackgroundColor() |public Color32 GetChartBackgroundColor()| -| GetChartComponent<T>() |public T GetChartComponent<T>(int index = 0) where T : MainComponent| -| GetChartComponentNum() |public int GetChartComponentNum(Type type)| -| GetChartComponentNum<T>() |public int GetChartComponentNum<T>() where T : MainComponent| -| GetChartComponents<T>() |public List<MainComponent> GetChartComponents<T>() where T : MainComponent| -| GetData() |public double GetData(int serieIndex, int dataIndex, int dimension = 1)| -| GetData() |public double GetData(string serieName, int dataIndex, int dimension = 1)| -| GetDataZoomOfAxis() |public DataZoom GetDataZoomOfAxis(Axis axis)| -| GetDataZoomOfSerie() |public void GetDataZoomOfSerie(Serie serie, out DataZoom xDataZoom, out DataZoom yDataZoom)| -| GetGrid() |public GridCoord GetGrid(Vector2 local)| -| GetGridOfDataZoom() |public GridCoord GetGridOfDataZoom(DataZoom dataZoom)| -| GetItemColor() |public Color32 GetItemColor(Serie serie)| -| GetItemColor() |public Color32 GetItemColor(Serie serie, SerieData serieData)| -| GetItemColor() |public Color32 GetItemColor(Serie serie, SerieData serieData, int colorIndex)| -| GetLegendRealShowNameColor() |public Color32 GetLegendRealShowNameColor(string name)| -| GetLegendRealShowNameIndex() |public int GetLegendRealShowNameIndex(string name)| -| GetMarkColor() |public Color32 GetMarkColor(Serie serie, SerieData serieData)<br/>获得Serie的标识颜色。 | -| GetOrAddChartComponent<T>() |public T GetOrAddChartComponent<T>() where T : MainComponent| -| GetPainter() |public Painter GetPainter(int index)| -| GetSerie() |public Serie GetSerie(int serieIndex)| -| GetSerie() |public Serie GetSerie(string serieName)| -| GetSerie<T>() |public T GetSerie<T>() where T : Serie| -| GetSerie<T>() |public T GetSerie<T>(int serieIndex) where T : Serie| -| GetSerieBarGap<T>() |public float GetSerieBarGap<T>() where T : Serie| -| GetSerieBarRealCount<T>() |public int GetSerieBarRealCount<T>() where T : Serie| -| GetSerieIndexIfStack<T>() |public int GetSerieIndexIfStack<T>(Serie currSerie) where T : Serie| -| GetSerieSameStackTotalValue<T>() |public double GetSerieSameStackTotalValue<T>(string stack, int dataIndex) where T : Serie| -| GetSeriesMinMaxValue() |public virtual void GetSeriesMinMaxValue(Axis axis, int axisIndex, out double tempMinValue, out double tempMaxValue)| -| GetSerieTotalGap<T>() |public float GetSerieTotalGap<T>(float categoryWidth, float gap, int index) where T : Serie| -| GetSerieTotalWidth<T>() |public float GetSerieTotalWidth<T>(float categoryWidth, float gap, int realBarCount) where T : Serie| -| GetTitlePosition() |public Vector3 GetTitlePosition(Title title)| -| GetVisualMapOfSerie() |public VisualMap GetVisualMapOfSerie(Serie serie)| -| GetXDataZoomOfSerie() |public DataZoom GetXDataZoomOfSerie(Serie serie)| -| GetXLerpColor() |public Color32 GetXLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, GridCoord grid)| -| GetYLerpColor() |public Color32 GetYLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, GridCoord grid)| -| HasChartComponent() |public bool HasChartComponent(Type type)| -| HasChartComponent<T>() |public bool HasChartComponent<T>()| -| HasSerie() |public bool HasSerie(Type type)| -| HasSerie<T>() |public bool HasSerie<T>() where T : Serie| -| Init() |public void Init(bool defaultChart = true)| -| InitAxisRuntimeData() |public virtual void InitAxisRuntimeData(Axis axis) { }| -| InsertSerie() |public void InsertSerie(Serie serie, int index = -1, bool addToHead = false)| -| InsertSerie<T>() |public T InsertSerie<T>(int index, string serieName = null, bool show = true) where T : Serie| -| Internal_CheckAnimation() |public void Internal_CheckAnimation()| -| IsActiveByLegend() |public virtual bool IsActiveByLegend(string legendName)<br/>Whether serie is activated. | -| IsAllAxisCategory() |public bool IsAllAxisCategory()<br/>纯类目轴。 | -| IsAllAxisValue() |public bool IsAllAxisValue()<br/>reutrn true when all the show axis is `Value` type. | -| IsInAnyGrid() |public bool IsInAnyGrid(Vector2 local)| -| IsInChart() |public bool IsInChart(float x, float y)| -| IsInChart() |public bool IsInChart(Vector2 local)<br/>坐标是否在图表范围内 | -| IsSerieName() |public bool IsSerieName(string name)| -| MoveDownSerie() |public bool MoveDownSerie(int serieIndex)| -| MoveUpSerie() |public bool MoveUpSerie(int serieIndex)| -| OnAfterDeserialize() |public void OnAfterDeserialize()| -| OnBeforeSerialize() |public void OnBeforeSerialize()| -| OnBeginDrag() |public override void OnBeginDrag(PointerEventData eventData)| -| OnDataZoomRangeChanged() |public virtual void OnDataZoomRangeChanged(DataZoom dataZoom)| -| OnDrag() |public override void OnDrag(PointerEventData eventData)| -| OnEndDrag() |public override void OnEndDrag(PointerEventData eventData)| -| OnLegendButtonClick() |public virtual void OnLegendButtonClick(int index, string legendName, bool show)| -| OnLegendButtonEnter() |public virtual void OnLegendButtonEnter(int index, string legendName)| -| OnLegendButtonExit() |public virtual void OnLegendButtonExit(int index, string legendName)| -| OnPointerClick() |public override void OnPointerClick(PointerEventData eventData)| -| OnPointerDown() |public override void OnPointerDown(PointerEventData eventData)| -| OnPointerEnter() |public override void OnPointerEnter(PointerEventData eventData)| -| OnPointerExit() |public override void OnPointerExit(PointerEventData eventData)| -| OnPointerUp() |public override void OnPointerUp(PointerEventData eventData)| -| OnScroll() |public override void OnScroll(PointerEventData eventData)| -| RefreshBasePainter() |public void RefreshBasePainter()| -| RefreshChart() |public void RefreshChart()<br/>Redraw chart in next frame. | -| RefreshChart() |public void RefreshChart(int serieIndex)<br/>Redraw chart serie in next frame. | -| RefreshChart() |public void RefreshChart(Serie serie)<br/>Redraw chart serie in next frame. | -| RefreshDataZoom() |public void RefreshDataZoom()<br/>在下一帧刷新DataZoom | -| RefreshGraph() |public override void RefreshGraph()| -| RefreshPainter() |public void RefreshPainter(int index)| -| RefreshPainter() |public void RefreshPainter(Serie serie)| -| RefreshTopPainter() |public void RefreshTopPainter()| -| RefreshUpperPainter() |public void RefreshUpperPainter()| -| RemoveAllChartComponent() |public void RemoveAllChartComponent()| -| RemoveAllSerie() |public virtual void RemoveAllSerie()<br/>Remove all of them Serie. This interface is used when Serie needs to be removed only, and RemoveData() is generally used in other cases. | -| RemoveChartComponent() |public bool RemoveChartComponent(MainComponent component)| -| RemoveChartComponent() |public bool RemoveChartComponent(Type type, int index = 0)| -| RemoveChartComponent<T>() |public bool RemoveChartComponent<T>(int index = 0)| -| RemoveChartComponents() |public int RemoveChartComponents(Type type)| -| RemoveChartComponents<T>() |public int RemoveChartComponents<T>()| -| RemoveData() |public virtual void RemoveData()<br/>Empty all component data and remove all series. Use the chart again and again to tell the truth. Note: The component only clears the data part, and the parameters are retained and not reset. | -| RemoveData() |public virtual void RemoveData(string serieName)<br/>Remove legend and serie by name. | -| RemoveSerie() |public void RemoveSerie(int serieIndex)| -| RemoveSerie() |public void RemoveSerie(Serie serie)| -| RemoveSerie() |public void RemoveSerie(string serieName)| -| RemoveSerie<T>() |public void RemoveSerie<T>() where T : Serie| -| ReplaceSerie() |public bool ReplaceSerie(Serie oldSerie, Serie newSerie)| -| ResetDataIndex() |public bool ResetDataIndex(int serieIndex)<br/>重置serie的数据项索引。避免数据项索引异常。 | -| SetBasePainterMaterial() |public void SetBasePainterMaterial(Material material)<br/>设置Base Painter的材质球 | -| SetMaxCache() |public void SetMaxCache(int maxCache)<br/>设置可缓存的最大数据量。当数据量超过该值时,会自动删除第一个值再加入最新值。 | -| SetPainterActive() |public void SetPainterActive(int index, bool flag)| -| SetSerieActive() |public void SetSerieActive(int serieIndex, bool active)<br/>Whether to show serie. | -| SetSerieActive() |public void SetSerieActive(Serie serie, bool active)| -| SetSerieActive() |public void SetSerieActive(string serieName, bool active)<br/>Whether to show serie. | -| SetSeriePainterMaterial() |public void SetSeriePainterMaterial(Material material)<br/>设置Serie Painter的材质球 | -| SetTopPainterMaterial() |public void SetTopPainterMaterial(Material material)<br/>设置Top Painter的材质球 | -| SetUpperPainterMaterial() |public void SetUpperPainterMaterial(Material material)<br/>设置Upper Painter的材质球 | -| 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| -| TryGetChartComponent<T>() |public bool TryGetChartComponent<T>(out T component, int index = 0)| -| UpdateData() |public bool UpdateData(int serieIndex, int dataIndex, double value)<br/>Update serie data by serie index. | -| UpdateData() |public bool UpdateData(int serieIndex, int dataIndex, int dimension, double value)<br/>更新指定系列指定索引指定维数的数据。维数从0开始。 | -| UpdateData() |public bool UpdateData(int serieIndex, int dataIndex, List<double> multidimensionalData)<br/>更新指定系列指定索引的数据项的多维数据。 | -| UpdateData() |public bool UpdateData(string serieName, int dataIndex, double value)<br/>Update serie data by serie name. | -| UpdateData() |public bool UpdateData(string serieName, int dataIndex, int dimension, double value)<br/>更新指定系列指定索引指定维数的数据。维数从0开始。 | -| UpdateData() |public bool UpdateData(string serieName, int dataIndex, List<double> multidimensionalData)<br/>更新指定系列指定索引的数据项的多维数据。 | -| UpdateDataName() |public bool UpdateDataName(int serieIndex, int dataIndex, string dataName)<br/>Update serie data name. | -| UpdateDataName() |public bool UpdateDataName(string serieName, int dataIndex, string dataName)<br/>Update serie data name. | -| UpdateLegendColor() |public virtual void UpdateLegendColor(string legendName, bool active)| -| UpdateTheme() |public bool UpdateTheme(ThemeType theme)<br/>Update chart theme. | -| UpdateTheme() |public void UpdateTheme(Theme theme)<br/>Update chart theme info. | -| UpdateXAxisData() |public void UpdateXAxisData(int index, string category, int xAxisIndex = 0)<br/>Update category data. | -| UpdateXAxisIcon() |public void UpdateXAxisIcon(int index, Sprite icon, int xAxisIndex = 0)<br/>Update xAxis icon. | -| UpdateYAxisData() |public void UpdateYAxisData(int index, string category, int yAxisIndex = 0)<br/>Update category data. | -| UpdateYAxisIcon() |public void UpdateYAxisIcon(int index, Sprite icon, int yAxisIndex = 0)<br/>更新Y轴图标。 | +|onAxisPointerValueChanged||public Action<Axis, double> onAxisPointerValueChanged<br/>坐标轴变更数据索引时回调。参数:axis, dataIndex/dataValue | +|onDraw||public Action<VertexHelper> onDraw<br/>自定义绘制回调。在绘制Serie前调用。 | +|onDrawAfterSerie||public Action<VertexHelper, Serie> onDrawAfterSerie<br/>自定义Serie绘制回调。在每个Serie绘制完后调用。 | +|onDrawBeforeSerie||public Action<VertexHelper, Serie> onDrawBeforeSerie<br/>自定义Serie绘制回调。在每个Serie绘制完前调用。 | +|onDrawTop||public Action<VertexHelper> onDrawTop<br/>自定义Top层绘制回调。在绘制Tooltip前调用。 | +|onDrawUpper||public Action<VertexHelper> onDrawUpper<br/>自定义Upper层绘制回调。在绘制Tooltip前调用。 | +|onInit||public Action onInit<br/>The callback function of chart init. | +|onLegendClick||public Action<Legend, int, string, bool> onLegendClick<br/>the callback function of click legend. | +|onLegendEnter||public Action<Legend, int, string> onLegendEnter<br/>the callback function of enter legend. | +|onLegendExit||public Action<Legend, int, string> onLegendExit<br/>the callback function of exit legend. | +|onPointerClickBar||public Action<PointerEventData, int> onPointerClickBar<br/>the callback function of click bar. | +|onPointerClickPie||public Action<PointerEventData, int, int> onPointerClickPie<br/>the callback function of pointer click pie area. | +|onPointerEnterPie||public Action<int, int> onPointerEnterPie<br/>the callback function of pointer enter pie area. | +|onSerieClick|v3.6.0|public Action<SerieEventData> onSerieClick<br/>the callback function of pointer click serie. | +|onSerieDown|v3.6.0|public Action<SerieEventData> onSerieDown<br/>the callback function of pointer down serie. | +|onSerieEnter|v3.6.0|public Action<SerieEventData> onSerieEnter<br/>the callback function of pointer enter serie. | +|onSerieExit|v3.6.0|public Action<SerieEventData> onSerieExit<br/>the callback function of pointer exit serie. | +|onUpdate||public Action onUpdate<br/>The callback function of chart update. | +|AddChartComponent()||public MainComponent AddChartComponent(Type type)| +|AddChartComponent<T>()||public T AddChartComponent<T>() where T : MainComponent| +|AddChartComponentWhenNoExist<T>()||public T AddChartComponentWhenNoExist<T>() where T : MainComponent| +|AddData()||public SerieData AddData(int serieIndex, DateTime time, double yValue, string dataName = null, string dataId = null)<br/>Add a (time,y) data to serie. | +|AddData()||public SerieData AddData(int serieIndex, double data, string dataName = null, string dataId = null)<br/>Add a data to serie. | +|AddData()||public SerieData AddData(int serieIndex, double indexOrTimestamp, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)| +|AddData()||public SerieData AddData(int serieIndex, double xValue, double yValue, string dataName = null, string dataId = null)<br/>Add a (x,y) data to serie. | +|AddData()||public SerieData AddData(int serieIndex, List<double> multidimensionalData, string dataName = null, string dataId = null)<br/>Add an arbitray dimension data to serie,such as (x,y,z,...). | +|AddData()||public SerieData AddData(int serieIndex, params double[] multidimensionalData)<br/>Add an arbitray dimension data to serie,such as (x,y,z,...). | +|AddData()||public SerieData AddData(string serieName, DateTime time, double yValue, string dataName = null, string dataId = null)<br/>Add a (time,y) data to serie. | +|AddData()||public SerieData AddData(string serieName, double data, string dataName = null, string dataId = null)<br/>Add a data to serie. | +|AddData()||public SerieData AddData(string serieName, double indexOrTimestamp, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)| +|AddData()||public SerieData AddData(string serieName, double xValue, double yValue, string dataName = null, string dataId = null)<br/>Add a (x,y) data to serie. | +|AddData()||public SerieData AddData(string serieName, List<double> multidimensionalData, string dataName = null, string dataId = null)<br/>Add an arbitray dimension data to serie,such as (x,y,z,...). | +|AddData()||public SerieData AddData(string serieName, params double[] multidimensionalData)<br/>Add an arbitray dimension data to serie,such as (x,y,z,...). | +|AddSerie<T>()||public T AddSerie<T>(string serieName = null, bool show = true, bool addToHead = false) where T : Serie| +|AddXAxisData()||public void AddXAxisData(string category, int xAxisIndex = 0)<br/>Add a category data to xAxis. | +|AddXAxisIcon()||public void AddXAxisIcon(Sprite icon, int xAxisIndex = 0)<br/>Add an icon to xAxis. | +|AddYAxisData()||public void AddYAxisData(string category, int yAxisIndex = 0)<br/>Add a category data to yAxis. | +|AddYAxisIcon()||public void AddYAxisIcon(Sprite icon, int yAxisIndex = 0)<br/>Add an icon to yAxis. | +|AnimationEnable()||public void AnimationEnable(bool flag)<br/>Whether series animation enabel. | +|AnimationFadeIn()||public void AnimationFadeIn(bool reset = true)<br/>fadeIn animation. | +|AnimationFadeOut()||public void AnimationFadeOut()<br/>fadeIn animation. | +|AnimationPause()||public void AnimationPause()<br/>Pause animation. | +|AnimationReset()||public void AnimationReset()<br/>Reset animation. | +|AnimationResume()||public void AnimationResume()<br/>Stop play animation. | +|CanAddChartComponent()||public bool CanAddChartComponent(Type type)| +|CanAddSerie()||public bool CanAddSerie(Type type)| +|CanAddSerie<T>()||public bool CanAddSerie<T>() where T : Serie| +|CanMultipleComponent()||public bool CanMultipleComponent(Type type)| +|ClampInChart()||public void ClampInChart(ref Vector3 pos)| +|ClampInGrid()||public Vector3 ClampInGrid(GridCoord grid, Vector3 pos)| +|ClearComponentData()||public virtual void ClearComponentData()<br/>Clear the data of all components. | +|ClearData()||public virtual void ClearData()<br/>Clear all components and series data. Note: serie only empties the data and does not remove serie. | +|ClearSerieData()||public virtual void ClearSerieData()<br/>Clear the data of all series. | +|ClickLegendButton()||public void ClickLegendButton(int legendIndex, string legendName, bool show)<br/>点击图例按钮 | +|ConvertSerie()||public bool ConvertSerie(Serie serie, Type type)| +|ConvertSerie<T>()||public bool ConvertSerie<T>(Serie serie) where T : Serie| +|ConvertXYAxis()||public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | +|EnsureChartComponent<T>()|v3.6.0|public T EnsureChartComponent<T>() where T : MainComponent<br/>Ensure the chart has the component, if not, add it. Note: it may fail to add. | +|GenerateDefaultSerieName()||public string GenerateDefaultSerieName()| +|GetAllSerieDataCount()||public int GetAllSerieDataCount()| +|GetChartBackgroundColor()||public Color32 GetChartBackgroundColor()| +|GetChartComponent<T>()||public T GetChartComponent<T>(int index = 0) where T : MainComponent| +|GetChartComponentNum()||public int GetChartComponentNum(Type type)| +|GetChartComponentNum<T>()||public int GetChartComponentNum<T>() where T : MainComponent| +|GetChartComponents<T>()||public List<MainComponent> GetChartComponents<T>() where T : MainComponent| +|GetData()||public double GetData(int serieIndex, int dataIndex, int dimension = 1)| +|GetData()||public double GetData(string serieName, int dataIndex, int dimension = 1)| +|GetDataZoomOfAxis()||public DataZoom GetDataZoomOfAxis(Axis axis)| +|GetDataZoomOfSerie()||public void GetDataZoomOfSerie(Serie serie, out DataZoom xDataZoom, out DataZoom yDataZoom)| +|GetGrid()||public GridCoord GetGrid(Vector2 local)| +|GetGridOfDataZoom()||public GridCoord GetGridOfDataZoom(DataZoom dataZoom)| +|GetItemColor()||public Color32 GetItemColor(Serie serie)| +|GetItemColor()||public Color32 GetItemColor(Serie serie, SerieData serieData)| +|GetItemColor()||public Color32 GetItemColor(Serie serie, SerieData serieData, int colorIndex)| +|GetLegendRealShowNameColor()||public Color32 GetLegendRealShowNameColor(string name)| +|GetLegendRealShowNameIndex()||public int GetLegendRealShowNameIndex(string name)| +|GetMarkColor()||public Color32 GetMarkColor(Serie serie, SerieData serieData)<br/>获得Serie的标识颜色。 | +|GetOrAddChartComponent<T>()||public T GetOrAddChartComponent<T>() where T : MainComponent| +|GetPainter()||public Painter GetPainter(int index)| +|GetSerie()||public Serie GetSerie(int serieIndex)| +|GetSerie()||public Serie GetSerie(string serieName)| +|GetSerie<T>()||public T GetSerie<T>() where T : Serie| +|GetSerie<T>()||public T GetSerie<T>(int serieIndex) where T : Serie| +|GetSerieBarGap<T>()||public float GetSerieBarGap<T>() where T : Serie| +|GetSerieBarRealCount<T>()||public int GetSerieBarRealCount<T>() where T : Serie| +|GetSerieIndexIfStack<T>()||public int GetSerieIndexIfStack<T>(Serie currSerie) where T : Serie| +|GetSerieSameStackTotalValue<T>()||public double GetSerieSameStackTotalValue<T>(string stack, int dataIndex) where T : Serie| +|GetSeriesMinMaxValue()||public virtual void GetSeriesMinMaxValue(Axis axis, int axisIndex, out double tempMinValue, out double tempMaxValue)| +|GetSerieTotalGap<T>()||public float GetSerieTotalGap<T>(float categoryWidth, float gap, int index) where T : Serie| +|GetSerieTotalWidth<T>()||public float GetSerieTotalWidth<T>(float categoryWidth, float gap, int realBarCount) where T : Serie| +|GetTitlePosition()||public Vector3 GetTitlePosition(Title title)| +|GetVisualMapOfSerie()||public VisualMap GetVisualMapOfSerie(Serie serie)| +|GetXDataZoomOfSerie()||public DataZoom GetXDataZoomOfSerie(Serie serie)| +|GetXLerpColor()||public Color32 GetXLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, GridCoord grid)| +|GetYLerpColor()||public Color32 GetYLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, GridCoord grid)| +|HasChartComponent()||public bool HasChartComponent(Type type)| +|HasChartComponent<T>()||public bool HasChartComponent<T>()| +|HasSerie()||public bool HasSerie(Type type)| +|HasSerie<T>()||public bool HasSerie<T>() where T : Serie| +|Init()||public void Init(bool defaultChart = true)| +|InitAxisRuntimeData()||public virtual void InitAxisRuntimeData(Axis axis) { }| +|InsertSerie()||public void InsertSerie(Serie serie, int index = -1, bool addToHead = false)| +|InsertSerie<T>()||public T InsertSerie<T>(int index, string serieName = null, bool show = true) where T : Serie| +|Internal_CheckAnimation()||public void Internal_CheckAnimation()| +|IsActiveByLegend()||public virtual bool IsActiveByLegend(string legendName)<br/>Whether serie is activated. | +|IsAllAxisCategory()||public bool IsAllAxisCategory()<br/>纯类目轴。 | +|IsAllAxisValue()||public bool IsAllAxisValue()<br/>reutrn true when all the show axis is `Value` type. | +|IsInAnyGrid()||public bool IsInAnyGrid(Vector2 local)| +|IsInChart()||public bool IsInChart(float x, float y)| +|IsInChart()||public bool IsInChart(Vector2 local)<br/>坐标是否在图表范围内 | +|IsSerieName()||public bool IsSerieName(string name)| +|MoveDownSerie()||public bool MoveDownSerie(int serieIndex)| +|MoveUpSerie()||public bool MoveUpSerie(int serieIndex)| +|OnAfterDeserialize()||public void OnAfterDeserialize()| +|OnBeforeSerialize()||public void OnBeforeSerialize()| +|OnBeginDrag()||public override void OnBeginDrag(PointerEventData eventData)| +|OnDataZoomRangeChanged()||public virtual void OnDataZoomRangeChanged(DataZoom dataZoom)| +|OnDrag()||public override void OnDrag(PointerEventData eventData)| +|OnEndDrag()||public override void OnEndDrag(PointerEventData eventData)| +|OnLegendButtonClick()||public virtual void OnLegendButtonClick(int index, string legendName, bool show)| +|OnLegendButtonEnter()||public virtual void OnLegendButtonEnter(int index, string legendName)| +|OnLegendButtonExit()||public virtual void OnLegendButtonExit(int index, string legendName)| +|OnPointerClick()||public override void OnPointerClick(PointerEventData eventData)| +|OnPointerDown()||public override void OnPointerDown(PointerEventData eventData)| +|OnPointerEnter()||public override void OnPointerEnter(PointerEventData eventData)| +|OnPointerExit()||public override void OnPointerExit(PointerEventData eventData)| +|OnPointerUp()||public override void OnPointerUp(PointerEventData eventData)| +|OnScroll()||public override void OnScroll(PointerEventData eventData)| +|RefreshBasePainter()||public void RefreshBasePainter()| +|RefreshChart()||public void RefreshChart()<br/>Redraw chart in next frame. | +|RefreshChart()||public void RefreshChart(int serieIndex)<br/>Redraw chart serie in next frame. | +|RefreshChart()||public void RefreshChart(Serie serie)<br/>Redraw chart serie in next frame. | +|RefreshDataZoom()||public void RefreshDataZoom()<br/>在下一帧刷新DataZoom | +|RefreshGraph()||public override void RefreshGraph()| +|RefreshPainter()||public void RefreshPainter(int index)| +|RefreshPainter()||public void RefreshPainter(Serie serie)| +|RefreshTopPainter()||public void RefreshTopPainter()| +|RefreshUpperPainter()||public void RefreshUpperPainter()| +|RemoveAllChartComponent()||public void RemoveAllChartComponent()| +|RemoveAllSerie()|v3.2.0|public virtual void RemoveAllSerie()<br/>Remove all of them Serie. This interface is used when Serie needs to be removed only, and RemoveData() is generally used in other cases. | +|RemoveChartComponent()||public bool RemoveChartComponent(MainComponent component)| +|RemoveChartComponent()||public bool RemoveChartComponent(Type type, int index = 0)| +|RemoveChartComponent<T>()||public bool RemoveChartComponent<T>(int index = 0)| +|RemoveChartComponents()||public int RemoveChartComponents(Type type)| +|RemoveChartComponents<T>()||public int RemoveChartComponents<T>()| +|RemoveData()||public virtual void RemoveData()<br/>Empty all component data and remove all series. Use the chart again and again to tell the truth. Note: The component only clears the data part, and the parameters are retained and not reset. | +|RemoveData()||public virtual void RemoveData(string serieName)<br/>Remove legend and serie by name. | +|RemoveSerie()||public void RemoveSerie(int serieIndex)| +|RemoveSerie()||public void RemoveSerie(Serie serie)| +|RemoveSerie()||public void RemoveSerie(string serieName)| +|RemoveSerie<T>()||public void RemoveSerie<T>() where T : Serie| +|ReplaceSerie()||public bool ReplaceSerie(Serie oldSerie, Serie newSerie)| +|ResetDataIndex()||public bool ResetDataIndex(int serieIndex)<br/>重置serie的数据项索引。避免数据项索引异常。 | +|SetBasePainterMaterial()||public void SetBasePainterMaterial(Material material)<br/>设置Base Painter的材质球 | +|SetMaxCache()||public void SetMaxCache(int maxCache)<br/>设置可缓存的最大数据量。当数据量超过该值时,会自动删除第一个值再加入最新值。 | +|SetPainterActive()||public void SetPainterActive(int index, bool flag)| +|SetSerieActive()||public void SetSerieActive(int serieIndex, bool active)<br/>Whether to show serie. | +|SetSerieActive()||public void SetSerieActive(Serie serie, bool active)| +|SetSerieActive()||public void SetSerieActive(string serieName, bool active)<br/>Whether to show serie. | +|SetSeriePainterMaterial()||public void SetSeriePainterMaterial(Material material)<br/>设置Serie Painter的材质球 | +|SetTopPainterMaterial()||public void SetTopPainterMaterial(Material material)<br/>设置Top Painter的材质球 | +|SetUpperPainterMaterial()||public void SetUpperPainterMaterial(Material material)<br/>设置Upper Painter的材质球 | +|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| +|TryGetChartComponent<T>()||public bool TryGetChartComponent<T>(out T component, int index = 0)| +|UpdateData()||public bool UpdateData(int serieIndex, int dataIndex, double value)<br/>Update serie data by serie index. | +|UpdateData()||public bool UpdateData(int serieIndex, int dataIndex, int dimension, double value)<br/>更新指定系列指定索引指定维数的数据。维数从0开始。 | +|UpdateData()||public bool UpdateData(int serieIndex, int dataIndex, List<double> multidimensionalData)<br/>更新指定系列指定索引的数据项的多维数据。 | +|UpdateData()||public bool UpdateData(string serieName, int dataIndex, double value)<br/>Update serie data by serie name. | +|UpdateData()||public bool UpdateData(string serieName, int dataIndex, int dimension, double value)<br/>更新指定系列指定索引指定维数的数据。维数从0开始。 | +|UpdateData()||public bool UpdateData(string serieName, int dataIndex, List<double> multidimensionalData)<br/>更新指定系列指定索引的数据项的多维数据。 | +|UpdateDataName()||public bool UpdateDataName(int serieIndex, int dataIndex, string dataName)<br/>Update serie data name. | +|UpdateDataName()||public bool UpdateDataName(string serieName, int dataIndex, string dataName)<br/>Update serie data name. | +|UpdateLegendColor()||public virtual void UpdateLegendColor(string legendName, bool active)| +|UpdateTheme()||public bool UpdateTheme(ThemeType theme)<br/>Update chart theme. | +|UpdateTheme()||public void UpdateTheme(Theme theme)<br/>Update chart theme info. | +|UpdateXAxisData()||public void UpdateXAxisData(int index, string category, int xAxisIndex = 0)<br/>Update category data. | +|UpdateXAxisIcon()||public void UpdateXAxisIcon(int index, Sprite icon, int xAxisIndex = 0)<br/>Update xAxis icon. | +|UpdateYAxisData()||public void UpdateYAxisData(int index, string category, int yAxisIndex = 0)<br/>Update category data. | +|UpdateYAxisIcon()||public void UpdateYAxisIcon(int index, Sprite icon, int yAxisIndex = 0)<br/>更新Y轴图标。 | ## BaseGraph Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandler](#ipointerdownhandler),[IPointerUpHandler](#ipointeruphandler),[](#) -|public method|description| +|public method|since|description| |--|--| -| onBeginDrag |public Action<PointerEventData, BaseGraph> onBeginDrag<br/>鼠标开始拖拽回调。 | -| onDrag |public Action<PointerEventData, BaseGraph> onDrag<br/>鼠标拖拽回调。 | -| onEndDrag |public Action<PointerEventData, BaseGraph> onEndDrag<br/>鼠标结束拖拽回调。 | -| onPointerClick |public Action<PointerEventData, BaseGraph> onPointerClick<br/>鼠标点击回调。 | -| onPointerDown |public Action<PointerEventData, BaseGraph> onPointerDown<br/>鼠标按下回调。 | -| onPointerEnter |public Action<PointerEventData, BaseGraph> onPointerEnter<br/>鼠标进入回调。 | -| onPointerExit |public Action<PointerEventData, BaseGraph> onPointerExit<br/>鼠标退出回调。 | -| onPointerUp |public Action<PointerEventData, BaseGraph> onPointerUp<br/>鼠标弹起回调。 | -| onScroll |public Action<PointerEventData, BaseGraph> onScroll<br/>鼠标滚动回调。 | -| CheckWarning() |public string CheckWarning()<br/>检测警告信息。 | -| OnBeginDrag() |public virtual void OnBeginDrag(PointerEventData eventData)| -| OnDrag() |public virtual void OnDrag(PointerEventData eventData)| -| OnEndDrag() |public virtual void OnEndDrag(PointerEventData eventData)| -| OnPointerClick() |public virtual void OnPointerClick(PointerEventData eventData)| -| OnPointerDown() |public virtual void OnPointerDown(PointerEventData eventData)| -| OnPointerEnter() |public virtual void OnPointerEnter(PointerEventData eventData)| -| OnPointerExit() |public virtual void OnPointerExit(PointerEventData eventData)| -| OnPointerUp() |public virtual void OnPointerUp(PointerEventData eventData)| -| OnScroll() |public virtual void OnScroll(PointerEventData eventData)| -| RebuildChartObject() |public void RebuildChartObject()<br/>移除并重新创建所有图表的Object。 | -| RefreshAllComponent() |public void RefreshAllComponent()| -| RefreshGraph() |public virtual void RefreshGraph()<br/>Redraw graph in next frame. | -| SaveAsImage() |public void SaveAsImage(string imageType = "png", string savePath = "")<br/>保存图表为图片。 | -| ScreenPointToChartPoint() |public bool ScreenPointToChartPoint(Vector2 screenPoint, out Vector2 chartPoint)| -| SetPainterDirty() |public void SetPainterDirty()<br/>重新初始化Painter | -| SetSize() |public virtual void SetSize(float width, float height)<br/>设置图形的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform) | +|onBeginDrag||public Action<PointerEventData, BaseGraph> onBeginDrag<br/>鼠标开始拖拽回调。 | +|onDrag||public Action<PointerEventData, BaseGraph> onDrag<br/>鼠标拖拽回调。 | +|onEndDrag||public Action<PointerEventData, BaseGraph> onEndDrag<br/>鼠标结束拖拽回调。 | +|onPointerClick||public Action<PointerEventData, BaseGraph> onPointerClick<br/>鼠标点击回调。 | +|onPointerDown||public Action<PointerEventData, BaseGraph> onPointerDown<br/>鼠标按下回调。 | +|onPointerEnter||public Action<PointerEventData, BaseGraph> onPointerEnter<br/>鼠标进入回调。 | +|onPointerExit||public Action<PointerEventData, BaseGraph> onPointerExit<br/>鼠标退出回调。 | +|onPointerUp||public Action<PointerEventData, BaseGraph> onPointerUp<br/>鼠标弹起回调。 | +|onScroll||public Action<PointerEventData, BaseGraph> onScroll<br/>鼠标滚动回调。 | +|CheckWarning()||public string CheckWarning()<br/>检测警告信息。 | +|OnBeginDrag()||public virtual void OnBeginDrag(PointerEventData eventData)| +|OnDrag()||public virtual void OnDrag(PointerEventData eventData)| +|OnEndDrag()||public virtual void OnEndDrag(PointerEventData eventData)| +|OnPointerClick()||public virtual void OnPointerClick(PointerEventData eventData)| +|OnPointerDown()||public virtual void OnPointerDown(PointerEventData eventData)| +|OnPointerEnter()||public virtual void OnPointerEnter(PointerEventData eventData)| +|OnPointerExit()||public virtual void OnPointerExit(PointerEventData eventData)| +|OnPointerUp()||public virtual void OnPointerUp(PointerEventData eventData)| +|OnScroll()||public virtual void OnScroll(PointerEventData eventData)| +|RebuildChartObject()||public void RebuildChartObject()<br/>移除并重新创建所有图表的Object。 | +|RefreshAllComponent()||public void RefreshAllComponent()| +|RefreshGraph()||public virtual void RefreshGraph()<br/>Redraw graph in next frame. | +|SaveAsImage()||public void SaveAsImage(string imageType = "png", string savePath = "")<br/>保存图表为图片。 | +|ScreenPointToChartPoint()||public bool ScreenPointToChartPoint(Vector2 screenPoint, out Vector2 chartPoint)| +|SetPainterDirty()||public void SetPainterDirty()<br/>重新初始化Painter | +|SetSize()||public virtual void SetSize(float width, float height)<br/>设置图形的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform) | ## CandlestickChart @@ -376,14 +376,14 @@ Inherits or Implemented: [BaseChart](#basechart) ## ChartCached -|public method|description| +|public method|since|description| |--|--| -| ColorToDotStr() |public static string ColorToDotStr(Color color)| -| ColorToStr() |public static string ColorToStr(Color color)| -| FloatToStr() |public static string FloatToStr(double value, string numericFormatter = "F", int precision = 0)| -| GetSerieLabelName() |public static string GetSerieLabelName(string prefix, int i, int j)| -| IntToStr() |public static string IntToStr(int value, string numericFormatter = "")| -| NumberToStr() |public static string NumberToStr(double value, string formatter)| +|ColorToDotStr()||public static string ColorToDotStr(Color color)| +|ColorToStr()||public static string ColorToStr(Color color)| +|FloatToStr()||public static string FloatToStr(double value, string numericFormatter = "F", int precision = 0)| +|GetSerieLabelName()||public static string GetSerieLabelName(string prefix, int i, int j)| +|IntToStr()||public static string IntToStr(int value, string numericFormatter = "")| +|NumberToStr()||public static string NumberToStr(double value, string formatter)| ## ChartConst @@ -391,146 +391,146 @@ Inherits or Implemented: [BaseChart](#basechart) ## ChartHelper -|public method|description| +|public method|since|description| |--|--| -| ActiveAllObject() |public static void ActiveAllObject(Transform parent, bool active, string match = null)| -| AddIcon() |public static Image AddIcon(string name, Transform parent, IconStyle iconStyle)| -| Cancat() |public static string Cancat(string str1, int i)| -| Cancat() |public static string Cancat(string str1, string str2)| -| ClearEventListener() |public static void ClearEventListener(GameObject obj)| -| CopyArray<T>() |public static bool CopyArray<T>(T[] toList, T[] fromList)| -| CopyList<T>() |public static bool CopyList<T>(List<T> toList, List<T> fromList)| -| DestoryGameObject() |public static void DestoryGameObject(GameObject go)| -| DestoryGameObject() |public static void DestoryGameObject(Transform parent, string childName)| -| DestoryGameObjectByMatch() |public static void DestoryGameObjectByMatch(Transform parent, string containString)| -| DestroyAllChildren() |public static void DestroyAllChildren(Transform parent)| -| EnsureComponent<T>() |public static T EnsureComponent<T>(GameObject gameObject) where T : Component<br/>Ensure that the game object has the specified component, add it if not. | -| EnsureComponent<T>() |public static T EnsureComponent<T>(Transform transform) where T : Component<br/>Ensure that the transform has the specified component, add it if not. | -| GetActualValue() |public static float GetActualValue(float valueOrRate, float total, float maxRate = 1.5f)| -| GetAngle360() |public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | -| GetBlurColor() |public static Color32 GetBlurColor(Color32 color, float a = 0.3f)| -| GetColor() |public static Color32 GetColor(string hexColorStr)| -| GetDire() |public static Vector3 GetDire(float angle, bool isDegree = false)| -| GetFullName() |public static string GetFullName(Transform transform)| -| GetHighlightColor() |public static Color32 GetHighlightColor(Color32 color, float rate = 0.8f)| -| GetLastValue() |public static Vector3 GetLastValue(List<Vector3> list)| -| GetMaxDivisibleValue() |public static double GetMaxDivisibleValue(double max, double ceilRate)| -| GetMaxLogValue() |public static double GetMaxLogValue(double value, float logBase, bool isLogBaseE, out int splitNumber)| -| GetMinDivisibleValue() |public static double GetMinDivisibleValue(double min, double ceilRate)| -| GetMinLogValue() |public static double GetMinLogValue(double value, float logBase, bool isLogBaseE, out int splitNumber)| -| GetOrAddComponent<T>() |public static T GetOrAddComponent<T>(GameObject gameObject) where T : Component| -| GetOrAddComponent<T>() |public static T GetOrAddComponent<T>(Transform transform) where T : Component| -| GetPointList() |public static void GetPointList(ref List<Vector3> posList, Vector3 sp, Vector3 ep, float k = 30f)| -| GetPos() |public static Vector3 GetPos(Vector3 center, float radius, float angle, bool isDegree = false)| -| GetPosition() |public static Vector3 GetPosition(Vector3 center, float angle, float radius)| -| GetSelectColor() |public static Color32 GetSelectColor(Color32 color, float rate = 0.8f)| -| GetVertialDire() |public static Vector3 GetVertialDire(Vector3 dire)| -| HideAllObject() |public static void HideAllObject(GameObject obj, string match = null)| -| HideAllObject() |public static void HideAllObject(Transform parent, string match = null)| -| IsClearColor() |public static bool IsClearColor(Color color)| -| IsClearColor() |public static bool IsClearColor(Color32 color)| -| IsColorAlphaZero() |public static bool IsColorAlphaZero(Color color)| -| IsEquals() |public static bool IsEquals(double d1, double d2)| -| IsEquals() |public static bool IsEquals(float d1, float d2)| -| IsIngore() |public static bool IsIngore(Vector3 pos)| -| IsInRect() |public static bool IsInRect(Vector3 pos, float xMin, float xMax, float yMin, float yMax)| -| IsPointInQuadrilateral() |public static bool IsPointInQuadrilateral(Vector3 P, Vector3 A, Vector3 B, Vector3 C, Vector3 D)| -| IsValueEqualsColor() |public static bool IsValueEqualsColor(Color color1, Color color2)| -| IsValueEqualsColor() |public static bool IsValueEqualsColor(Color32 color1, Color32 color2)| -| IsValueEqualsList<T>() |public static bool IsValueEqualsList<T>(List<T> list1, List<T> list2)| -| IsValueEqualsString() |public static bool IsValueEqualsString(string str1, string str2)| -| IsValueEqualsVector2() |public static bool IsValueEqualsVector2(Vector2 v1, Vector2 v2)| -| IsValueEqualsVector3() |public static bool IsValueEqualsVector3(Vector3 v1, Vector3 v2)| -| IsZeroVector() |public static bool IsZeroVector(Vector3 pos)| -| ParseFloatFromString() |public static List<float> ParseFloatFromString(string jsonData)| -| ParseStringFromString() |public static List<string> ParseStringFromString(string jsonData)| -| RemoveComponent<T>() |public static void RemoveComponent<T>(GameObject gameObject)| -| RotateRound() |public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| -| SaveAsImage() |public static Texture2D SaveAsImage(RectTransform rectTransform, Canvas canvas, string imageType = "png", string path = "")| -| SetActive() |public static void SetActive(GameObject gameObject, bool active)| -| SetActive() |public static void SetActive(Image image, bool active)| -| SetActive() |public static void SetActive(Text text, bool active)| -| SetActive() |public static void SetActive(Transform transform, bool active)<br/>通过设置scale实现是否显示,优化性能,减少GC | -| SetBackground() |public static void SetBackground(Image background, ImageStyle imageStyle)| -| SetColorOpacity() |public static void SetColorOpacity(ref Color32 color, float opacity)| +|ActiveAllObject()||public static void ActiveAllObject(Transform parent, bool active, string match = null)| +|AddIcon()||public static Image AddIcon(string name, Transform parent, IconStyle iconStyle)| +|Cancat()||public static string Cancat(string str1, int i)| +|Cancat()||public static string Cancat(string str1, string str2)| +|ClearEventListener()||public static void ClearEventListener(GameObject obj)| +|CopyArray<T>()||public static bool CopyArray<T>(T[] toList, T[] fromList)| +|CopyList<T>()||public static bool CopyList<T>(List<T> toList, List<T> fromList)| +|DestoryGameObject()||public static void DestoryGameObject(GameObject go)| +|DestoryGameObject()||public static void DestoryGameObject(Transform parent, string childName)| +|DestoryGameObjectByMatch()||public static void DestoryGameObjectByMatch(Transform parent, string containString)| +|DestroyAllChildren()||public static void DestroyAllChildren(Transform parent)| +|EnsureComponent<T>()||public static T EnsureComponent<T>(GameObject gameObject) where T : Component<br/>Ensure that the game object has the specified component, add it if not. | +|EnsureComponent<T>()||public static T EnsureComponent<T>(Transform transform) where T : Component<br/>Ensure that the transform has the specified component, add it if not. | +|GetActualValue()||public static float GetActualValue(float valueOrRate, float total, float maxRate = 1.5f)| +|GetAngle360()||public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | +|GetBlurColor()||public static Color32 GetBlurColor(Color32 color, float a = 0.3f)| +|GetColor()||public static Color32 GetColor(string hexColorStr)| +|GetDire()||public static Vector3 GetDire(float angle, bool isDegree = false)| +|GetFullName()||public static string GetFullName(Transform transform)| +|GetHighlightColor()||public static Color32 GetHighlightColor(Color32 color, float rate = 0.8f)| +|GetLastValue()||public static Vector3 GetLastValue(List<Vector3> list)| +|GetMaxDivisibleValue()||public static double GetMaxDivisibleValue(double max, double ceilRate)| +|GetMaxLogValue()||public static double GetMaxLogValue(double value, float logBase, bool isLogBaseE, out int splitNumber)| +|GetMinDivisibleValue()||public static double GetMinDivisibleValue(double min, double ceilRate)| +|GetMinLogValue()||public static double GetMinLogValue(double value, float logBase, bool isLogBaseE, out int splitNumber)| +|GetOrAddComponent<T>()||public static T GetOrAddComponent<T>(GameObject gameObject) where T : Component| +|GetOrAddComponent<T>()||public static T GetOrAddComponent<T>(Transform transform) where T : Component| +|GetPointList()||public static void GetPointList(ref List<Vector3> posList, Vector3 sp, Vector3 ep, float k = 30f)| +|GetPos()||public static Vector3 GetPos(Vector3 center, float radius, float angle, bool isDegree = false)| +|GetPosition()||public static Vector3 GetPosition(Vector3 center, float angle, float radius)| +|GetSelectColor()||public static Color32 GetSelectColor(Color32 color, float rate = 0.8f)| +|GetVertialDire()||public static Vector3 GetVertialDire(Vector3 dire)| +|HideAllObject()||public static void HideAllObject(GameObject obj, string match = null)| +|HideAllObject()||public static void HideAllObject(Transform parent, string match = null)| +|IsClearColor()||public static bool IsClearColor(Color color)| +|IsClearColor()||public static bool IsClearColor(Color32 color)| +|IsColorAlphaZero()||public static bool IsColorAlphaZero(Color color)| +|IsEquals()||public static bool IsEquals(double d1, double d2)| +|IsEquals()||public static bool IsEquals(float d1, float d2)| +|IsIngore()||public static bool IsIngore(Vector3 pos)| +|IsInRect()||public static bool IsInRect(Vector3 pos, float xMin, float xMax, float yMin, float yMax)| +|IsPointInQuadrilateral()||public static bool IsPointInQuadrilateral(Vector3 P, Vector3 A, Vector3 B, Vector3 C, Vector3 D)| +|IsValueEqualsColor()||public static bool IsValueEqualsColor(Color color1, Color color2)| +|IsValueEqualsColor()||public static bool IsValueEqualsColor(Color32 color1, Color32 color2)| +|IsValueEqualsList<T>()||public static bool IsValueEqualsList<T>(List<T> list1, List<T> list2)| +|IsValueEqualsString()||public static bool IsValueEqualsString(string str1, string str2)| +|IsValueEqualsVector2()||public static bool IsValueEqualsVector2(Vector2 v1, Vector2 v2)| +|IsValueEqualsVector3()||public static bool IsValueEqualsVector3(Vector3 v1, Vector3 v2)| +|IsZeroVector()||public static bool IsZeroVector(Vector3 pos)| +|ParseFloatFromString()||public static List<float> ParseFloatFromString(string jsonData)| +|ParseStringFromString()||public static List<string> ParseStringFromString(string jsonData)| +|RemoveComponent<T>()||public static void RemoveComponent<T>(GameObject gameObject)| +|RotateRound()||public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| +|SaveAsImage()||public static Texture2D SaveAsImage(RectTransform rectTransform, Canvas canvas, string imageType = "png", string path = "")| +|SetActive()||public static void SetActive(GameObject gameObject, bool active)| +|SetActive()||public static void SetActive(Image image, bool active)| +|SetActive()||public static void SetActive(Text text, bool active)| +|SetActive()||public static void SetActive(Transform transform, bool active)<br/>通过设置scale实现是否显示,优化性能,减少GC | +|SetBackground()||public static void SetBackground(Image background, ImageStyle imageStyle)| +|SetColorOpacity()||public static void SetColorOpacity(ref Color32 color, float opacity)| ## ChartLabel Inherits or Implemented: [Image](#image) -|public method|description| +|public method|since|description| |--|--| -| GetHeight() |public float GetHeight()| -| GetPosition() |public Vector3 GetPosition()| -| GetTextHeight() |public float GetTextHeight()| -| GetTextWidth() |public float GetTextWidth()| -| GetWidth() |public float GetWidth()| -| IsActive() |public override bool IsActive()| -| SetActive() |public void SetActive(bool flag)| -| SetIcon() |public void SetIcon(Image image)| -| SetIconActive() |public void SetIconActive(bool flag)| -| SetIconSize() |public void SetIconSize(float width, float height)| -| SetIconSprite() |public void SetIconSprite(Sprite sprite)| -| SetPadding() |public void SetPadding(float[] padding)| -| SetPosition() |public void SetPosition(Vector3 position)| -| SetRectPosition() |public void SetRectPosition(Vector3 position)| -| SetSize() |public void SetSize(float width, float height)| -| SetText() |public bool SetText(string text)| -| SetTextActive() |public void SetTextActive(bool flag)| -| SetTextColor() |public void SetTextColor(Color color)| -| SetTextPadding() |public void SetTextPadding(TextPadding padding)| -| SetTextRotate() |public void SetTextRotate(float rotate)| -| UpdateIcon() |public void UpdateIcon(IconStyle iconStyle, Sprite sprite = null)| +|GetHeight()||public float GetHeight()| +|GetPosition()||public Vector3 GetPosition()| +|GetTextHeight()||public float GetTextHeight()| +|GetTextWidth()||public float GetTextWidth()| +|GetWidth()||public float GetWidth()| +|IsActive()||public override bool IsActive()| +|SetActive()||public void SetActive(bool flag)| +|SetIcon()||public void SetIcon(Image image)| +|SetIconActive()||public void SetIconActive(bool flag)| +|SetIconSize()||public void SetIconSize(float width, float height)| +|SetIconSprite()||public void SetIconSprite(Sprite sprite)| +|SetPadding()||public void SetPadding(float[] padding)| +|SetPosition()||public void SetPosition(Vector3 position)| +|SetRectPosition()||public void SetRectPosition(Vector3 position)| +|SetSize()||public void SetSize(float width, float height)| +|SetText()||public bool SetText(string text)| +|SetTextActive()||public void SetTextActive(bool flag)| +|SetTextColor()||public void SetTextColor(Color color)| +|SetTextPadding()||public void SetTextPadding(TextPadding padding)| +|SetTextRotate()||public void SetTextRotate(float rotate)| +|UpdateIcon()||public void UpdateIcon(IconStyle iconStyle, Sprite sprite = null)| ## ChartObject -|public method|description| +|public method|since|description| |--|--| -| Destroy() |public virtual void Destroy()| +|Destroy()||public virtual void Destroy()| ## CheckHelper -|public method|description| +|public method|since|description| |--|--| -| CheckChart() |public static string CheckChart(BaseChart chart)| -| CheckChart() |public static string CheckChart(BaseGraph chart)| +|CheckChart()||public static string CheckChart(BaseChart chart)| +|CheckChart()||public static string CheckChart(BaseGraph chart)| ## ColorUtil -|public method|description| +|public method|since|description| |--|--| -| GetColor() |public static Color32 GetColor(string hexColorStr)<br/>Convert the html string to color. | +|GetColor()||public static Color32 GetColor(string hexColorStr)<br/>Convert the html string to color. | ## ComponentHandlerAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| ComponentHandlerAttribute() |public ComponentHandlerAttribute(Type handler)| -| ComponentHandlerAttribute() |public ComponentHandlerAttribute(Type handler, bool allowMultiple)| +|ComponentHandlerAttribute()||public ComponentHandlerAttribute(Type handler)| +|ComponentHandlerAttribute()||public ComponentHandlerAttribute(Type handler, bool allowMultiple)| ## ComponentHelper -|public method|description| +|public method|since|description| |--|--| -| GetAngleAxis() |public static AngleAxis GetAngleAxis(List<MainComponent> components, int polarIndex)| -| GetRadiusAxis() |public static RadiusAxis GetRadiusAxis(List<MainComponent> components, int polarIndex)| -| GetXAxisOnZeroOffset() |public static float GetXAxisOnZeroOffset(List<MainComponent> components, XAxis axis)| -| GetYAxisOnZeroOffset() |public static float GetYAxisOnZeroOffset(List<MainComponent> components, YAxis axis)| -| IsAnyCategoryOfYAxis() |public static bool IsAnyCategoryOfYAxis(List<MainComponent> components)| +|GetAngleAxis()||public static AngleAxis GetAngleAxis(List<MainComponent> components, int polarIndex)| +|GetRadiusAxis()||public static RadiusAxis GetRadiusAxis(List<MainComponent> components, int polarIndex)| +|GetXAxisOnZeroOffset()||public static float GetXAxisOnZeroOffset(List<MainComponent> components, XAxis axis)| +|GetYAxisOnZeroOffset()||public static float GetYAxisOnZeroOffset(List<MainComponent> components, YAxis axis)| +|IsAnyCategoryOfYAxis()||public static bool IsAnyCategoryOfYAxis(List<MainComponent> components)| ## CoordOptionsAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains<T>() |public bool Contains<T>() where T : CoordSystem| -| CoordOptionsAttribute() |public CoordOptionsAttribute(Type coord)| -| CoordOptionsAttribute() |public CoordOptionsAttribute(Type coord, Type coord2)| -| CoordOptionsAttribute() |public CoordOptionsAttribute(Type coord, Type coord2, Type coord3)| -| CoordOptionsAttribute() |public CoordOptionsAttribute(Type coord, Type coord2, Type coord3, Type coord4)| +|Contains<T>()||public bool Contains<T>() where T : CoordSystem| +|CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord)| +|CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord, Type coord2)| +|CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord, Type coord2, Type coord3)| +|CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord, Type coord2, Type coord3, Type coord4)| ## DataZoomContext @@ -538,43 +538,43 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## DataZoomHelper -|public method|description| +|public method|since|description| |--|--| -| UpdateDataZoomRuntimeStartEndValue() |public static void UpdateDataZoomRuntimeStartEndValue(DataZoom dataZoom, Serie serie)| -| UpdateDataZoomRuntimeStartEndValue<T>() |public static void UpdateDataZoomRuntimeStartEndValue<T>(BaseChart chart) where T : Serie| +|UpdateDataZoomRuntimeStartEndValue()||public static void UpdateDataZoomRuntimeStartEndValue(DataZoom dataZoom, Serie serie)| +|UpdateDataZoomRuntimeStartEndValue<T>()||public static void UpdateDataZoomRuntimeStartEndValue<T>(BaseChart chart) where T : Serie| ## DateTimeUtil -|public method|description| +|public method|since|description| |--|--| -| GetDateTime() |public static DateTime GetDateTime(int timestamp)| -| GetTimestamp() |public static int GetTimestamp()| -| GetTimestamp() |public static int GetTimestamp(DateTime time)| +|GetDateTime()||public static DateTime GetDateTime(int timestamp)| +|GetTimestamp()||public static int GetTimestamp()| +|GetTimestamp()||public static int GetTimestamp(DateTime time)| ## DefaultAnimationAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| DefaultAnimationAttribute() |public DefaultAnimationAttribute(AnimationType handler)| +|DefaultAnimationAttribute()||public DefaultAnimationAttribute(AnimationType handler)| ## DefineSymbolsUtil -|public method|description| +|public method|since|description| |--|--| -| AddGlobalDefine() |public static void AddGlobalDefine(string symbol)| -| RemoveGlobalDefine() |public static void RemoveGlobalDefine(string symbol)| +|AddGlobalDefine()||public static void AddGlobalDefine(string symbol)| +|RemoveGlobalDefine()||public static void RemoveGlobalDefine(string symbol)| ## FormatterHelper -|public method|description| +|public method|since|description| |--|--| -| NeedFormat() |public static bool NeedFormat(string content)| -| ReplaceAxisLabelContent() |public static void ReplaceAxisLabelContent(ref string content, string numericFormatter, double value)| -| ReplaceAxisLabelContent() |public static void ReplaceAxisLabelContent(ref string content, string value)| -| TrimAndReplaceLine() |public static string TrimAndReplaceLine(string content)| -| TrimAndReplaceLine() |public static string TrimAndReplaceLine(StringBuilder sb)| +|NeedFormat()||public static bool NeedFormat(string content)| +|ReplaceAxisLabelContent()||public static void ReplaceAxisLabelContent(ref string content, string numericFormatter, double value)| +|ReplaceAxisLabelContent()||public static void ReplaceAxisLabelContent(ref string content, string value)| +|TrimAndReplaceLine()||public static string TrimAndReplaceLine(string content)| +|TrimAndReplaceLine()||public static string TrimAndReplaceLine(StringBuilder sb)| ## GridCoordContext @@ -588,39 +588,39 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| IgnoreDoc() |public IgnoreDoc()| +|IgnoreDoc()||public IgnoreDoc()| ## InputHelper -|public method|description| +|public method|since|description| |--|--| -| GetKeyDown() |public static bool GetKeyDown(KeyCode keyCode)| -| GetTouch() |public static Touch GetTouch(int v)| +|GetKeyDown()||public static bool GetKeyDown(KeyCode keyCode)| +|GetTouch()||public static Touch GetTouch(int v)| ## InteractData -|public method|description| +|public method|since|description| |--|--| -| Reset() |public void Reset()| -| SetColor() |public void SetColor(ref bool needInteract, Color32 color)| -| SetColor() |public void SetColor(ref bool needInteract, Color32 color, Color32 toColor)| -| SetValue() |public void SetValue(ref bool needInteract, float size)| -| SetValue() |public void SetValue(ref bool needInteract, float size, bool highlight, float rate = 1.3f)| -| SetValueAndColor() |public void SetValueAndColor(ref bool needInteract, float value, Color32 color)| -| SetValueAndColor() |public void SetValueAndColor(ref bool needInteract, float value, Color32 color, Color32 toColor)| -| TryGetColor() |public bool TryGetColor(ref Color32 color, ref bool interacting, float animationDuration = 250)| -| TryGetColor() |public bool TryGetColor(ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250)| -| TryGetValue() |public bool TryGetValue(ref float value, ref bool interacting, float animationDuration = 250)| -| TryGetValueAndColor() |public bool TryGetValueAndColor(ref float value, ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250)| +|Reset()||public void Reset()| +|SetColor()||public void SetColor(ref bool needInteract, Color32 color)| +|SetColor()||public void SetColor(ref bool needInteract, Color32 color, Color32 toColor)| +|SetValue()||public void SetValue(ref bool needInteract, float size)| +|SetValue()||public void SetValue(ref bool needInteract, float size, bool highlight, float rate = 1.3f)| +|SetValueAndColor()||public void SetValueAndColor(ref bool needInteract, float value, Color32 color)| +|SetValueAndColor()||public void SetValueAndColor(ref bool needInteract, float value, Color32 color, Color32 toColor)| +|TryGetColor()||public bool TryGetColor(ref Color32 color, ref bool interacting, float animationDuration = 250)| +|TryGetColor()||public bool TryGetColor(ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250)| +|TryGetValue()||public bool TryGetValue(ref float value, ref bool interacting, float animationDuration = 250)| +|TryGetValueAndColor()||public bool TryGetValueAndColor(ref float value, ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250)| ## LayerHelper -|public method|description| +|public method|since|description| |--|--| -| IsFixedWidthHeight() |public static bool IsFixedWidthHeight(RectTransform rt)| -| IsStretchPivot() |public static bool IsStretchPivot(RectTransform rt)| +|IsFixedWidthHeight()||public static bool IsFixedWidthHeight(RectTransform rt)| +|IsStretchPivot()||public static bool IsStretchPivot(RectTransform rt)| ## LegendContext @@ -628,37 +628,37 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## LegendHelper -|public method|description| +|public method|since|description| |--|--| -| CheckDataHighlighted() |public static bool CheckDataHighlighted(Serie serie, string legendName, bool heighlight)| -| CheckDataShow() |public static bool CheckDataShow(Serie serie, string legendName, bool show)| -| GetContentColor() |public static Color GetContentColor(BaseChart chart, int legendIndex, string legendName, Legend legend, ThemeStyle theme, bool active)| -| GetIconColor() |public static Color GetIconColor(BaseChart chart, Legend legend, int readIndex, string legendName, bool active)| -| ResetItemPosition() |public static void ResetItemPosition(Legend legend, Vector3 chartPos, float chartWidth, float chartHeight)| -| SetLegendBackground() |public static void SetLegendBackground(Legend legend, ImageStyle style)| +|CheckDataHighlighted()||public static bool CheckDataHighlighted(Serie serie, string legendName, bool heighlight)| +|CheckDataShow()||public static bool CheckDataShow(Serie serie, string legendName, bool show)| +|GetContentColor()||public static Color GetContentColor(BaseChart chart, int legendIndex, string legendName, Legend legend, ThemeStyle theme, bool active)| +|GetIconColor()||public static Color GetIconColor(BaseChart chart, Legend legend, int readIndex, string legendName, bool active)| +|ResetItemPosition()||public static void ResetItemPosition(Legend legend, Vector3 chartPos, float chartWidth, float chartHeight)| +|SetLegendBackground()||public static void SetLegendBackground(Legend legend, ImageStyle style)| ## LegendItem -|public method|description| +|public method|since|description| |--|--| -| GetIconColor() |public Color GetIconColor()| -| GetIconRect() |public Rect GetIconRect()| -| SetActive() |public void SetActive(bool active)| -| SetBackground() |public void SetBackground(ImageStyle imageStyle)| -| SetButton() |public void SetButton(Button button)| -| SetContent() |public bool SetContent(string content)| -| SetContentBackgroundColor() |public void SetContentBackgroundColor(Color color)| -| SetContentColor() |public void SetContentColor(Color color)| -| SetContentPosition() |public void SetContentPosition(Vector3 offset)| -| SetIcon() |public void SetIcon(Image icon)| -| SetIconActive() |public void SetIconActive(bool active)| -| SetIconColor() |public void SetIconColor(Color color)| -| SetIconImage() |public void SetIconImage(Sprite image)| -| SetIconSize() |public void SetIconSize(float width, float height)| -| SetObject() |public void SetObject(GameObject obj)| -| SetPosition() |public void SetPosition(Vector3 position)| -| SetText() |public void SetText(ChartText text)| -| SetTextBackground() |public void SetTextBackground(Image image)| +|GetIconColor()||public Color GetIconColor()| +|GetIconRect()||public Rect GetIconRect()| +|SetActive()||public void SetActive(bool active)| +|SetBackground()||public void SetBackground(ImageStyle imageStyle)| +|SetButton()||public void SetButton(Button button)| +|SetContent()||public bool SetContent(string content)| +|SetContentBackgroundColor()||public void SetContentBackgroundColor(Color color)| +|SetContentColor()||public void SetContentColor(Color color)| +|SetContentPosition()||public void SetContentPosition(Vector3 offset)| +|SetIcon()||public void SetIcon(Image icon)| +|SetIconActive()||public void SetIconActive(bool active)| +|SetIconColor()||public void SetIconColor(Color color)| +|SetIconImage()||public void SetIconImage(Sprite image)| +|SetIconSize()||public void SetIconSize(float width, float height)| +|SetObject()||public void SetObject(GameObject obj)| +|SetPosition()||public void SetPosition(Vector3 position)| +|SetText()||public void SetText(ChartText text)| +|SetTextBackground()||public void SetTextBackground(Image image)| ## LineChart @@ -668,49 +668,49 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| ListFor() |public ListFor(Type type)| +|ListFor()||public ListFor(Type type)| ## ListForComponent Inherits or Implemented: [ListFor](#listfor) -|public method|description| +|public method|since|description| |--|--| -| ListForComponent() |public ListForComponent(Type type) : base(type)| +|ListForComponent()||public ListForComponent(Type type) : base(type)| ## ListForSerie Inherits or Implemented: [ListFor](#listfor) -|public method|description| +|public method|since|description| |--|--| -| ListForSerie() |public ListForSerie(Type type) : base(type)| +|ListForSerie()||public ListForSerie(Type type) : base(type)| ## MainComponentContext ## MainComponentHandler -|public method|description| +|public method|since|description| |--|--| -| CheckComponent() |public virtual void CheckComponent(StringBuilder sb) { }| -| DrawBase() |public virtual void DrawBase(VertexHelper vh) { }| -| DrawTop() |public virtual void DrawTop(VertexHelper vh) { }| -| DrawUpper() |public virtual void DrawUpper(VertexHelper vh) { }| -| InitComponent() |public virtual void InitComponent() { }| -| OnBeginDrag() |public virtual void OnBeginDrag(PointerEventData eventData) { }| -| OnDrag() |public virtual void OnDrag(PointerEventData eventData) { }| -| OnEndDrag() |public virtual void OnEndDrag(PointerEventData eventData) { }| -| OnPointerClick() |public virtual void OnPointerClick(PointerEventData eventData) { }| -| OnPointerDown() |public virtual void OnPointerDown(PointerEventData eventData) { }| -| OnPointerEnter() |public virtual void OnPointerEnter(PointerEventData eventData) { }| -| OnPointerExit() |public virtual void OnPointerExit(PointerEventData eventData) { }| -| OnPointerUp() |public virtual void OnPointerUp(PointerEventData eventData) { }| -| OnScroll() |public virtual void OnScroll(PointerEventData eventData) { }| -| OnSerieDataUpdate() |public virtual void OnSerieDataUpdate(int serieIndex) { }| -| RemoveComponent() |public virtual void RemoveComponent() { }| -| Update() |public virtual void Update() { }| +|CheckComponent()||public virtual void CheckComponent(StringBuilder sb) { }| +|DrawBase()||public virtual void DrawBase(VertexHelper vh) { }| +|DrawTop()||public virtual void DrawTop(VertexHelper vh) { }| +|DrawUpper()||public virtual void DrawUpper(VertexHelper vh) { }| +|InitComponent()||public virtual void InitComponent() { }| +|OnBeginDrag()||public virtual void OnBeginDrag(PointerEventData eventData) { }| +|OnDrag()||public virtual void OnDrag(PointerEventData eventData) { }| +|OnEndDrag()||public virtual void OnEndDrag(PointerEventData eventData) { }| +|OnPointerClick()||public virtual void OnPointerClick(PointerEventData eventData) { }| +|OnPointerDown()||public virtual void OnPointerDown(PointerEventData eventData) { }| +|OnPointerEnter()||public virtual void OnPointerEnter(PointerEventData eventData) { }| +|OnPointerExit()||public virtual void OnPointerExit(PointerEventData eventData) { }| +|OnPointerUp()||public virtual void OnPointerUp(PointerEventData eventData) { }| +|OnScroll()||public virtual void OnScroll(PointerEventData eventData) { }| +|OnSerieDataUpdate()||public virtual void OnSerieDataUpdate(int serieIndex) { }| +|RemoveComponent()||public virtual void RemoveComponent() { }| +|Update()||public virtual void Update() { }| ## MainComponentHandler<T> @@ -718,39 +718,39 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) ## MathUtil -|public method|description| +|public method|since|description| |--|--| -| Abs() |public static double Abs(double d)| -| Approximately() |public static bool Approximately(double a, double b)| -| Clamp() |public static double Clamp(double d, double min, double max)| -| Clamp01() |public static double Clamp01(double value)| -| GetPrecision() |public static int GetPrecision(double value)| -| IsInteger() |public static bool IsInteger(double value)| -| Lerp() |public static double Lerp(double a, double b, double t)| +|Abs()||public static double Abs(double d)| +|Approximately()||public static bool Approximately(double a, double b)| +|Clamp()||public static double Clamp(double d, double min, double max)| +|Clamp01()||public static double Clamp01(double value)| +|GetPrecision()||public static int GetPrecision(double value)| +|IsInteger()||public static bool IsInteger(double value)| +|Lerp()||public static double Lerp(double a, double b, double t)| ## ObjectPool<T> where T Inherits or Implemented: [new()](#new()) -|public method|description| +|public method|since|description| |--|--| -| ClearAll() |public void ClearAll()| -| Get() |public T Get()| -| new() |public class ObjectPool<T> where T : new()| -| ObjectPool() |public ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease, bool newIfEmpty = true)| -| Release() |public void Release(T element)| +|ClearAll()||public void ClearAll()| +|Get()||public T Get()| +|new()||public class ObjectPool<T> where T : new()| +|ObjectPool()||public ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease, bool newIfEmpty = true)| +|Release()||public void Release(T element)| ## Painter Inherits or Implemented: [MaskableGraphic](#maskablegraphic) -|public method|description| +|public method|since|description| |--|--| -| onPopulateMesh |public Action<VertexHelper, Painter> onPopulateMesh| -| CheckRefresh() |public void CheckRefresh()| -| Init() |public void Init()| -| Refresh() |public void Refresh()| -| SetActive() |public void SetActive(bool flag, bool isDebugMode = false)| +|onPopulateMesh||public Action<VertexHelper, Painter> onPopulateMesh| +|CheckRefresh()||public void CheckRefresh()| +|Init()||public void Init()| +|Refresh()||public void Refresh()| +|SetActive()||public void SetActive(bool flag, bool isDebugMode = false)| ## ParallelChart @@ -774,12 +774,12 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## PropertyUtil -|public method|description| +|public method|since|description| |--|--| -| SetClass<T>() |public static bool SetClass<T>(ref T currentValue, T newValue, bool notNull = false) where T : class| -| SetColor() |public static bool SetColor(ref Color currentValue, Color newValue)| -| SetColor() |public static bool SetColor(ref Color32 currentValue, Color32 newValue)| -| SetStruct<T>() |public static bool SetStruct<T>(ref T currentValue, T newValue) where T : struct| +|SetClass<T>()||public static bool SetClass<T>(ref T currentValue, T newValue, bool notNull = false) where T : class| +|SetColor()||public static bool SetColor(ref Color currentValue, Color newValue)| +|SetColor()||public static bool SetColor(ref Color32 currentValue, Color32 newValue)| +|SetStruct<T>()||public static bool SetStruct<T>(ref T currentValue, T newValue) where T : struct| ## RadarChart @@ -791,24 +791,24 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## ReflectionUtil -|public method|description| +|public method|since|description| |--|--| -| DeepCloneSerializeField() |public static object DeepCloneSerializeField(object obj)| -| InvokeListAdd() |public static void InvokeListAdd(object obj, FieldInfo field, object item)| -| InvokeListAddTo<T>() |public static void InvokeListAddTo<T>(object obj, FieldInfo field, Action<T> callback)| -| InvokeListClear() |public static void InvokeListClear(object obj, FieldInfo field)| -| InvokeListCount() |public static int InvokeListCount(object obj, FieldInfo field)| -| InvokeListGet<T>() |public static T InvokeListGet<T>(object obj, FieldInfo field, int i)| +|DeepCloneSerializeField()||public static object DeepCloneSerializeField(object obj)| +|InvokeListAdd()||public static void InvokeListAdd(object obj, FieldInfo field, object item)| +|InvokeListAddTo<T>()||public static void InvokeListAddTo<T>(object obj, FieldInfo field, Action<T> callback)| +|InvokeListClear()||public static void InvokeListClear(object obj, FieldInfo field)| +|InvokeListCount()||public static int InvokeListCount(object obj, FieldInfo field)| +|InvokeListGet<T>()||public static T InvokeListGet<T>(object obj, FieldInfo field, int i)| ## RequireChartComponentAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| RequireChartComponentAttribute() |public RequireChartComponentAttribute(Type requiredComponent)| -| RequireChartComponentAttribute() |public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2)| -| RequireChartComponentAttribute() |public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2, Type requiredComponent3)| +|RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent)| +|RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2)| +|RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2, Type requiredComponent3)| ## RingChart @@ -816,14 +816,14 @@ Inherits or Implemented: [BaseChart](#basechart) ## RuntimeUtil -|public method|description| +|public method|since|description| |--|--| -| GetAllAssemblyTypes() |public static IEnumerable<Type> GetAllAssemblyTypes()| -| GetAllTypesDerivedFrom() |public static IEnumerable<Type> GetAllTypesDerivedFrom(Type type)| -| GetAllTypesDerivedFrom<T>() |public static IEnumerable<Type> GetAllTypesDerivedFrom<T>()| -| GetAttribute<T>() |public static T GetAttribute<T>(this MemberInfo type, bool check = true) where T : Attribute| -| GetAttribute<T>() |public static T GetAttribute<T>(this Type type, bool check = true) where T : Attribute| -| HasSubclass() |public static bool HasSubclass(Type type)| +|GetAllAssemblyTypes()||public static IEnumerable<Type> GetAllAssemblyTypes()| +|GetAllTypesDerivedFrom()||public static IEnumerable<Type> GetAllTypesDerivedFrom(Type type)| +|GetAllTypesDerivedFrom<T>()||public static IEnumerable<Type> GetAllTypesDerivedFrom<T>()| +|GetAttribute<T>()||public static T GetAttribute<T>(this MemberInfo type, bool check = true) where T : Attribute| +|GetAttribute<T>()||public static T GetAttribute<T>(this Type type, bool check = true) where T : Attribute| +|HasSubclass()||public static bool HasSubclass(Type type)| ## ScatterChart @@ -833,18 +833,18 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : ISerieComponent| -| SerieComponentAttribute() |public SerieComponentAttribute()| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| +|Contains()||public bool Contains(Type type)| +|Contains<T>()||public bool Contains<T>() where T : ISerieComponent| +|SerieComponentAttribute()||public SerieComponentAttribute()| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| ## SerieContext @@ -852,209 +852,209 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : Serie| -| SerieConvertAttribute() |public SerieConvertAttribute(Type serie)| -| SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2)| -| SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2, Type serie3)| -| SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2, Type serie3, Type serie4)| +|Contains()||public bool Contains(Type type)| +|Contains<T>()||public bool Contains<T>() where T : Serie| +|SerieConvertAttribute()||public SerieConvertAttribute(Type serie)| +|SerieConvertAttribute()||public SerieConvertAttribute(Type serie, Type serie2)| +|SerieConvertAttribute()||public SerieConvertAttribute(Type serie, Type serie2, Type serie3)| +|SerieConvertAttribute()||public SerieConvertAttribute(Type serie, Type serie2, Type serie3, Type serie4)| ## SerieDataComponentAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : ISerieComponent| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute()| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| +|Contains()||public bool Contains(Type type)| +|Contains<T>()||public bool Contains<T>() where T : ISerieComponent| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute()| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| ## SerieDataContext -|public method|description| +|public method|since|description| |--|--| -| Reset() |public void Reset()| +|Reset()||public void Reset()| ## SerieDataExtraFieldAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains() |public bool Contains(string field)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute()| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6, string field7)| +|Contains()||public bool Contains(string field)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute()| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6, string field7)| ## SerieEventData -|public method|description| +|public method|since|description| |--|--| -| Reset() |public void Reset()| +|Reset()||public void Reset()| ## SerieEventDataPool -|public method|description| +|public method|since|description| |--|--| -| Get() |public static SerieEventData Get(Vector3 pos, int serieIndex, int dataIndex, int dimension, double value)| -| Release() |public static void Release(SerieEventData toRelease)| +|Get()||public static SerieEventData Get(Vector3 pos, int serieIndex, int dataIndex, int dimension, double value)| +|Release()||public static void Release(SerieEventData toRelease)| ## SerieHandler -|public method|description| +|public method|since|description| |--|--| -| CheckComponent() |public virtual void CheckComponent(StringBuilder sb) { }| -| DrawBase() |public virtual void DrawBase(VertexHelper vh) { }| -| DrawSerie() |public virtual void DrawSerie(VertexHelper vh) { }| -| DrawTop() |public virtual void DrawTop(VertexHelper vh) { }| -| DrawUpper() |public virtual void DrawUpper(VertexHelper vh) { }| -| InitComponent() |public virtual void InitComponent() { }| -| OnBeginDrag() |public virtual void OnBeginDrag(PointerEventData eventData) { }| -| OnDrag() |public virtual void OnDrag(PointerEventData eventData) { }| -| OnEndDrag() |public virtual void OnEndDrag(PointerEventData eventData) { }| -| OnLegendButtonClick() |public virtual void OnLegendButtonClick(int index, string legendName, bool show) { }| -| OnLegendButtonEnter() |public virtual void OnLegendButtonEnter(int index, string legendName) { }| -| OnLegendButtonExit() |public virtual void OnLegendButtonExit(int index, string legendName) { }| -| OnPointerClick() |public virtual void OnPointerClick(PointerEventData eventData) { }| -| OnPointerDown() |public virtual void OnPointerDown(PointerEventData eventData) { }| -| OnPointerEnter() |public virtual void OnPointerEnter(PointerEventData eventData) { }| -| OnPointerExit() |public virtual void OnPointerExit(PointerEventData eventData) { }| -| OnPointerUp() |public virtual void OnPointerUp(PointerEventData eventData) { }| -| OnScroll() |public virtual void OnScroll(PointerEventData eventData) { }| -| RefreshLabelInternal() |public virtual void RefreshLabelInternal() { }| -| RefreshLabelNextFrame() |public virtual void RefreshLabelNextFrame() { }| -| RemoveComponent() |public virtual void RemoveComponent() { }| -| Update() |public virtual void Update() { }| -| UpdateSerieContext() |public virtual void UpdateSerieContext() { }| +|CheckComponent()||public virtual void CheckComponent(StringBuilder sb) { }| +|DrawBase()||public virtual void DrawBase(VertexHelper vh) { }| +|DrawSerie()||public virtual void DrawSerie(VertexHelper vh) { }| +|DrawTop()||public virtual void DrawTop(VertexHelper vh) { }| +|DrawUpper()||public virtual void DrawUpper(VertexHelper vh) { }| +|InitComponent()||public virtual void InitComponent() { }| +|OnBeginDrag()||public virtual void OnBeginDrag(PointerEventData eventData) { }| +|OnDrag()||public virtual void OnDrag(PointerEventData eventData) { }| +|OnEndDrag()||public virtual void OnEndDrag(PointerEventData eventData) { }| +|OnLegendButtonClick()||public virtual void OnLegendButtonClick(int index, string legendName, bool show) { }| +|OnLegendButtonEnter()||public virtual void OnLegendButtonEnter(int index, string legendName) { }| +|OnLegendButtonExit()||public virtual void OnLegendButtonExit(int index, string legendName) { }| +|OnPointerClick()||public virtual void OnPointerClick(PointerEventData eventData) { }| +|OnPointerDown()||public virtual void OnPointerDown(PointerEventData eventData) { }| +|OnPointerEnter()||public virtual void OnPointerEnter(PointerEventData eventData) { }| +|OnPointerExit()||public virtual void OnPointerExit(PointerEventData eventData) { }| +|OnPointerUp()||public virtual void OnPointerUp(PointerEventData eventData) { }| +|OnScroll()||public virtual void OnScroll(PointerEventData eventData) { }| +|RefreshLabelInternal()||public virtual void RefreshLabelInternal() { }| +|RefreshLabelNextFrame()||public virtual void RefreshLabelNextFrame() { }| +|RemoveComponent()||public virtual void RemoveComponent() { }| +|Update()||public virtual void Update() { }| +|UpdateSerieContext()||public virtual void UpdateSerieContext() { }| ## SerieHandler<T> Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](#serie) -|public method|description| +|public method|since|description| |--|--| -| DrawLabelLineSymbol() |public void DrawLabelLineSymbol(VertexHelper vh, LabelLine labelLine, Vector3 startPos, Vector3 endPos, Color32 defaultColor)| -| GetPointerItemDataDimension() |public override int GetPointerItemDataDimension()| -| GetPointerItemDataIndex() |public override int GetPointerItemDataIndex()| -| GetSerieDataAutoColor() |public virtual Color GetSerieDataAutoColor(SerieData serieData)| -| GetSerieDataLabelOffset() |public virtual Vector3 GetSerieDataLabelOffset(SerieData serieData, LabelStyle label)| -| GetSerieDataLabelPosition() |public virtual Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)| -| GetSerieDataTitlePosition() |public virtual Vector3 GetSerieDataTitlePosition(SerieData serieData, TitleStyle titleStyle)| -| InitComponent() |public override void InitComponent()| -| OnLegendButtonClick() |public override void OnLegendButtonClick(int index, string legendName, bool show)| -| OnLegendButtonEnter() |public override void OnLegendButtonEnter(int index, string legendName)| -| OnLegendButtonExit() |public override void OnLegendButtonExit(int index, string legendName)| -| OnPointerClick() |public override void OnPointerClick(PointerEventData eventData)| -| OnPointerDown() |public override void OnPointerDown(PointerEventData eventData)| -| RefreshEndLabelInternal() |public virtual void RefreshEndLabelInternal()| -| RefreshLabelInternal() |public override void RefreshLabelInternal()| -| RefreshLabelNextFrame() |public override void RefreshLabelNextFrame()| -| RemoveComponent() |public override void RemoveComponent()| -| Update() |public override void Update()| +|DrawLabelLineSymbol()||public void DrawLabelLineSymbol(VertexHelper vh, LabelLine labelLine, Vector3 startPos, Vector3 endPos, Color32 defaultColor)| +|GetPointerItemDataDimension()||public override int GetPointerItemDataDimension()| +|GetPointerItemDataIndex()||public override int GetPointerItemDataIndex()| +|GetSerieDataAutoColor()||public virtual Color GetSerieDataAutoColor(SerieData serieData)| +|GetSerieDataLabelOffset()||public virtual Vector3 GetSerieDataLabelOffset(SerieData serieData, LabelStyle label)| +|GetSerieDataLabelPosition()||public virtual Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)| +|GetSerieDataTitlePosition()||public virtual Vector3 GetSerieDataTitlePosition(SerieData serieData, TitleStyle titleStyle)| +|InitComponent()||public override void InitComponent()| +|OnLegendButtonClick()||public override void OnLegendButtonClick(int index, string legendName, bool show)| +|OnLegendButtonEnter()||public override void OnLegendButtonEnter(int index, string legendName)| +|OnLegendButtonExit()||public override void OnLegendButtonExit(int index, string legendName)| +|OnPointerClick()||public override void OnPointerClick(PointerEventData eventData)| +|OnPointerDown()||public override void OnPointerDown(PointerEventData eventData)| +|RefreshEndLabelInternal()||public virtual void RefreshEndLabelInternal()| +|RefreshLabelInternal()||public override void RefreshLabelInternal()| +|RefreshLabelNextFrame()||public override void RefreshLabelNextFrame()| +|RemoveComponent()||public override void RemoveComponent()| +|Update()||public override void Update()| ## SerieHandlerAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| SerieHandlerAttribute() |public SerieHandlerAttribute(Type handler)| -| SerieHandlerAttribute() |public SerieHandlerAttribute(Type handler, bool allowMultiple)| +|SerieHandlerAttribute()||public SerieHandlerAttribute(Type handler)| +|SerieHandlerAttribute()||public SerieHandlerAttribute(Type handler, bool allowMultiple)| ## SerieHelper -|public method|description| +|public method|since|description| |--|--| -| CloneSerie<T>() |public static T CloneSerie<T>(Serie serie) where T : Serie| -| CopySerie() |public static void CopySerie(Serie oldSerie, Serie newSerie)| -| GetAllMinMaxData() |public static void GetAllMinMaxData(Serie serie, double ceilRate = 0, DataZoom dataZoom = null)| -| GetAreaStyle() |public static AreaStyle GetAreaStyle(Serie serie, SerieData serieData)| -| GetAverageData() |public static double GetAverageData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetBlurStyle() |public static BlurStyle GetBlurStyle(Serie serie, SerieData serieData)| -| GetEmphasisStyle() |public static EmphasisStyle GetEmphasisStyle(Serie serie, SerieData serieData)| -| GetItemColor() |public static Color32 GetItemColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, SerieState state = SerieState.Auto, bool opacity = true)| -| GetItemFormatter() |public static string GetItemFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)| -| GetItemMarker() |public static string GetItemMarker(Serie serie, SerieData serieData, string defaultMarker = null)| -| GetItemStyle() |public static ItemStyle GetItemStyle(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| -| GetLineColor() |public static Color32 GetLineColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, SerieState state = SerieState.Auto)| -| GetLineStyle() |public static LineStyle GetLineStyle(Serie serie, SerieData serieData)| -| GetMaxData() |public static double GetMaxData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetMaxSerieData() |public static SerieData GetMaxSerieData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetMedianData() |public static double GetMedianData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetMinData() |public static double GetMinData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetMinMaxData() |public static void GetMinMaxData(Serie serie, out double min, out double max, DataZoom dataZoom = null, int dimension = 0)<br/>Gets the maximum and minimum values of all data in the serie. | -| GetMinSerieData() |public static SerieData GetMinSerieData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetNumericFormatter() |public static string GetNumericFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)| -| GetSelectStyle() |public static SelectStyle GetSelectStyle(Serie serie, SerieData serieData)| -| GetSerieLabel() |public static LabelStyle GetSerieLabel(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| -| GetSerieLabelLine() |public static LabelLine GetSerieLabelLine(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| -| GetSerieState() |public static SerieState GetSerieState(Serie serie)| -| GetSerieState() |public static SerieState GetSerieState(Serie serie, SerieData serieData, bool defaultSerieState = false)| -| GetSerieState() |public static SerieState GetSerieState(SerieData serieData)| -| GetSerieSymbol() |public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| -| GetStateStyle() |public static StateStyle GetStateStyle(Serie serie, SerieData serieData, SerieState state)| -| GetSysmbolSize() |public static float GetSysmbolSize(Serie serie, SerieData serieData, ThemeStyle theme, float defaultSize, SerieState state = SerieState.Auto)| -| GetTitleStyle() |public static TitleStyle GetTitleStyle(Serie serie, SerieData serieData)| -| IsAllZeroValue() |public static bool IsAllZeroValue(Serie serie, int dimension = 1)<br/>Whether the data for the specified dimension of serie are all 0. | -| IsDownPoint() |public static bool IsDownPoint(Serie serie, int index)| -| UpdateCenter() |public static void UpdateCenter(Serie serie, Vector3 chartPosition, float chartWidth, float chartHeight)<br/>更新运行时中心点和半径 | -| UpdateFilterData() |public static void UpdateFilterData(Serie serie, DataZoom dataZoom)<br/>根据dataZoom更新数据列表缓存 | -| UpdateMinMaxData() |public static void UpdateMinMaxData(Serie serie, int dimension, double ceilRate = 0, DataZoom dataZoom = null)<br/>获得指定维数的最大最小值 | -| UpdateRect() |public static void UpdateRect(Serie serie, Vector3 chartPosition, float chartWidth, float chartHeight)| -| UpdateSerieRuntimeFilterData() |public static void UpdateSerieRuntimeFilterData(Serie serie, bool filterInvisible = true)| +|CloneSerie<T>()||public static T CloneSerie<T>(Serie serie) where T : Serie| +|CopySerie()||public static void CopySerie(Serie oldSerie, Serie newSerie)| +|GetAllMinMaxData()||public static void GetAllMinMaxData(Serie serie, double ceilRate = 0, DataZoom dataZoom = null)| +|GetAreaStyle()||public static AreaStyle GetAreaStyle(Serie serie, SerieData serieData)| +|GetAverageData()||public static double GetAverageData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetBlurStyle()||public static BlurStyle GetBlurStyle(Serie serie, SerieData serieData)| +|GetEmphasisStyle()||public static EmphasisStyle GetEmphasisStyle(Serie serie, SerieData serieData)| +|GetItemColor()||public static Color32 GetItemColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, SerieState state = SerieState.Auto, bool opacity = true)| +|GetItemFormatter()||public static string GetItemFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)| +|GetItemMarker()||public static string GetItemMarker(Serie serie, SerieData serieData, string defaultMarker = null)| +|GetItemStyle()||public static ItemStyle GetItemStyle(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| +|GetLineColor()||public static Color32 GetLineColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, SerieState state = SerieState.Auto)| +|GetLineStyle()||public static LineStyle GetLineStyle(Serie serie, SerieData serieData)| +|GetMaxData()||public static double GetMaxData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetMaxSerieData()||public static SerieData GetMaxSerieData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetMedianData()||public static double GetMedianData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetMinData()||public static double GetMinData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetMinMaxData()||public static void GetMinMaxData(Serie serie, out double min, out double max, DataZoom dataZoom = null, int dimension = 0)<br/>Gets the maximum and minimum values of all data in the serie. | +|GetMinSerieData()||public static SerieData GetMinSerieData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetNumericFormatter()||public static string GetNumericFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)| +|GetSelectStyle()||public static SelectStyle GetSelectStyle(Serie serie, SerieData serieData)| +|GetSerieLabel()||public static LabelStyle GetSerieLabel(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| +|GetSerieLabelLine()||public static LabelLine GetSerieLabelLine(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| +|GetSerieState()||public static SerieState GetSerieState(Serie serie)| +|GetSerieState()||public static SerieState GetSerieState(Serie serie, SerieData serieData, bool defaultSerieState = false)| +|GetSerieState()||public static SerieState GetSerieState(SerieData serieData)| +|GetSerieSymbol()||public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| +|GetStateStyle()||public static StateStyle GetStateStyle(Serie serie, SerieData serieData, SerieState state)| +|GetSysmbolSize()||public static float GetSysmbolSize(Serie serie, SerieData serieData, ThemeStyle theme, float defaultSize, SerieState state = SerieState.Auto)| +|GetTitleStyle()||public static TitleStyle GetTitleStyle(Serie serie, SerieData serieData)| +|IsAllZeroValue()||public static bool IsAllZeroValue(Serie serie, int dimension = 1)<br/>Whether the data for the specified dimension of serie are all 0. | +|IsDownPoint()||public static bool IsDownPoint(Serie serie, int index)| +|UpdateCenter()||public static void UpdateCenter(Serie serie, Vector3 chartPosition, float chartWidth, float chartHeight)<br/>更新运行时中心点和半径 | +|UpdateFilterData()||public static void UpdateFilterData(Serie serie, DataZoom dataZoom)<br/>根据dataZoom更新数据列表缓存 | +|UpdateMinMaxData()||public static void UpdateMinMaxData(Serie serie, int dimension, double ceilRate = 0, DataZoom dataZoom = null)<br/>获得指定维数的最大最小值 | +|UpdateRect()||public static void UpdateRect(Serie serie, Vector3 chartPosition, float chartWidth, float chartHeight)| +|UpdateSerieRuntimeFilterData()||public static void UpdateSerieRuntimeFilterData(Serie serie, bool filterInvisible = true)| ## SerieLabelHelper -|public method|description| +|public method|since|description| |--|--| -| AvoidLabelOverlap() |public static void AvoidLabelOverlap(Serie serie, ComponentTheme theme)| -| CanShowLabel() |public static bool CanShowLabel(Serie serie, SerieData serieData, LabelStyle label, int dimesion)| -| GetLabelColor() |public static Color GetLabelColor(Serie serie, ThemeStyle theme, int index)| -| GetRealLabelPosition() |public static Vector3 GetRealLabelPosition(Serie serie, SerieData serieData, LabelStyle label, LabelLine labelLine)| -| SetGaugeLabelText() |public static void SetGaugeLabelText(Serie serie)| -| UpdatePieLabelPosition() |public static void UpdatePieLabelPosition(Serie serie, SerieData serieData)| +|AvoidLabelOverlap()||public static void AvoidLabelOverlap(Serie serie, ComponentTheme theme)| +|CanShowLabel()||public static bool CanShowLabel(Serie serie, SerieData serieData, LabelStyle label, int dimesion)| +|GetLabelColor()||public static Color GetLabelColor(Serie serie, ThemeStyle theme, int index)| +|GetRealLabelPosition()||public static Vector3 GetRealLabelPosition(Serie serie, SerieData serieData, LabelStyle label, LabelLine labelLine)| +|SetGaugeLabelText()||public static void SetGaugeLabelText(Serie serie)| +|UpdatePieLabelPosition()||public static void UpdatePieLabelPosition(Serie serie, SerieData serieData)| ## SerieLabelPool -|public method|description| +|public method|since|description| |--|--| -| ClearAll() |public static void ClearAll()| -| Release() |public static void Release(GameObject element)| -| ReleaseAll() |public static void ReleaseAll(Transform parent)| +|ClearAll()||public static void ClearAll()| +|Release()||public static void Release(GameObject element)| +|ReleaseAll()||public static void ReleaseAll(Transform parent)| ## SerieParams ## SeriesHelper -|public method|description| +|public method|since|description| |--|--| -| GetLastStackSerie() |public static Serie GetLastStackSerie(List<Serie> series, Serie serie)<br/>获得上一个同堆叠且显示的serie。 | -| GetLegalSerieNameList() |public static List<string> GetLegalSerieNameList(List<Serie> series)| -| GetMaxSerieDataCount() |public static int GetMaxSerieDataCount(List<Serie> series)| -| GetNameColor() |public static Color GetNameColor(BaseChart chart, int index, string name)| -| GetStackSeries() |public static void GetStackSeries(List<Serie> series, ref Dictionary<int, List<Serie>> stackSeries)<br/>获得堆叠系列列表 | -| IsAnyClipSerie() |public static bool IsAnyClipSerie(List<Serie> series)<br/>是否有需裁剪的serie。 | -| IsLegalLegendName() |public static bool IsLegalLegendName(string name)| -| IsPercentStack<T>() |public static bool IsPercentStack<T>(List<Serie> series) where T : Serie<br/>是否时百分比堆叠 | -| IsPercentStack<T>() |public static bool IsPercentStack<T>(List<Serie> series, string stackName) where T : Serie<br/>是否时百分比堆叠 | -| IsStack() |public static bool IsStack(List<Serie> series)<br/>是否由数据堆叠 | -| IsStack<T>() |public static bool IsStack<T>(List<Serie> series, string stackName) where T : Serie<br/>是否堆叠 | -| UpdateSerieNameList() |public static void UpdateSerieNameList(BaseChart chart, ref List<string> serieNameList)<br/>获得所有系列名,不包含空名字。 | -| UpdateStackDataList() |public static void UpdateStackDataList(List<Serie> series, Serie currSerie, DataZoom dataZoom, List<List<SerieData>> dataList)| +|GetLastStackSerie()||public static Serie GetLastStackSerie(List<Serie> series, Serie serie)<br/>获得上一个同堆叠且显示的serie。 | +|GetLegalSerieNameList()||public static List<string> GetLegalSerieNameList(List<Serie> series)| +|GetMaxSerieDataCount()||public static int GetMaxSerieDataCount(List<Serie> series)| +|GetNameColor()||public static Color GetNameColor(BaseChart chart, int index, string name)| +|GetStackSeries()||public static void GetStackSeries(List<Serie> series, ref Dictionary<int, List<Serie>> stackSeries)<br/>获得堆叠系列列表 | +|IsAnyClipSerie()||public static bool IsAnyClipSerie(List<Serie> series)<br/>是否有需裁剪的serie。 | +|IsLegalLegendName()||public static bool IsLegalLegendName(string name)| +|IsPercentStack<T>()||public static bool IsPercentStack<T>(List<Serie> series) where T : Serie<br/>是否时百分比堆叠 | +|IsPercentStack<T>()||public static bool IsPercentStack<T>(List<Serie> series, string stackName) where T : Serie<br/>是否时百分比堆叠 | +|IsStack()||public static bool IsStack(List<Serie> series)<br/>是否由数据堆叠 | +|IsStack<T>()||public static bool IsStack<T>(List<Serie> series, string stackName) where T : Serie<br/>是否堆叠 | +|UpdateSerieNameList()||public static void UpdateSerieNameList(BaseChart chart, ref List<string> serieNameList)<br/>获得所有系列名,不包含空名字。 | +|UpdateStackDataList()||public static void UpdateStackDataList(List<Serie> series, Serie currSerie, DataZoom dataZoom, List<List<SerieData>> dataList)| ## SimplifiedBarChart @@ -1072,17 +1072,17 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Since() |public Since(string version)| +|Since()||public Since(string version)| ## SVG -|public method|description| +|public method|since|description| |--|--| -| DrawPath() |public static void DrawPath(VertexHelper vh, string path)| -| DrawPath() |public static void DrawPath(VertexHelper vh, SVGPath path)| -| Test() |public static void Test(VertexHelper vh)| +|DrawPath()||public static void DrawPath(VertexHelper vh, string path)| +|DrawPath()||public static void DrawPath(VertexHelper vh, SVGPath path)| +|Test()||public static void Test(VertexHelper vh)| ## SVGImage @@ -1090,17 +1090,17 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## SVGPath -|public method|description| +|public method|since|description| |--|--| -| AddSegment() |public void AddSegment(SVGPathSeg seg)| -| Draw() |public void Draw(VertexHelper vh)| -| Parse() |public static SVGPath Parse(string path)| +|AddSegment()||public void AddSegment(SVGPathSeg seg)| +|Draw()||public void Draw(VertexHelper vh)| +|Parse()||public static SVGPath Parse(string path)| ## SVGPathSeg -|public method|description| +|public method|since|description| |--|--| -| SVGPathSeg() |public SVGPathSeg(SVGPathSegType type)| +|SVGPathSeg()||public SVGPathSeg(SVGPathSegType type)| ## TooltipContext @@ -1108,47 +1108,47 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## TooltipHelper -|public method|description| +|public method|since|description| |--|--| -| GetItemNumericFormatter() |public static string GetItemNumericFormatter(Tooltip tooltip, Serie serie, SerieData serieData)| -| GetLineColor() |public static Color32 GetLineColor(Tooltip tooltip, Color32 defaultColor)| -| IsIgnoreFormatter() |public static bool IsIgnoreFormatter(string itemFormatter)| -| LimitInRect() |public static void LimitInRect(Tooltip tooltip, Rect chartRect)| +|GetItemNumericFormatter()||public static string GetItemNumericFormatter(Tooltip tooltip, Serie serie, SerieData serieData)| +|GetLineColor()||public static Color32 GetLineColor(Tooltip tooltip, Color32 defaultColor)| +|IsIgnoreFormatter()||public static bool IsIgnoreFormatter(string itemFormatter)| +|LimitInRect()||public static void LimitInRect(Tooltip tooltip, Rect chartRect)| ## TooltipView -|public method|description| +|public method|since|description| |--|--| -| CreateView() |public static TooltipView CreateView(Tooltip tooltip, ThemeStyle theme, Transform parent)| -| GetCurrentPos() |public Vector3 GetCurrentPos()| -| GetTargetPos() |public Vector3 GetTargetPos()| -| Refresh() |public void Refresh()| -| SetActive() |public void SetActive(bool flag)| -| Update() |public void Update()| -| UpdatePosition() |public void UpdatePosition(Vector3 pos)| +|CreateView()||public static TooltipView CreateView(Tooltip tooltip, ThemeStyle theme, Transform parent)| +|GetCurrentPos()||public Vector3 GetCurrentPos()| +|GetTargetPos()||public Vector3 GetTargetPos()| +|Refresh()||public void Refresh()| +|SetActive()||public void SetActive(bool flag)| +|Update()||public void Update()| +|UpdatePosition()||public void UpdatePosition(Vector3 pos)| ## TooltipViewItem ## UGL -|public method|description| +|public method|since|description| |--|--| -| DrawDiamond() |public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color)<br/>Draw a diamond. 画菱形(钻石形状) | -| DrawDiamond() |public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color, Color32 toColor)<br/>Draw a diamond. 画菱形(钻石形状) | -| DrawEllipse() |public static void DrawEllipse(VertexHelper vh, Vector3 center, float w, float h, Color32 color, float smoothness = 1)| -| DrawLine() |public static void DrawLine(VertexHelper vh, List<Vector3> points, float width, Color32 color, bool smooth, bool closepath = false)| -| DrawLine() |public static void DrawLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, Color32 color)<br/>Draw a line. 画直线 | -| DrawLine() |public static void DrawLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, Color32 color, Color32 toColor)<br/>Draw a line. 画直线 | -| DrawPolygon() |public static void DrawPolygon(VertexHelper vh, List<Vector3> points, Color32 color)<br/>填充任意多边形(目前只支持凸多边形) | -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Rect rect, Color32 color)| -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Rect rect, Color32 color, Color32 toColor)| -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color)| -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color, Color32 toColor)| -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Vector3 p1, Vector3 p2, float radius, Color32 color)<br/>Draw a rectangle. 画带长方形 | -| DrawSquare() |public static void DrawSquare(VertexHelper vh, Vector3 center, float radius, Color32 color)<br/>Draw a square. 画正方形 | -| DrawSvgPath() |public static void DrawSvgPath(VertexHelper vh, string path)| -| DrawTriangle() |public static void DrawTriangle(VertexHelper vh, Vector3 pos, float size, Color32 color)| -| DrawTriangle() |public static void DrawTriangle(VertexHelper vh, Vector3 pos, float size, Color32 color, Color32 toColor)| +|DrawDiamond()||public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color)<br/>Draw a diamond. 画菱形(钻石形状) | +|DrawDiamond()||public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color, Color32 toColor)<br/>Draw a diamond. 画菱形(钻石形状) | +|DrawEllipse()||public static void DrawEllipse(VertexHelper vh, Vector3 center, float w, float h, Color32 color, float smoothness = 1)| +|DrawLine()||public static void DrawLine(VertexHelper vh, List<Vector3> points, float width, Color32 color, bool smooth, bool closepath = false)| +|DrawLine()||public static void DrawLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, Color32 color)<br/>Draw a line. 画直线 | +|DrawLine()||public static void DrawLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, Color32 color, Color32 toColor)<br/>Draw a line. 画直线 | +|DrawPolygon()||public static void DrawPolygon(VertexHelper vh, List<Vector3> points, Color32 color)<br/>填充任意多边形(目前只支持凸多边形) | +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Rect rect, Color32 color)| +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Rect rect, Color32 color, Color32 toColor)| +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color)| +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color, Color32 toColor)| +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Vector3 p1, Vector3 p2, float radius, Color32 color)<br/>Draw a rectangle. 画带长方形 | +|DrawSquare()||public static void DrawSquare(VertexHelper vh, Vector3 center, float radius, Color32 color)<br/>Draw a square. 画正方形 | +|DrawSvgPath()||public static void DrawSvgPath(VertexHelper vh, string path)| +|DrawTriangle()||public static void DrawTriangle(VertexHelper vh, Vector3 pos, float size, Color32 color)| +|DrawTriangle()||public static void DrawTriangle(VertexHelper vh, Vector3 pos, float size, Color32 color, Color32 toColor)| ## UGLExample @@ -1156,30 +1156,30 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## UGLHelper -|public method|description| +|public method|since|description| |--|--| -| GetAngle360() |public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | -| GetBezier() |public static Vector3 GetBezier(float t, Vector3 sp, Vector3 cp, Vector3 ep)| -| GetBezier2() |public static Vector3 GetBezier2(float t, Vector3 sp, Vector3 p1, Vector3 p2, Vector3 ep)| -| GetBezierList() |public static List<Vector3> GetBezierList(Vector3 sp, Vector3 ep, int segment, Vector3 cp)| -| GetDire() |public static Vector3 GetDire(float angle, bool isDegree = false)| -| GetIntersection() |public static bool GetIntersection(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, ref Vector3 intersection)<br/>获得两直线的交点 | -| GetPos() |public static Vector3 GetPos(Vector3 center, float radius, float angle, bool isDegree = false)| -| GetVertialDire() |public static Vector3 GetVertialDire(Vector3 dire)| -| IsClearColor() |public static bool IsClearColor(Color color)| -| IsClearColor() |public static bool IsClearColor(Color32 color)| -| IsPointInPolygon() |public static bool IsPointInPolygon(Vector3 p, List<Vector2> polyons)| -| IsPointInPolygon() |public static bool IsPointInPolygon(Vector3 p, List<Vector3> polyons)| -| IsPointInTriangle() |public static bool IsPointInTriangle(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 check)| -| IsValueEqualsColor() |public static bool IsValueEqualsColor(Color color1, Color color2)| -| IsValueEqualsColor() |public static bool IsValueEqualsColor(Color32 color1, Color32 color2)| -| IsValueEqualsList<T>() |public static bool IsValueEqualsList<T>(List<T> list1, List<T> list2)| -| IsValueEqualsString() |public static bool IsValueEqualsString(string str1, string str2)| -| IsValueEqualsVector2() |public static bool IsValueEqualsVector2(Vector2 v1, Vector2 v2)| -| IsValueEqualsVector3() |public static bool IsValueEqualsVector3(Vector3 v1, Vector2 v2)| -| IsValueEqualsVector3() |public static bool IsValueEqualsVector3(Vector3 v1, Vector3 v2)| -| IsZeroVector() |public static bool IsZeroVector(Vector3 pos)| -| RotateRound() |public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| +|GetAngle360()||public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | +|GetBezier()||public static Vector3 GetBezier(float t, Vector3 sp, Vector3 cp, Vector3 ep)| +|GetBezier2()||public static Vector3 GetBezier2(float t, Vector3 sp, Vector3 p1, Vector3 p2, Vector3 ep)| +|GetBezierList()||public static List<Vector3> GetBezierList(Vector3 sp, Vector3 ep, int segment, Vector3 cp)| +|GetDire()||public static Vector3 GetDire(float angle, bool isDegree = false)| +|GetIntersection()||public static bool GetIntersection(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, ref Vector3 intersection)<br/>获得两直线的交点 | +|GetPos()||public static Vector3 GetPos(Vector3 center, float radius, float angle, bool isDegree = false)| +|GetVertialDire()||public static Vector3 GetVertialDire(Vector3 dire)| +|IsClearColor()||public static bool IsClearColor(Color color)| +|IsClearColor()||public static bool IsClearColor(Color32 color)| +|IsPointInPolygon()||public static bool IsPointInPolygon(Vector3 p, List<Vector2> polyons)| +|IsPointInPolygon()||public static bool IsPointInPolygon(Vector3 p, List<Vector3> polyons)| +|IsPointInTriangle()||public static bool IsPointInTriangle(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 check)| +|IsValueEqualsColor()||public static bool IsValueEqualsColor(Color color1, Color color2)| +|IsValueEqualsColor()||public static bool IsValueEqualsColor(Color32 color1, Color32 color2)| +|IsValueEqualsList<T>()||public static bool IsValueEqualsList<T>(List<T> list1, List<T> list2)| +|IsValueEqualsString()||public static bool IsValueEqualsString(string str1, string str2)| +|IsValueEqualsVector2()||public static bool IsValueEqualsVector2(Vector2 v1, Vector2 v2)| +|IsValueEqualsVector3()||public static bool IsValueEqualsVector3(Vector3 v1, Vector2 v2)| +|IsValueEqualsVector3()||public static bool IsValueEqualsVector3(Vector3 v1, Vector3 v2)| +|IsZeroVector()||public static bool IsZeroVector(Vector3 pos)| +|RotateRound()||public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| ## VisualMapContext @@ -1187,54 +1187,54 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## VisualMapHelper -|public method|description| +|public method|since|description| |--|--| -| AutoSetLineMinMax() |public static void AutoSetLineMinMax(VisualMap visualMap, Serie serie, bool isY, Axis axis, Axis relativedAxis)| -| GetDimension() |public static int GetDimension(VisualMap visualMap, int defaultDimension)| -| IsNeedAreaGradient() |public static bool IsNeedAreaGradient(VisualMap visualMap)| -| IsNeedGradient() |public static bool IsNeedGradient(VisualMap visualMap)| -| IsNeedLineGradient() |public static bool IsNeedLineGradient(VisualMap visualMap)| -| SetMinMax() |public static void SetMinMax(VisualMap visualMap, double min, double max)| +|AutoSetLineMinMax()||public static void AutoSetLineMinMax(VisualMap visualMap, Serie serie, bool isY, Axis axis, Axis relativedAxis)| +|GetDimension()||public static int GetDimension(VisualMap visualMap, int defaultDimension)| +|IsNeedAreaGradient()||public static bool IsNeedAreaGradient(VisualMap visualMap)| +|IsNeedGradient()||public static bool IsNeedGradient(VisualMap visualMap)| +|IsNeedLineGradient()||public static bool IsNeedLineGradient(VisualMap visualMap)| +|SetMinMax()||public static void SetMinMax(VisualMap visualMap, double min, double max)| ## XChartsMgr -|public method|description| +|public method|since|description| |--|--| -| AddChart() |public static void AddChart(BaseChart chart)| -| ContainsChart() |public static bool ContainsChart(BaseChart chart)| -| ContainsChart() |public static bool ContainsChart(string chartName)| -| GetChart() |public static BaseChart GetChart(string chartName)| -| GetCharts() |public static List<BaseChart> GetCharts(string chartName)| -| GetPackageFullPath() |public static string GetPackageFullPath()| -| GetRepeatChartNameInfo() |public static string GetRepeatChartNameInfo(BaseChart chart, string chartName)| -| IsRepeatChartName() |public static bool IsRepeatChartName(BaseChart chart, string chartName = null)| -| RemoveAllChartObject() |public static void RemoveAllChartObject()| -| RemoveChart() |public static void RemoveChart(string chartName)| +|AddChart()||public static void AddChart(BaseChart chart)| +|ContainsChart()||public static bool ContainsChart(BaseChart chart)| +|ContainsChart()||public static bool ContainsChart(string chartName)| +|GetChart()||public static BaseChart GetChart(string chartName)| +|GetCharts()||public static List<BaseChart> GetCharts(string chartName)| +|GetPackageFullPath()||public static string GetPackageFullPath()| +|GetRepeatChartNameInfo()||public static string GetRepeatChartNameInfo(BaseChart chart, string chartName)| +|IsRepeatChartName()||public static bool IsRepeatChartName(BaseChart chart, string chartName = null)| +|RemoveAllChartObject()||public static void RemoveAllChartObject()| +|RemoveChart()||public static void RemoveChart(string chartName)| ## XCResourceImporterWindow Inherits or Implemented: [UnityEditor.EditorWindow](#unityeditor.editorwindow) -|public method|description| +|public method|since|description| |--|--| -| ShowPackageImporterWindow() |public static void ShowPackageImporterWindow()| +|ShowPackageImporterWindow()||public static void ShowPackageImporterWindow()| ## XCThemeMgr -|public method|description| +|public method|since|description| |--|--| -| AddTheme() |public static void AddTheme(Theme theme)| -| CheckReloadTheme() |public static void CheckReloadTheme()| -| ContainsTheme() |public static bool ContainsTheme(string themeName)| -| ExportTheme() |public static bool ExportTheme(Theme theme)| -| ExportTheme() |public static bool ExportTheme(Theme theme, string themeNewName)| -| GetAllThemeNames() |public static List<string> GetAllThemeNames()| -| GetTheme() |public static Theme GetTheme(string themeName)| -| GetTheme() |public static Theme GetTheme(ThemeType type)| -| GetThemeAssetPath() |public static string GetThemeAssetPath(string themeName)| -| GetThemeList() |public static List<Theme> GetThemeList()| -| LoadTheme() |public static Theme LoadTheme(string themeName)| -| LoadTheme() |public static Theme LoadTheme(ThemeType type)| -| ReloadThemeList() |public static void ReloadThemeList()<br/>重新加载主题列表 | -| SwitchTheme() |public static void SwitchTheme(BaseChart chart, string themeName)| +|AddTheme()||public static void AddTheme(Theme theme)| +|CheckReloadTheme()||public static void CheckReloadTheme()| +|ContainsTheme()||public static bool ContainsTheme(string themeName)| +|ExportTheme()||public static bool ExportTheme(Theme theme)| +|ExportTheme()||public static bool ExportTheme(Theme theme, string themeNewName)| +|GetAllThemeNames()||public static List<string> GetAllThemeNames()| +|GetTheme()||public static Theme GetTheme(string themeName)| +|GetTheme()||public static Theme GetTheme(ThemeType type)| +|GetThemeAssetPath()||public static string GetThemeAssetPath(string themeName)| +|GetThemeList()||public static List<Theme> GetThemeList()| +|LoadTheme()||public static Theme LoadTheme(string themeName)| +|LoadTheme()||public static Theme LoadTheme(ThemeType type)| +|ReloadThemeList()||public static void ReloadThemeList()<br/>重新加载主题列表 | +|SwitchTheme()||public static void SwitchTheme(BaseChart chart, string themeName)| diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index ffb9d368..641f5aeb 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -104,12 +104,12 @@ slug: /api ## AnimationStyleHelper -|public method|description| +|public method|since|description| |--|--| -| CheckDataAnimation() |public static float CheckDataAnimation(BaseChart chart, Serie serie, int dataIndex, float destProgress, float startPorgress = 0)| -| GetAnimationPosition() |public static bool GetAnimationPosition(AnimationStyle animation, bool isY, Vector3 lp, Vector3 cp, float progress, ref Vector3 ip)| -| UpdateAnimationType() |public static void UpdateAnimationType(AnimationStyle animation, AnimationType defaultType)| -| UpdateSerieAnimation() |public static void UpdateSerieAnimation(Serie serie)| +|CheckDataAnimation()||public static float CheckDataAnimation(BaseChart chart, Serie serie, int dataIndex, float destProgress, float startPorgress = 0)| +|GetAnimationPosition()||public static bool GetAnimationPosition(AnimationStyle animation, bool isY, Vector3 lp, Vector3 cp, float progress, ref Vector3 ip)| +|UpdateAnimationType()||public static void UpdateAnimationType(AnimationStyle animation, AnimationType defaultType)| +|UpdateSerieAnimation()||public static void UpdateSerieAnimation(Serie serie)| ## AxisContext @@ -121,29 +121,29 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) ## AxisHelper -|public method|description| +|public method|since|description| |--|--| -| AdjustCircleLabelPos() |public static void AdjustCircleLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| -| AdjustMinMaxValue() |public static void AdjustMinMaxValue(Axis axis, ref double minValue, ref double maxValue, bool needFormat, double ceilRate = 0)<br/>调整最大最小值 | -| AdjustRadiusAxisLabelPos() |public static void AdjustRadiusAxisLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| -| GetAxisLineArrowOffset() |public static float GetAxisLineArrowOffset(Axis axis)<br/>包含箭头偏移的轴线长度 | -| GetAxisPosition() |public static float GetAxisPosition(GridCoord grid, Axis axis, double value, int dataCount = 0, DataZoom dataZoom = null)| -| GetAxisPositionValue() |public static double GetAxisPositionValue(float xy, float axisLength, double axisRange, float axisStart, float axisOffset)| -| GetAxisPositionValue() |public static double GetAxisPositionValue(GridCoord grid, Axis axis, Vector3 pos)| -| GetAxisValueDistance() |public static float GetAxisValueDistance(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上相对起点的距离 | -| GetAxisValueLength() |public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上对应的长度 | -| GetAxisValuePosition() |public static float GetAxisValuePosition(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上的坐标位置 | -| GetAxisValueSplitIndex() |public static int GetAxisValueSplitIndex(Axis axis, double value, int totalSplitNumber = -1)<br/>获得数值value在坐标轴上对应的split索引 | -| GetAxisXOrY() |public static float GetAxisXOrY(GridCoord grid, Axis axis, Axis relativedAxis)| -| GetDataWidth() |public static float GetDataWidth(Axis axis, float coordinateWidth, int dataCount, DataZoom dataZoom)<br/>获得一个类目数据在坐标系中代表的宽度 | -| GetEachWidth() |public static float GetEachWidth(Axis axis, float coordinateWidth, DataZoom dataZoom = null)| -| GetScaleNumber() |public static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null)<br/>获得分割线条数 | -| GetScaleWidth() |public static float GetScaleWidth(Axis axis, float coordinateWidth, int index, DataZoom dataZoom = null)<br/>获得分割段宽度 | -| GetSplitNumber() |public static int GetSplitNumber(Axis axis, float coordinateWid, DataZoom dataZoom)<br/>获得分割段数 | -| GetTotalSplitGridNum() |public static int GetTotalSplitGridNum(Axis axis)<br/>获得分割网格个数,包含次刻度 | -| GetXAxisXOrY() |public static float GetXAxisXOrY(GridCoord grid, Axis xAxis, Axis relativedAxis)| -| GetYAxisXOrY() |public static float GetYAxisXOrY(GridCoord grid, Axis yAxis, Axis relativedAxis)| -| NeedShowSplit() |public static bool NeedShowSplit(Axis axis)| +|AdjustCircleLabelPos()||public static void AdjustCircleLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| +|AdjustMinMaxValue()||public static void AdjustMinMaxValue(Axis axis, ref double minValue, ref double maxValue, bool needFormat, double ceilRate = 0)<br/>调整最大最小值 | +|AdjustRadiusAxisLabelPos()||public static void AdjustRadiusAxisLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| +|GetAxisLineArrowOffset()||public static float GetAxisLineArrowOffset(Axis axis)<br/>包含箭头偏移的轴线长度 | +|GetAxisPosition()||public static float GetAxisPosition(GridCoord grid, Axis axis, double value, int dataCount = 0, DataZoom dataZoom = null)| +|GetAxisPositionValue()||public static double GetAxisPositionValue(float xy, float axisLength, double axisRange, float axisStart, float axisOffset)| +|GetAxisPositionValue()||public static double GetAxisPositionValue(GridCoord grid, Axis axis, Vector3 pos)| +|GetAxisValueDistance()||public static float GetAxisValueDistance(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上相对起点的距离 | +|GetAxisValueLength()||public static float GetAxisValueLength(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上对应的长度 | +|GetAxisValuePosition()||public static float GetAxisValuePosition(GridCoord grid, Axis axis, float scaleWidth, double value)<br/>获得数值value在坐标轴上的坐标位置 | +|GetAxisValueSplitIndex()||public static int GetAxisValueSplitIndex(Axis axis, double value, int totalSplitNumber = -1)<br/>获得数值value在坐标轴上对应的split索引 | +|GetAxisXOrY()||public static float GetAxisXOrY(GridCoord grid, Axis axis, Axis relativedAxis)| +|GetDataWidth()||public static float GetDataWidth(Axis axis, float coordinateWidth, int dataCount, DataZoom dataZoom)<br/>获得一个类目数据在坐标系中代表的宽度 | +|GetEachWidth()||public static float GetEachWidth(Axis axis, float coordinateWidth, DataZoom dataZoom = null)| +|GetScaleNumber()||public static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null)<br/>获得分割线条数 | +|GetScaleWidth()||public static float GetScaleWidth(Axis axis, float coordinateWidth, int index, DataZoom dataZoom = null)<br/>获得分割段宽度 | +|GetSplitNumber()||public static int GetSplitNumber(Axis axis, float coordinateWid, DataZoom dataZoom)<br/>获得分割段数 | +|GetTotalSplitGridNum()||public static int GetTotalSplitGridNum(Axis axis)<br/>获得分割网格个数,包含次刻度 | +|GetXAxisXOrY()||public static float GetXAxisXOrY(GridCoord grid, Axis xAxis, Axis relativedAxis)| +|GetYAxisXOrY()||public static float GetYAxisXOrY(GridCoord grid, Axis yAxis, Axis relativedAxis)| +|NeedShowSplit()||public static bool NeedShowSplit(Axis axis)| ## BarChart @@ -153,222 +153,222 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver](#iserializationcallbackreceiver) -|public method|description| +|public method|since|description| |--|--| -| onAxisPointerValueChanged |public Action<Axis, double> onAxisPointerValueChanged<br/>坐标轴变更数据索引时回调。参数:axis, dataIndex/dataValue | -| onDraw |public Action<VertexHelper> onDraw<br/>自定义绘制回调。在绘制Serie前调用。 | -| onDrawAfterSerie |public Action<VertexHelper, Serie> onDrawAfterSerie<br/>自定义Serie绘制回调。在每个Serie绘制完后调用。 | -| onDrawBeforeSerie |public Action<VertexHelper, Serie> onDrawBeforeSerie<br/>自定义Serie绘制回调。在每个Serie绘制完前调用。 | -| onDrawTop |public Action<VertexHelper> onDrawTop<br/>自定义Top层绘制回调。在绘制Tooltip前调用。 | -| onDrawUpper |public Action<VertexHelper> onDrawUpper<br/>自定义Upper层绘制回调。在绘制Tooltip前调用。 | -| onInit |public Action onInit<br/>图表的初始化完成回调。 | -| onLegendClick |public Action<Legend, int, string, bool> onLegendClick<br/>点击图例按钮回调。参数:legendIndex, legendName, show | -| onLegendEnter |public Action<Legend, int, string> onLegendEnter<br/>鼠标进入图例回调。参数:legendIndex, legendName | -| onLegendExit |public Action<Legend, int, string> onLegendExit<br/>鼠标退出图例回调。参数:legendIndex, legendName | -| onPointerClickBar |public Action<PointerEventData, int> onPointerClickBar<br/>点击柱形图柱条回调。参数:eventData, dataIndex | -| onPointerClickPie |public Action<PointerEventData, int, int> onPointerClickPie<br/>点击饼图区域回调。参数:PointerEventData,SerieIndex,SerieDataIndex | -| onPointerEnterPie |public Action<int, int> onPointerEnterPie<br/>鼠标进入和离开饼图区域回调,SerieDataIndex为-1时表示离开。参数:PointerEventData,SerieIndex,SerieDataIndex | -| onSerieClick |public Action<SerieEventData> onSerieClick<br/>鼠标点击Serie回调。 | -| onSerieDown |public Action<SerieEventData> onSerieDown<br/>鼠标按下Serie回调。 | -| onSerieEnter |public Action<SerieEventData> onSerieEnter<br/>鼠标进入Serie回调。 | -| onSerieExit |public Action<SerieEventData> onSerieExit<br/>鼠标离开Serie回调。 | -| onUpdate |public Action onUpdate<br/>图表的Update回调。 | -| AddChartComponent() |public MainComponent AddChartComponent(Type type)| -| AddChartComponent<T>() |public T AddChartComponent<T>() where T : MainComponent| -| AddChartComponentWhenNoExist<T>() |public T AddChartComponentWhenNoExist<T>() where T : MainComponent| -| AddData() |public SerieData AddData(int serieIndex, DateTime time, double yValue, string dataName = null, string dataId = null)<br/>添加(time,y)数据到指定的系列中。 | -| AddData() |public SerieData AddData(int serieIndex, double data, string dataName = null, string dataId = null)<br/>添加一个数据到指定的系列中。 | -| AddData() |public SerieData AddData(int serieIndex, double indexOrTimestamp, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)| -| AddData() |public SerieData AddData(int serieIndex, double xValue, double yValue, string dataName = null, string dataId = null)<br/>添加(x,y)数据到指定系列中。 | -| AddData() |public SerieData AddData(int serieIndex, List<double> multidimensionalData, string dataName = null, string dataId = null)<br/>添加多维数据(x,y,z...)到指定的系列中。 | -| AddData() |public SerieData AddData(int serieIndex, params double[] multidimensionalData)<br/>添加多维数据(x,y,z...)到指定的系列中。 | -| AddData() |public SerieData AddData(string serieName, DateTime time, double yValue, string dataName = null, string dataId = null)<br/>添加(time,y)数据到指定的系列中。 | -| AddData() |public SerieData AddData(string serieName, double data, string dataName = null, string dataId = null)<br/>If serieName doesn't exist in legend,will be add to legend. | -| AddData() |public SerieData AddData(string serieName, double indexOrTimestamp, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)| -| AddData() |public SerieData AddData(string serieName, double xValue, double yValue, string dataName = null, string dataId = null)<br/>添加(x,y)数据到指定系列中。 | -| AddData() |public SerieData AddData(string serieName, List<double> multidimensionalData, string dataName = null, string dataId = null)<br/>添加多维数据(x,y,z...)到指定的系列中。 | -| AddData() |public SerieData AddData(string serieName, params double[] multidimensionalData)<br/>添加多维数据(x,y,z...)到指定的系列中。 | -| AddSerie<T>() |public T AddSerie<T>(string serieName = null, bool show = true, bool addToHead = false) where T : Serie| -| AddXAxisData() |public void AddXAxisData(string category, int xAxisIndex = 0)<br/>添加一个类目数据到指定的x轴。 | -| AddXAxisIcon() |public void AddXAxisIcon(Sprite icon, int xAxisIndex = 0)<br/>添加一个图标到指定的x轴。 | -| AddYAxisData() |public void AddYAxisData(string category, int yAxisIndex = 0)<br/>添加一个类目数据到指定的y轴。 | -| AddYAxisIcon() |public void AddYAxisIcon(Sprite icon, int yAxisIndex = 0)<br/>添加一个图标到指定的y轴。 | -| AnimationEnable() |public void AnimationEnable(bool flag)<br/>启用或关闭起始动画。 | -| AnimationFadeIn() |public void AnimationFadeIn(bool reset = true)<br/>开始渐入动画。 | -| AnimationFadeOut() |public void AnimationFadeOut()<br/>开始渐出动画。 | -| AnimationPause() |public void AnimationPause()<br/>暂停动画。 | -| AnimationReset() |public void AnimationReset()<br/>重置动画。 | -| AnimationResume() |public void AnimationResume()<br/>继续动画。 | -| CanAddChartComponent() |public bool CanAddChartComponent(Type type)| -| CanAddSerie() |public bool CanAddSerie(Type type)| -| CanAddSerie<T>() |public bool CanAddSerie<T>() where T : Serie| -| CanMultipleComponent() |public bool CanMultipleComponent(Type type)| -| ClampInChart() |public void ClampInChart(ref Vector3 pos)| -| ClampInGrid() |public Vector3 ClampInGrid(GridCoord grid, Vector3 pos)| -| ClearComponentData() |public virtual void ClearComponentData()<br/>清空所有组件的数据。 | -| ClearData() |public virtual void ClearData()<br/>清空所有组件和Serie的数据。注意:Serie只是清空数据,不会移除Serie。 | -| ClearSerieData() |public virtual void ClearSerieData()<br/>清空所有serie的数据。 | -| ClickLegendButton() |public void ClickLegendButton(int legendIndex, string legendName, bool show)<br/>点击图例按钮 | -| ConvertSerie() |public bool ConvertSerie(Serie serie, Type type)| -| ConvertSerie<T>() |public bool ConvertSerie<T>(Serie serie) where T : Serie| -| ConvertXYAxis() |public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | -| EnsureChartComponent<T>() |public T EnsureChartComponent<T>() where T : MainComponent<br/>确保图表有该组件,如果没有则添加。注意:有可能添加不成功。 | -| GenerateDefaultSerieName() |public string GenerateDefaultSerieName()| -| GetAllSerieDataCount() |public int GetAllSerieDataCount()| -| GetChartBackgroundColor() |public Color32 GetChartBackgroundColor()| -| GetChartComponent<T>() |public T GetChartComponent<T>(int index = 0) where T : MainComponent| -| GetChartComponentNum() |public int GetChartComponentNum(Type type)| -| GetChartComponentNum<T>() |public int GetChartComponentNum<T>() where T : MainComponent| -| GetChartComponents<T>() |public List<MainComponent> GetChartComponents<T>() where T : MainComponent| -| GetData() |public double GetData(int serieIndex, int dataIndex, int dimension = 1)| -| GetData() |public double GetData(string serieName, int dataIndex, int dimension = 1)| -| GetDataZoomOfAxis() |public DataZoom GetDataZoomOfAxis(Axis axis)| -| GetDataZoomOfSerie() |public void GetDataZoomOfSerie(Serie serie, out DataZoom xDataZoom, out DataZoom yDataZoom)| -| GetGrid() |public GridCoord GetGrid(Vector2 local)| -| GetGridOfDataZoom() |public GridCoord GetGridOfDataZoom(DataZoom dataZoom)| -| GetItemColor() |public Color32 GetItemColor(Serie serie)| -| GetItemColor() |public Color32 GetItemColor(Serie serie, SerieData serieData)| -| GetItemColor() |public Color32 GetItemColor(Serie serie, SerieData serieData, int colorIndex)| -| GetLegendRealShowNameColor() |public Color32 GetLegendRealShowNameColor(string name)| -| GetLegendRealShowNameIndex() |public int GetLegendRealShowNameIndex(string name)| -| GetMarkColor() |public Color32 GetMarkColor(Serie serie, SerieData serieData)<br/>获得Serie的标识颜色。 | -| GetOrAddChartComponent<T>() |public T GetOrAddChartComponent<T>() where T : MainComponent| -| GetPainter() |public Painter GetPainter(int index)| -| GetSerie() |public Serie GetSerie(int serieIndex)| -| GetSerie() |public Serie GetSerie(string serieName)| -| GetSerie<T>() |public T GetSerie<T>() where T : Serie| -| GetSerie<T>() |public T GetSerie<T>(int serieIndex) where T : Serie| -| GetSerieBarGap<T>() |public float GetSerieBarGap<T>() where T : Serie| -| GetSerieBarRealCount<T>() |public int GetSerieBarRealCount<T>() where T : Serie| -| GetSerieIndexIfStack<T>() |public int GetSerieIndexIfStack<T>(Serie currSerie) where T : Serie| -| GetSerieSameStackTotalValue<T>() |public double GetSerieSameStackTotalValue<T>(string stack, int dataIndex) where T : Serie| -| GetSeriesMinMaxValue() |public virtual void GetSeriesMinMaxValue(Axis axis, int axisIndex, out double tempMinValue, out double tempMaxValue)| -| GetSerieTotalGap<T>() |public float GetSerieTotalGap<T>(float categoryWidth, float gap, int index) where T : Serie| -| GetSerieTotalWidth<T>() |public float GetSerieTotalWidth<T>(float categoryWidth, float gap, int realBarCount) where T : Serie| -| GetTitlePosition() |public Vector3 GetTitlePosition(Title title)| -| GetVisualMapOfSerie() |public VisualMap GetVisualMapOfSerie(Serie serie)| -| GetXDataZoomOfSerie() |public DataZoom GetXDataZoomOfSerie(Serie serie)| -| GetXLerpColor() |public Color32 GetXLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, GridCoord grid)| -| GetYLerpColor() |public Color32 GetYLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, GridCoord grid)| -| HasChartComponent() |public bool HasChartComponent(Type type)| -| HasChartComponent<T>() |public bool HasChartComponent<T>()| -| HasSerie() |public bool HasSerie(Type type)| -| HasSerie<T>() |public bool HasSerie<T>() where T : Serie| -| Init() |public void Init(bool defaultChart = true)| -| InitAxisRuntimeData() |public virtual void InitAxisRuntimeData(Axis axis) { }| -| InsertSerie() |public void InsertSerie(Serie serie, int index = -1, bool addToHead = false)| -| InsertSerie<T>() |public T InsertSerie<T>(int index, string serieName = null, bool show = true) where T : Serie| -| Internal_CheckAnimation() |public void Internal_CheckAnimation()| -| IsActiveByLegend() |public virtual bool IsActiveByLegend(string legendName)<br/>获得指定图例名字的系列是否显示。 | -| IsAllAxisCategory() |public bool IsAllAxisCategory()<br/>纯类目轴。 | -| IsAllAxisValue() |public bool IsAllAxisValue()<br/>纯数值坐标轴(数值轴或对数轴)。 | -| IsInAnyGrid() |public bool IsInAnyGrid(Vector2 local)| -| IsInChart() |public bool IsInChart(float x, float y)| -| IsInChart() |public bool IsInChart(Vector2 local)<br/>坐标是否在图表范围内 | -| IsSerieName() |public bool IsSerieName(string name)| -| MoveDownSerie() |public bool MoveDownSerie(int serieIndex)| -| MoveUpSerie() |public bool MoveUpSerie(int serieIndex)| -| OnAfterDeserialize() |public void OnAfterDeserialize()| -| OnBeforeSerialize() |public void OnBeforeSerialize()| -| OnBeginDrag() |public override void OnBeginDrag(PointerEventData eventData)| -| OnDataZoomRangeChanged() |public virtual void OnDataZoomRangeChanged(DataZoom dataZoom)| -| OnDrag() |public override void OnDrag(PointerEventData eventData)| -| OnEndDrag() |public override void OnEndDrag(PointerEventData eventData)| -| OnLegendButtonClick() |public virtual void OnLegendButtonClick(int index, string legendName, bool show)| -| OnLegendButtonEnter() |public virtual void OnLegendButtonEnter(int index, string legendName)| -| OnLegendButtonExit() |public virtual void OnLegendButtonExit(int index, string legendName)| -| OnPointerClick() |public override void OnPointerClick(PointerEventData eventData)| -| OnPointerDown() |public override void OnPointerDown(PointerEventData eventData)| -| OnPointerEnter() |public override void OnPointerEnter(PointerEventData eventData)| -| OnPointerExit() |public override void OnPointerExit(PointerEventData eventData)| -| OnPointerUp() |public override void OnPointerUp(PointerEventData eventData)| -| OnScroll() |public override void OnScroll(PointerEventData eventData)| -| RefreshBasePainter() |public void RefreshBasePainter()| -| RefreshChart() |public void RefreshChart()<br/>在下一帧刷新整个图表。 | -| RefreshChart() |public void RefreshChart(int serieIndex)<br/>在下一帧刷新图表的指定serie。 | -| RefreshChart() |public void RefreshChart(Serie serie)<br/>在下一帧刷新图表的指定serie。 | -| RefreshDataZoom() |public void RefreshDataZoom()<br/>在下一帧刷新DataZoom | -| RefreshGraph() |public override void RefreshGraph()| -| RefreshPainter() |public void RefreshPainter(int index)| -| RefreshPainter() |public void RefreshPainter(Serie serie)| -| RefreshTopPainter() |public void RefreshTopPainter()| -| RefreshUpperPainter() |public void RefreshUpperPainter()| -| RemoveAllChartComponent() |public void RemoveAllChartComponent()| -| RemoveAllSerie() |public virtual void RemoveAllSerie()<br/>移除所有的Serie。当确认只需要移除Serie时使用该接口,其他情况下一般用RemoveData()。 | -| RemoveChartComponent() |public bool RemoveChartComponent(MainComponent component)| -| RemoveChartComponent() |public bool RemoveChartComponent(Type type, int index = 0)| -| RemoveChartComponent<T>() |public bool RemoveChartComponent<T>(int index = 0)| -| RemoveChartComponents() |public int RemoveChartComponents(Type type)| -| RemoveChartComponents<T>() |public int RemoveChartComponents<T>()| -| RemoveData() |public virtual void RemoveData()<br/>清空所有组件数据,并移除所有Serie。一般在图表重新初始化时使用。 注意:组件只清空数据部分,参数会保留不会被重置。 | -| RemoveData() |public virtual void RemoveData(string serieName)<br/>清除指定系列名称的数据。 | -| RemoveSerie() |public void RemoveSerie(int serieIndex)| -| RemoveSerie() |public void RemoveSerie(Serie serie)| -| RemoveSerie() |public void RemoveSerie(string serieName)| -| RemoveSerie<T>() |public void RemoveSerie<T>() where T : Serie| -| ReplaceSerie() |public bool ReplaceSerie(Serie oldSerie, Serie newSerie)| -| ResetDataIndex() |public bool ResetDataIndex(int serieIndex)<br/>重置serie的数据项索引。避免数据项索引异常。 | -| SetBasePainterMaterial() |public void SetBasePainterMaterial(Material material)<br/>设置Base Painter的材质球 | -| SetMaxCache() |public void SetMaxCache(int maxCache)<br/>设置可缓存的最大数据量。当数据量超过该值时,会自动删除第一个值再加入最新值。 | -| SetPainterActive() |public void SetPainterActive(int index, bool flag)| -| SetSerieActive() |public void SetSerieActive(int serieIndex, bool active)<br/>设置指定系列是否显示。 | -| SetSerieActive() |public void SetSerieActive(Serie serie, bool active)| -| SetSerieActive() |public void SetSerieActive(string serieName, bool active)<br/>设置指定系列是否显示。 | -| SetSeriePainterMaterial() |public void SetSeriePainterMaterial(Material material)<br/>设置Serie Painter的材质球 | -| SetTopPainterMaterial() |public void SetTopPainterMaterial(Material material)<br/>设置Top Painter的材质球 | -| SetUpperPainterMaterial() |public void SetUpperPainterMaterial(Material material)<br/>设置Upper Painter的材质球 | -| 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| -| TryGetChartComponent<T>() |public bool TryGetChartComponent<T>(out T component, int index = 0)| -| UpdateData() |public bool UpdateData(int serieIndex, int dataIndex, double value)<br/>更新指定系列中的指定索引数据。 | -| UpdateData() |public bool UpdateData(int serieIndex, int dataIndex, int dimension, double value)<br/>更新指定系列指定索引指定维数的数据。维数从0开始。 | -| UpdateData() |public bool UpdateData(int serieIndex, int dataIndex, List<double> multidimensionalData)<br/>更新指定系列指定索引的数据项的多维数据。 | -| UpdateData() |public bool UpdateData(string serieName, int dataIndex, double value)<br/>更新指定系列中的指定索引数据。 | -| UpdateData() |public bool UpdateData(string serieName, int dataIndex, int dimension, double value)<br/>更新指定系列指定索引指定维数的数据。维数从0开始。 | -| UpdateData() |public bool UpdateData(string serieName, int dataIndex, List<double> multidimensionalData)<br/>更新指定系列指定索引的数据项的多维数据。 | -| UpdateDataName() |public bool UpdateDataName(int serieIndex, int dataIndex, string dataName)<br/>更新指定系列中的指定索引数据名称。 | -| UpdateDataName() |public bool UpdateDataName(string serieName, int dataIndex, string dataName)<br/>更新指定系列中的指定索引数据名称。 | -| UpdateLegendColor() |public virtual void UpdateLegendColor(string legendName, bool active)| -| UpdateTheme() |public bool UpdateTheme(ThemeType theme)<br/>切换内置主题。 | -| UpdateTheme() |public void UpdateTheme(Theme theme)<br/>切换图表主题。 | -| UpdateXAxisData() |public void UpdateXAxisData(int index, string category, int xAxisIndex = 0)<br/>更新X轴类目数据。 | -| UpdateXAxisIcon() |public void UpdateXAxisIcon(int index, Sprite icon, int xAxisIndex = 0)<br/>更新X轴图标。 | -| UpdateYAxisData() |public void UpdateYAxisData(int index, string category, int yAxisIndex = 0)<br/>更新Y轴类目数据。 | -| UpdateYAxisIcon() |public void UpdateYAxisIcon(int index, Sprite icon, int yAxisIndex = 0)<br/>更新Y轴图标。 | +|onAxisPointerValueChanged||public Action<Axis, double> onAxisPointerValueChanged<br/>坐标轴变更数据索引时回调。参数:axis, dataIndex/dataValue | +|onDraw||public Action<VertexHelper> onDraw<br/>自定义绘制回调。在绘制Serie前调用。 | +|onDrawAfterSerie||public Action<VertexHelper, Serie> onDrawAfterSerie<br/>自定义Serie绘制回调。在每个Serie绘制完后调用。 | +|onDrawBeforeSerie||public Action<VertexHelper, Serie> onDrawBeforeSerie<br/>自定义Serie绘制回调。在每个Serie绘制完前调用。 | +|onDrawTop||public Action<VertexHelper> onDrawTop<br/>自定义Top层绘制回调。在绘制Tooltip前调用。 | +|onDrawUpper||public Action<VertexHelper> onDrawUpper<br/>自定义Upper层绘制回调。在绘制Tooltip前调用。 | +|onInit||public Action onInit<br/>图表的初始化完成回调。 | +|onLegendClick||public Action<Legend, int, string, bool> onLegendClick<br/>点击图例按钮回调。参数:legendIndex, legendName, show | +|onLegendEnter||public Action<Legend, int, string> onLegendEnter<br/>鼠标进入图例回调。参数:legendIndex, legendName | +|onLegendExit||public Action<Legend, int, string> onLegendExit<br/>鼠标退出图例回调。参数:legendIndex, legendName | +|onPointerClickBar||public Action<PointerEventData, int> onPointerClickBar<br/>点击柱形图柱条回调。参数:eventData, dataIndex | +|onPointerClickPie||public Action<PointerEventData, int, int> onPointerClickPie<br/>点击饼图区域回调。参数:PointerEventData,SerieIndex,SerieDataIndex | +|onPointerEnterPie||public Action<int, int> onPointerEnterPie<br/>鼠标进入和离开饼图区域回调,SerieDataIndex为-1时表示离开。参数:PointerEventData,SerieIndex,SerieDataIndex | +|onSerieClick|v3.6.0|public Action<SerieEventData> onSerieClick<br/>鼠标点击Serie回调。 | +|onSerieDown|v3.6.0|public Action<SerieEventData> onSerieDown<br/>鼠标按下Serie回调。 | +|onSerieEnter|v3.6.0|public Action<SerieEventData> onSerieEnter<br/>鼠标进入Serie回调。 | +|onSerieExit|v3.6.0|public Action<SerieEventData> onSerieExit<br/>鼠标离开Serie回调。 | +|onUpdate||public Action onUpdate<br/>图表的Update回调。 | +|AddChartComponent()||public MainComponent AddChartComponent(Type type)| +|AddChartComponent<T>()||public T AddChartComponent<T>() where T : MainComponent| +|AddChartComponentWhenNoExist<T>()||public T AddChartComponentWhenNoExist<T>() where T : MainComponent| +|AddData()||public SerieData AddData(int serieIndex, DateTime time, double yValue, string dataName = null, string dataId = null)<br/>添加(time,y)数据到指定的系列中。 | +|AddData()||public SerieData AddData(int serieIndex, double data, string dataName = null, string dataId = null)<br/>添加一个数据到指定的系列中。 | +|AddData()||public SerieData AddData(int serieIndex, double indexOrTimestamp, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)| +|AddData()||public SerieData AddData(int serieIndex, double xValue, double yValue, string dataName = null, string dataId = null)<br/>添加(x,y)数据到指定系列中。 | +|AddData()||public SerieData AddData(int serieIndex, List<double> multidimensionalData, string dataName = null, string dataId = null)<br/>添加多维数据(x,y,z...)到指定的系列中。 | +|AddData()||public SerieData AddData(int serieIndex, params double[] multidimensionalData)<br/>添加多维数据(x,y,z...)到指定的系列中。 | +|AddData()||public SerieData AddData(string serieName, DateTime time, double yValue, string dataName = null, string dataId = null)<br/>添加(time,y)数据到指定的系列中。 | +|AddData()||public SerieData AddData(string serieName, double data, string dataName = null, string dataId = null)<br/>If serieName doesn't exist in legend,will be add to legend. | +|AddData()||public SerieData AddData(string serieName, double indexOrTimestamp, double open, double close, double lowest, double heighest, string dataName = null, string dataId = null)| +|AddData()||public SerieData AddData(string serieName, double xValue, double yValue, string dataName = null, string dataId = null)<br/>添加(x,y)数据到指定系列中。 | +|AddData()||public SerieData AddData(string serieName, List<double> multidimensionalData, string dataName = null, string dataId = null)<br/>添加多维数据(x,y,z...)到指定的系列中。 | +|AddData()||public SerieData AddData(string serieName, params double[] multidimensionalData)<br/>添加多维数据(x,y,z...)到指定的系列中。 | +|AddSerie<T>()||public T AddSerie<T>(string serieName = null, bool show = true, bool addToHead = false) where T : Serie| +|AddXAxisData()||public void AddXAxisData(string category, int xAxisIndex = 0)<br/>添加一个类目数据到指定的x轴。 | +|AddXAxisIcon()||public void AddXAxisIcon(Sprite icon, int xAxisIndex = 0)<br/>添加一个图标到指定的x轴。 | +|AddYAxisData()||public void AddYAxisData(string category, int yAxisIndex = 0)<br/>添加一个类目数据到指定的y轴。 | +|AddYAxisIcon()||public void AddYAxisIcon(Sprite icon, int yAxisIndex = 0)<br/>添加一个图标到指定的y轴。 | +|AnimationEnable()||public void AnimationEnable(bool flag)<br/>启用或关闭起始动画。 | +|AnimationFadeIn()||public void AnimationFadeIn(bool reset = true)<br/>开始渐入动画。 | +|AnimationFadeOut()||public void AnimationFadeOut()<br/>开始渐出动画。 | +|AnimationPause()||public void AnimationPause()<br/>暂停动画。 | +|AnimationReset()||public void AnimationReset()<br/>重置动画。 | +|AnimationResume()||public void AnimationResume()<br/>继续动画。 | +|CanAddChartComponent()||public bool CanAddChartComponent(Type type)| +|CanAddSerie()||public bool CanAddSerie(Type type)| +|CanAddSerie<T>()||public bool CanAddSerie<T>() where T : Serie| +|CanMultipleComponent()||public bool CanMultipleComponent(Type type)| +|ClampInChart()||public void ClampInChart(ref Vector3 pos)| +|ClampInGrid()||public Vector3 ClampInGrid(GridCoord grid, Vector3 pos)| +|ClearComponentData()||public virtual void ClearComponentData()<br/>清空所有组件的数据。 | +|ClearData()||public virtual void ClearData()<br/>清空所有组件和Serie的数据。注意:Serie只是清空数据,不会移除Serie。 | +|ClearSerieData()||public virtual void ClearSerieData()<br/>清空所有serie的数据。 | +|ClickLegendButton()||public void ClickLegendButton(int legendIndex, string legendName, bool show)<br/>点击图例按钮 | +|ConvertSerie()||public bool ConvertSerie(Serie serie, Type type)| +|ConvertSerie<T>()||public bool ConvertSerie<T>(Serie serie) where T : Serie| +|ConvertXYAxis()||public void ConvertXYAxis(int index)<br/>转换X轴和Y轴的配置 | +|EnsureChartComponent<T>()|v3.6.0|public T EnsureChartComponent<T>() where T : MainComponent<br/>确保图表有该组件,如果没有则添加。注意:有可能添加不成功。 | +|GenerateDefaultSerieName()||public string GenerateDefaultSerieName()| +|GetAllSerieDataCount()||public int GetAllSerieDataCount()| +|GetChartBackgroundColor()||public Color32 GetChartBackgroundColor()| +|GetChartComponent<T>()||public T GetChartComponent<T>(int index = 0) where T : MainComponent| +|GetChartComponentNum()||public int GetChartComponentNum(Type type)| +|GetChartComponentNum<T>()||public int GetChartComponentNum<T>() where T : MainComponent| +|GetChartComponents<T>()||public List<MainComponent> GetChartComponents<T>() where T : MainComponent| +|GetData()||public double GetData(int serieIndex, int dataIndex, int dimension = 1)| +|GetData()||public double GetData(string serieName, int dataIndex, int dimension = 1)| +|GetDataZoomOfAxis()||public DataZoom GetDataZoomOfAxis(Axis axis)| +|GetDataZoomOfSerie()||public void GetDataZoomOfSerie(Serie serie, out DataZoom xDataZoom, out DataZoom yDataZoom)| +|GetGrid()||public GridCoord GetGrid(Vector2 local)| +|GetGridOfDataZoom()||public GridCoord GetGridOfDataZoom(DataZoom dataZoom)| +|GetItemColor()||public Color32 GetItemColor(Serie serie)| +|GetItemColor()||public Color32 GetItemColor(Serie serie, SerieData serieData)| +|GetItemColor()||public Color32 GetItemColor(Serie serie, SerieData serieData, int colorIndex)| +|GetLegendRealShowNameColor()||public Color32 GetLegendRealShowNameColor(string name)| +|GetLegendRealShowNameIndex()||public int GetLegendRealShowNameIndex(string name)| +|GetMarkColor()||public Color32 GetMarkColor(Serie serie, SerieData serieData)<br/>获得Serie的标识颜色。 | +|GetOrAddChartComponent<T>()||public T GetOrAddChartComponent<T>() where T : MainComponent| +|GetPainter()||public Painter GetPainter(int index)| +|GetSerie()||public Serie GetSerie(int serieIndex)| +|GetSerie()||public Serie GetSerie(string serieName)| +|GetSerie<T>()||public T GetSerie<T>() where T : Serie| +|GetSerie<T>()||public T GetSerie<T>(int serieIndex) where T : Serie| +|GetSerieBarGap<T>()||public float GetSerieBarGap<T>() where T : Serie| +|GetSerieBarRealCount<T>()||public int GetSerieBarRealCount<T>() where T : Serie| +|GetSerieIndexIfStack<T>()||public int GetSerieIndexIfStack<T>(Serie currSerie) where T : Serie| +|GetSerieSameStackTotalValue<T>()||public double GetSerieSameStackTotalValue<T>(string stack, int dataIndex) where T : Serie| +|GetSeriesMinMaxValue()||public virtual void GetSeriesMinMaxValue(Axis axis, int axisIndex, out double tempMinValue, out double tempMaxValue)| +|GetSerieTotalGap<T>()||public float GetSerieTotalGap<T>(float categoryWidth, float gap, int index) where T : Serie| +|GetSerieTotalWidth<T>()||public float GetSerieTotalWidth<T>(float categoryWidth, float gap, int realBarCount) where T : Serie| +|GetTitlePosition()||public Vector3 GetTitlePosition(Title title)| +|GetVisualMapOfSerie()||public VisualMap GetVisualMapOfSerie(Serie serie)| +|GetXDataZoomOfSerie()||public DataZoom GetXDataZoomOfSerie(Serie serie)| +|GetXLerpColor()||public Color32 GetXLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, GridCoord grid)| +|GetYLerpColor()||public Color32 GetYLerpColor(Color32 areaColor, Color32 areaToColor, Vector3 pos, GridCoord grid)| +|HasChartComponent()||public bool HasChartComponent(Type type)| +|HasChartComponent<T>()||public bool HasChartComponent<T>()| +|HasSerie()||public bool HasSerie(Type type)| +|HasSerie<T>()||public bool HasSerie<T>() where T : Serie| +|Init()||public void Init(bool defaultChart = true)| +|InitAxisRuntimeData()||public virtual void InitAxisRuntimeData(Axis axis) { }| +|InsertSerie()||public void InsertSerie(Serie serie, int index = -1, bool addToHead = false)| +|InsertSerie<T>()||public T InsertSerie<T>(int index, string serieName = null, bool show = true) where T : Serie| +|Internal_CheckAnimation()||public void Internal_CheckAnimation()| +|IsActiveByLegend()||public virtual bool IsActiveByLegend(string legendName)<br/>获得指定图例名字的系列是否显示。 | +|IsAllAxisCategory()||public bool IsAllAxisCategory()<br/>纯类目轴。 | +|IsAllAxisValue()||public bool IsAllAxisValue()<br/>纯数值坐标轴(数值轴或对数轴)。 | +|IsInAnyGrid()||public bool IsInAnyGrid(Vector2 local)| +|IsInChart()||public bool IsInChart(float x, float y)| +|IsInChart()||public bool IsInChart(Vector2 local)<br/>坐标是否在图表范围内 | +|IsSerieName()||public bool IsSerieName(string name)| +|MoveDownSerie()||public bool MoveDownSerie(int serieIndex)| +|MoveUpSerie()||public bool MoveUpSerie(int serieIndex)| +|OnAfterDeserialize()||public void OnAfterDeserialize()| +|OnBeforeSerialize()||public void OnBeforeSerialize()| +|OnBeginDrag()||public override void OnBeginDrag(PointerEventData eventData)| +|OnDataZoomRangeChanged()||public virtual void OnDataZoomRangeChanged(DataZoom dataZoom)| +|OnDrag()||public override void OnDrag(PointerEventData eventData)| +|OnEndDrag()||public override void OnEndDrag(PointerEventData eventData)| +|OnLegendButtonClick()||public virtual void OnLegendButtonClick(int index, string legendName, bool show)| +|OnLegendButtonEnter()||public virtual void OnLegendButtonEnter(int index, string legendName)| +|OnLegendButtonExit()||public virtual void OnLegendButtonExit(int index, string legendName)| +|OnPointerClick()||public override void OnPointerClick(PointerEventData eventData)| +|OnPointerDown()||public override void OnPointerDown(PointerEventData eventData)| +|OnPointerEnter()||public override void OnPointerEnter(PointerEventData eventData)| +|OnPointerExit()||public override void OnPointerExit(PointerEventData eventData)| +|OnPointerUp()||public override void OnPointerUp(PointerEventData eventData)| +|OnScroll()||public override void OnScroll(PointerEventData eventData)| +|RefreshBasePainter()||public void RefreshBasePainter()| +|RefreshChart()||public void RefreshChart()<br/>在下一帧刷新整个图表。 | +|RefreshChart()||public void RefreshChart(int serieIndex)<br/>在下一帧刷新图表的指定serie。 | +|RefreshChart()||public void RefreshChart(Serie serie)<br/>在下一帧刷新图表的指定serie。 | +|RefreshDataZoom()||public void RefreshDataZoom()<br/>在下一帧刷新DataZoom | +|RefreshGraph()||public override void RefreshGraph()| +|RefreshPainter()||public void RefreshPainter(int index)| +|RefreshPainter()||public void RefreshPainter(Serie serie)| +|RefreshTopPainter()||public void RefreshTopPainter()| +|RefreshUpperPainter()||public void RefreshUpperPainter()| +|RemoveAllChartComponent()||public void RemoveAllChartComponent()| +|RemoveAllSerie()|v3.2.0|public virtual void RemoveAllSerie()<br/>移除所有的Serie。当确认只需要移除Serie时使用该接口,其他情况下一般用RemoveData()。 | +|RemoveChartComponent()||public bool RemoveChartComponent(MainComponent component)| +|RemoveChartComponent()||public bool RemoveChartComponent(Type type, int index = 0)| +|RemoveChartComponent<T>()||public bool RemoveChartComponent<T>(int index = 0)| +|RemoveChartComponents()||public int RemoveChartComponents(Type type)| +|RemoveChartComponents<T>()||public int RemoveChartComponents<T>()| +|RemoveData()||public virtual void RemoveData()<br/>清空所有组件数据,并移除所有Serie。一般在图表重新初始化时使用。 注意:组件只清空数据部分,参数会保留不会被重置。 | +|RemoveData()||public virtual void RemoveData(string serieName)<br/>清除指定系列名称的数据。 | +|RemoveSerie()||public void RemoveSerie(int serieIndex)| +|RemoveSerie()||public void RemoveSerie(Serie serie)| +|RemoveSerie()||public void RemoveSerie(string serieName)| +|RemoveSerie<T>()||public void RemoveSerie<T>() where T : Serie| +|ReplaceSerie()||public bool ReplaceSerie(Serie oldSerie, Serie newSerie)| +|ResetDataIndex()||public bool ResetDataIndex(int serieIndex)<br/>重置serie的数据项索引。避免数据项索引异常。 | +|SetBasePainterMaterial()||public void SetBasePainterMaterial(Material material)<br/>设置Base Painter的材质球 | +|SetMaxCache()||public void SetMaxCache(int maxCache)<br/>设置可缓存的最大数据量。当数据量超过该值时,会自动删除第一个值再加入最新值。 | +|SetPainterActive()||public void SetPainterActive(int index, bool flag)| +|SetSerieActive()||public void SetSerieActive(int serieIndex, bool active)<br/>设置指定系列是否显示。 | +|SetSerieActive()||public void SetSerieActive(Serie serie, bool active)| +|SetSerieActive()||public void SetSerieActive(string serieName, bool active)<br/>设置指定系列是否显示。 | +|SetSeriePainterMaterial()||public void SetSeriePainterMaterial(Material material)<br/>设置Serie Painter的材质球 | +|SetTopPainterMaterial()||public void SetTopPainterMaterial(Material material)<br/>设置Top Painter的材质球 | +|SetUpperPainterMaterial()||public void SetUpperPainterMaterial(Material material)<br/>设置Upper Painter的材质球 | +|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| +|TryGetChartComponent<T>()||public bool TryGetChartComponent<T>(out T component, int index = 0)| +|UpdateData()||public bool UpdateData(int serieIndex, int dataIndex, double value)<br/>更新指定系列中的指定索引数据。 | +|UpdateData()||public bool UpdateData(int serieIndex, int dataIndex, int dimension, double value)<br/>更新指定系列指定索引指定维数的数据。维数从0开始。 | +|UpdateData()||public bool UpdateData(int serieIndex, int dataIndex, List<double> multidimensionalData)<br/>更新指定系列指定索引的数据项的多维数据。 | +|UpdateData()||public bool UpdateData(string serieName, int dataIndex, double value)<br/>更新指定系列中的指定索引数据。 | +|UpdateData()||public bool UpdateData(string serieName, int dataIndex, int dimension, double value)<br/>更新指定系列指定索引指定维数的数据。维数从0开始。 | +|UpdateData()||public bool UpdateData(string serieName, int dataIndex, List<double> multidimensionalData)<br/>更新指定系列指定索引的数据项的多维数据。 | +|UpdateDataName()||public bool UpdateDataName(int serieIndex, int dataIndex, string dataName)<br/>更新指定系列中的指定索引数据名称。 | +|UpdateDataName()||public bool UpdateDataName(string serieName, int dataIndex, string dataName)<br/>更新指定系列中的指定索引数据名称。 | +|UpdateLegendColor()||public virtual void UpdateLegendColor(string legendName, bool active)| +|UpdateTheme()||public bool UpdateTheme(ThemeType theme)<br/>切换内置主题。 | +|UpdateTheme()||public void UpdateTheme(Theme theme)<br/>切换图表主题。 | +|UpdateXAxisData()||public void UpdateXAxisData(int index, string category, int xAxisIndex = 0)<br/>更新X轴类目数据。 | +|UpdateXAxisIcon()||public void UpdateXAxisIcon(int index, Sprite icon, int xAxisIndex = 0)<br/>更新X轴图标。 | +|UpdateYAxisData()||public void UpdateYAxisData(int index, string category, int yAxisIndex = 0)<br/>更新Y轴类目数据。 | +|UpdateYAxisIcon()||public void UpdateYAxisIcon(int index, Sprite icon, int yAxisIndex = 0)<br/>更新Y轴图标。 | ## BaseGraph Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandler](#ipointerdownhandler),[IPointerUpHandler](#ipointeruphandler),[](#) -|public method|description| +|public method|since|description| |--|--| -| onBeginDrag |public Action<PointerEventData, BaseGraph> onBeginDrag<br/>鼠标开始拖拽回调。 | -| onDrag |public Action<PointerEventData, BaseGraph> onDrag<br/>鼠标拖拽回调。 | -| onEndDrag |public Action<PointerEventData, BaseGraph> onEndDrag<br/>鼠标结束拖拽回调。 | -| onPointerClick |public Action<PointerEventData, BaseGraph> onPointerClick<br/>鼠标点击回调。 | -| onPointerDown |public Action<PointerEventData, BaseGraph> onPointerDown<br/>鼠标按下回调。 | -| onPointerEnter |public Action<PointerEventData, BaseGraph> onPointerEnter<br/>鼠标进入回调。 | -| onPointerExit |public Action<PointerEventData, BaseGraph> onPointerExit<br/>鼠标退出回调。 | -| onPointerUp |public Action<PointerEventData, BaseGraph> onPointerUp<br/>鼠标弹起回调。 | -| onScroll |public Action<PointerEventData, BaseGraph> onScroll<br/>鼠标滚动回调。 | -| CheckWarning() |public string CheckWarning()<br/>检测警告信息。 | -| OnBeginDrag() |public virtual void OnBeginDrag(PointerEventData eventData)| -| OnDrag() |public virtual void OnDrag(PointerEventData eventData)| -| OnEndDrag() |public virtual void OnEndDrag(PointerEventData eventData)| -| OnPointerClick() |public virtual void OnPointerClick(PointerEventData eventData)| -| OnPointerDown() |public virtual void OnPointerDown(PointerEventData eventData)| -| OnPointerEnter() |public virtual void OnPointerEnter(PointerEventData eventData)| -| OnPointerExit() |public virtual void OnPointerExit(PointerEventData eventData)| -| OnPointerUp() |public virtual void OnPointerUp(PointerEventData eventData)| -| OnScroll() |public virtual void OnScroll(PointerEventData eventData)| -| RebuildChartObject() |public void RebuildChartObject()<br/>移除并重新创建所有图表的Object。 | -| RefreshAllComponent() |public void RefreshAllComponent()| -| RefreshGraph() |public virtual void RefreshGraph()<br/>在下一帧刷新图形。 | -| SaveAsImage() |public void SaveAsImage(string imageType = "png", string savePath = "")<br/>保存图表为图片。 | -| ScreenPointToChartPoint() |public bool ScreenPointToChartPoint(Vector2 screenPoint, out Vector2 chartPoint)| -| SetPainterDirty() |public void SetPainterDirty()<br/>重新初始化Painter | -| SetSize() |public virtual void SetSize(float width, float height)<br/>设置图形的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform) | +|onBeginDrag||public Action<PointerEventData, BaseGraph> onBeginDrag<br/>鼠标开始拖拽回调。 | +|onDrag||public Action<PointerEventData, BaseGraph> onDrag<br/>鼠标拖拽回调。 | +|onEndDrag||public Action<PointerEventData, BaseGraph> onEndDrag<br/>鼠标结束拖拽回调。 | +|onPointerClick||public Action<PointerEventData, BaseGraph> onPointerClick<br/>鼠标点击回调。 | +|onPointerDown||public Action<PointerEventData, BaseGraph> onPointerDown<br/>鼠标按下回调。 | +|onPointerEnter||public Action<PointerEventData, BaseGraph> onPointerEnter<br/>鼠标进入回调。 | +|onPointerExit||public Action<PointerEventData, BaseGraph> onPointerExit<br/>鼠标退出回调。 | +|onPointerUp||public Action<PointerEventData, BaseGraph> onPointerUp<br/>鼠标弹起回调。 | +|onScroll||public Action<PointerEventData, BaseGraph> onScroll<br/>鼠标滚动回调。 | +|CheckWarning()||public string CheckWarning()<br/>检测警告信息。 | +|OnBeginDrag()||public virtual void OnBeginDrag(PointerEventData eventData)| +|OnDrag()||public virtual void OnDrag(PointerEventData eventData)| +|OnEndDrag()||public virtual void OnEndDrag(PointerEventData eventData)| +|OnPointerClick()||public virtual void OnPointerClick(PointerEventData eventData)| +|OnPointerDown()||public virtual void OnPointerDown(PointerEventData eventData)| +|OnPointerEnter()||public virtual void OnPointerEnter(PointerEventData eventData)| +|OnPointerExit()||public virtual void OnPointerExit(PointerEventData eventData)| +|OnPointerUp()||public virtual void OnPointerUp(PointerEventData eventData)| +|OnScroll()||public virtual void OnScroll(PointerEventData eventData)| +|RebuildChartObject()||public void RebuildChartObject()<br/>移除并重新创建所有图表的Object。 | +|RefreshAllComponent()||public void RefreshAllComponent()| +|RefreshGraph()||public virtual void RefreshGraph()<br/>在下一帧刷新图形。 | +|SaveAsImage()||public void SaveAsImage(string imageType = "png", string savePath = "")<br/>保存图表为图片。 | +|ScreenPointToChartPoint()||public bool ScreenPointToChartPoint(Vector2 screenPoint, out Vector2 chartPoint)| +|SetPainterDirty()||public void SetPainterDirty()<br/>重新初始化Painter | +|SetSize()||public virtual void SetSize(float width, float height)<br/>设置图形的宽高(在非stretch pivot下才有效,其他情况需要自己调整RectTransform) | ## CandlestickChart @@ -376,14 +376,14 @@ Inherits or Implemented: [BaseChart](#basechart) ## ChartCached -|public method|description| +|public method|since|description| |--|--| -| ColorToDotStr() |public static string ColorToDotStr(Color color)| -| ColorToStr() |public static string ColorToStr(Color color)| -| FloatToStr() |public static string FloatToStr(double value, string numericFormatter = "F", int precision = 0)| -| GetSerieLabelName() |public static string GetSerieLabelName(string prefix, int i, int j)| -| IntToStr() |public static string IntToStr(int value, string numericFormatter = "")| -| NumberToStr() |public static string NumberToStr(double value, string formatter)| +|ColorToDotStr()||public static string ColorToDotStr(Color color)| +|ColorToStr()||public static string ColorToStr(Color color)| +|FloatToStr()||public static string FloatToStr(double value, string numericFormatter = "F", int precision = 0)| +|GetSerieLabelName()||public static string GetSerieLabelName(string prefix, int i, int j)| +|IntToStr()||public static string IntToStr(int value, string numericFormatter = "")| +|NumberToStr()||public static string NumberToStr(double value, string formatter)| ## ChartConst @@ -391,146 +391,146 @@ Inherits or Implemented: [BaseChart](#basechart) ## ChartHelper -|public method|description| +|public method|since|description| |--|--| -| ActiveAllObject() |public static void ActiveAllObject(Transform parent, bool active, string match = null)| -| AddIcon() |public static Image AddIcon(string name, Transform parent, IconStyle iconStyle)| -| Cancat() |public static string Cancat(string str1, int i)| -| Cancat() |public static string Cancat(string str1, string str2)| -| ClearEventListener() |public static void ClearEventListener(GameObject obj)| -| CopyArray<T>() |public static bool CopyArray<T>(T[] toList, T[] fromList)| -| CopyList<T>() |public static bool CopyList<T>(List<T> toList, List<T> fromList)| -| DestoryGameObject() |public static void DestoryGameObject(GameObject go)| -| DestoryGameObject() |public static void DestoryGameObject(Transform parent, string childName)| -| DestoryGameObjectByMatch() |public static void DestoryGameObjectByMatch(Transform parent, string containString)| -| DestroyAllChildren() |public static void DestroyAllChildren(Transform parent)| -| EnsureComponent<T>() |public static T EnsureComponent<T>(GameObject gameObject) where T : Component<br/>确保对象有指定的组件,如果没有则添加。 | -| EnsureComponent<T>() |public static T EnsureComponent<T>(Transform transform) where T : Component<br/>确保对象有指定的组件,如果没有则添加。 | -| GetActualValue() |public static float GetActualValue(float valueOrRate, float total, float maxRate = 1.5f)| -| GetAngle360() |public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | -| GetBlurColor() |public static Color32 GetBlurColor(Color32 color, float a = 0.3f)| -| GetColor() |public static Color32 GetColor(string hexColorStr)| -| GetDire() |public static Vector3 GetDire(float angle, bool isDegree = false)| -| GetFullName() |public static string GetFullName(Transform transform)| -| GetHighlightColor() |public static Color32 GetHighlightColor(Color32 color, float rate = 0.8f)| -| GetLastValue() |public static Vector3 GetLastValue(List<Vector3> list)| -| GetMaxDivisibleValue() |public static double GetMaxDivisibleValue(double max, double ceilRate)| -| GetMaxLogValue() |public static double GetMaxLogValue(double value, float logBase, bool isLogBaseE, out int splitNumber)| -| GetMinDivisibleValue() |public static double GetMinDivisibleValue(double min, double ceilRate)| -| GetMinLogValue() |public static double GetMinLogValue(double value, float logBase, bool isLogBaseE, out int splitNumber)| -| GetOrAddComponent<T>() |public static T GetOrAddComponent<T>(GameObject gameObject) where T : Component| -| GetOrAddComponent<T>() |public static T GetOrAddComponent<T>(Transform transform) where T : Component| -| GetPointList() |public static void GetPointList(ref List<Vector3> posList, Vector3 sp, Vector3 ep, float k = 30f)| -| GetPos() |public static Vector3 GetPos(Vector3 center, float radius, float angle, bool isDegree = false)| -| GetPosition() |public static Vector3 GetPosition(Vector3 center, float angle, float radius)| -| GetSelectColor() |public static Color32 GetSelectColor(Color32 color, float rate = 0.8f)| -| GetVertialDire() |public static Vector3 GetVertialDire(Vector3 dire)| -| HideAllObject() |public static void HideAllObject(GameObject obj, string match = null)| -| HideAllObject() |public static void HideAllObject(Transform parent, string match = null)| -| IsClearColor() |public static bool IsClearColor(Color color)| -| IsClearColor() |public static bool IsClearColor(Color32 color)| -| IsColorAlphaZero() |public static bool IsColorAlphaZero(Color color)| -| IsEquals() |public static bool IsEquals(double d1, double d2)| -| IsEquals() |public static bool IsEquals(float d1, float d2)| -| IsIngore() |public static bool IsIngore(Vector3 pos)| -| IsInRect() |public static bool IsInRect(Vector3 pos, float xMin, float xMax, float yMin, float yMax)| -| IsPointInQuadrilateral() |public static bool IsPointInQuadrilateral(Vector3 P, Vector3 A, Vector3 B, Vector3 C, Vector3 D)| -| IsValueEqualsColor() |public static bool IsValueEqualsColor(Color color1, Color color2)| -| IsValueEqualsColor() |public static bool IsValueEqualsColor(Color32 color1, Color32 color2)| -| IsValueEqualsList<T>() |public static bool IsValueEqualsList<T>(List<T> list1, List<T> list2)| -| IsValueEqualsString() |public static bool IsValueEqualsString(string str1, string str2)| -| IsValueEqualsVector2() |public static bool IsValueEqualsVector2(Vector2 v1, Vector2 v2)| -| IsValueEqualsVector3() |public static bool IsValueEqualsVector3(Vector3 v1, Vector3 v2)| -| IsZeroVector() |public static bool IsZeroVector(Vector3 pos)| -| ParseFloatFromString() |public static List<float> ParseFloatFromString(string jsonData)| -| ParseStringFromString() |public static List<string> ParseStringFromString(string jsonData)| -| RemoveComponent<T>() |public static void RemoveComponent<T>(GameObject gameObject)| -| RotateRound() |public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| -| SaveAsImage() |public static Texture2D SaveAsImage(RectTransform rectTransform, Canvas canvas, string imageType = "png", string path = "")| -| SetActive() |public static void SetActive(GameObject gameObject, bool active)| -| SetActive() |public static void SetActive(Image image, bool active)| -| SetActive() |public static void SetActive(Text text, bool active)| -| SetActive() |public static void SetActive(Transform transform, bool active)<br/>通过设置scale实现是否显示,优化性能,减少GC | -| SetBackground() |public static void SetBackground(Image background, ImageStyle imageStyle)| -| SetColorOpacity() |public static void SetColorOpacity(ref Color32 color, float opacity)| +|ActiveAllObject()||public static void ActiveAllObject(Transform parent, bool active, string match = null)| +|AddIcon()||public static Image AddIcon(string name, Transform parent, IconStyle iconStyle)| +|Cancat()||public static string Cancat(string str1, int i)| +|Cancat()||public static string Cancat(string str1, string str2)| +|ClearEventListener()||public static void ClearEventListener(GameObject obj)| +|CopyArray<T>()||public static bool CopyArray<T>(T[] toList, T[] fromList)| +|CopyList<T>()||public static bool CopyList<T>(List<T> toList, List<T> fromList)| +|DestoryGameObject()||public static void DestoryGameObject(GameObject go)| +|DestoryGameObject()||public static void DestoryGameObject(Transform parent, string childName)| +|DestoryGameObjectByMatch()||public static void DestoryGameObjectByMatch(Transform parent, string containString)| +|DestroyAllChildren()||public static void DestroyAllChildren(Transform parent)| +|EnsureComponent<T>()||public static T EnsureComponent<T>(GameObject gameObject) where T : Component<br/>确保对象有指定的组件,如果没有则添加。 | +|EnsureComponent<T>()||public static T EnsureComponent<T>(Transform transform) where T : Component<br/>确保对象有指定的组件,如果没有则添加。 | +|GetActualValue()||public static float GetActualValue(float valueOrRate, float total, float maxRate = 1.5f)| +|GetAngle360()||public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | +|GetBlurColor()||public static Color32 GetBlurColor(Color32 color, float a = 0.3f)| +|GetColor()||public static Color32 GetColor(string hexColorStr)| +|GetDire()||public static Vector3 GetDire(float angle, bool isDegree = false)| +|GetFullName()||public static string GetFullName(Transform transform)| +|GetHighlightColor()||public static Color32 GetHighlightColor(Color32 color, float rate = 0.8f)| +|GetLastValue()||public static Vector3 GetLastValue(List<Vector3> list)| +|GetMaxDivisibleValue()||public static double GetMaxDivisibleValue(double max, double ceilRate)| +|GetMaxLogValue()||public static double GetMaxLogValue(double value, float logBase, bool isLogBaseE, out int splitNumber)| +|GetMinDivisibleValue()||public static double GetMinDivisibleValue(double min, double ceilRate)| +|GetMinLogValue()||public static double GetMinLogValue(double value, float logBase, bool isLogBaseE, out int splitNumber)| +|GetOrAddComponent<T>()||public static T GetOrAddComponent<T>(GameObject gameObject) where T : Component| +|GetOrAddComponent<T>()||public static T GetOrAddComponent<T>(Transform transform) where T : Component| +|GetPointList()||public static void GetPointList(ref List<Vector3> posList, Vector3 sp, Vector3 ep, float k = 30f)| +|GetPos()||public static Vector3 GetPos(Vector3 center, float radius, float angle, bool isDegree = false)| +|GetPosition()||public static Vector3 GetPosition(Vector3 center, float angle, float radius)| +|GetSelectColor()||public static Color32 GetSelectColor(Color32 color, float rate = 0.8f)| +|GetVertialDire()||public static Vector3 GetVertialDire(Vector3 dire)| +|HideAllObject()||public static void HideAllObject(GameObject obj, string match = null)| +|HideAllObject()||public static void HideAllObject(Transform parent, string match = null)| +|IsClearColor()||public static bool IsClearColor(Color color)| +|IsClearColor()||public static bool IsClearColor(Color32 color)| +|IsColorAlphaZero()||public static bool IsColorAlphaZero(Color color)| +|IsEquals()||public static bool IsEquals(double d1, double d2)| +|IsEquals()||public static bool IsEquals(float d1, float d2)| +|IsIngore()||public static bool IsIngore(Vector3 pos)| +|IsInRect()||public static bool IsInRect(Vector3 pos, float xMin, float xMax, float yMin, float yMax)| +|IsPointInQuadrilateral()||public static bool IsPointInQuadrilateral(Vector3 P, Vector3 A, Vector3 B, Vector3 C, Vector3 D)| +|IsValueEqualsColor()||public static bool IsValueEqualsColor(Color color1, Color color2)| +|IsValueEqualsColor()||public static bool IsValueEqualsColor(Color32 color1, Color32 color2)| +|IsValueEqualsList<T>()||public static bool IsValueEqualsList<T>(List<T> list1, List<T> list2)| +|IsValueEqualsString()||public static bool IsValueEqualsString(string str1, string str2)| +|IsValueEqualsVector2()||public static bool IsValueEqualsVector2(Vector2 v1, Vector2 v2)| +|IsValueEqualsVector3()||public static bool IsValueEqualsVector3(Vector3 v1, Vector3 v2)| +|IsZeroVector()||public static bool IsZeroVector(Vector3 pos)| +|ParseFloatFromString()||public static List<float> ParseFloatFromString(string jsonData)| +|ParseStringFromString()||public static List<string> ParseStringFromString(string jsonData)| +|RemoveComponent<T>()||public static void RemoveComponent<T>(GameObject gameObject)| +|RotateRound()||public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| +|SaveAsImage()||public static Texture2D SaveAsImage(RectTransform rectTransform, Canvas canvas, string imageType = "png", string path = "")| +|SetActive()||public static void SetActive(GameObject gameObject, bool active)| +|SetActive()||public static void SetActive(Image image, bool active)| +|SetActive()||public static void SetActive(Text text, bool active)| +|SetActive()||public static void SetActive(Transform transform, bool active)<br/>通过设置scale实现是否显示,优化性能,减少GC | +|SetBackground()||public static void SetBackground(Image background, ImageStyle imageStyle)| +|SetColorOpacity()||public static void SetColorOpacity(ref Color32 color, float opacity)| ## ChartLabel Inherits or Implemented: [Image](#image) -|public method|description| +|public method|since|description| |--|--| -| GetHeight() |public float GetHeight()| -| GetPosition() |public Vector3 GetPosition()| -| GetTextHeight() |public float GetTextHeight()| -| GetTextWidth() |public float GetTextWidth()| -| GetWidth() |public float GetWidth()| -| IsActive() |public override bool IsActive()| -| SetActive() |public void SetActive(bool flag)| -| SetIcon() |public void SetIcon(Image image)| -| SetIconActive() |public void SetIconActive(bool flag)| -| SetIconSize() |public void SetIconSize(float width, float height)| -| SetIconSprite() |public void SetIconSprite(Sprite sprite)| -| SetPadding() |public void SetPadding(float[] padding)| -| SetPosition() |public void SetPosition(Vector3 position)| -| SetRectPosition() |public void SetRectPosition(Vector3 position)| -| SetSize() |public void SetSize(float width, float height)| -| SetText() |public bool SetText(string text)| -| SetTextActive() |public void SetTextActive(bool flag)| -| SetTextColor() |public void SetTextColor(Color color)| -| SetTextPadding() |public void SetTextPadding(TextPadding padding)| -| SetTextRotate() |public void SetTextRotate(float rotate)| -| UpdateIcon() |public void UpdateIcon(IconStyle iconStyle, Sprite sprite = null)| +|GetHeight()||public float GetHeight()| +|GetPosition()||public Vector3 GetPosition()| +|GetTextHeight()||public float GetTextHeight()| +|GetTextWidth()||public float GetTextWidth()| +|GetWidth()||public float GetWidth()| +|IsActive()||public override bool IsActive()| +|SetActive()||public void SetActive(bool flag)| +|SetIcon()||public void SetIcon(Image image)| +|SetIconActive()||public void SetIconActive(bool flag)| +|SetIconSize()||public void SetIconSize(float width, float height)| +|SetIconSprite()||public void SetIconSprite(Sprite sprite)| +|SetPadding()||public void SetPadding(float[] padding)| +|SetPosition()||public void SetPosition(Vector3 position)| +|SetRectPosition()||public void SetRectPosition(Vector3 position)| +|SetSize()||public void SetSize(float width, float height)| +|SetText()||public bool SetText(string text)| +|SetTextActive()||public void SetTextActive(bool flag)| +|SetTextColor()||public void SetTextColor(Color color)| +|SetTextPadding()||public void SetTextPadding(TextPadding padding)| +|SetTextRotate()||public void SetTextRotate(float rotate)| +|UpdateIcon()||public void UpdateIcon(IconStyle iconStyle, Sprite sprite = null)| ## ChartObject -|public method|description| +|public method|since|description| |--|--| -| Destroy() |public virtual void Destroy()| +|Destroy()||public virtual void Destroy()| ## CheckHelper -|public method|description| +|public method|since|description| |--|--| -| CheckChart() |public static string CheckChart(BaseChart chart)| -| CheckChart() |public static string CheckChart(BaseGraph chart)| +|CheckChart()||public static string CheckChart(BaseChart chart)| +|CheckChart()||public static string CheckChart(BaseGraph chart)| ## ColorUtil -|public method|description| +|public method|since|description| |--|--| -| GetColor() |public static Color32 GetColor(string hexColorStr)<br/>将字符串颜色值转成Color。 | +|GetColor()||public static Color32 GetColor(string hexColorStr)<br/>将字符串颜色值转成Color。 | ## ComponentHandlerAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| ComponentHandlerAttribute() |public ComponentHandlerAttribute(Type handler)| -| ComponentHandlerAttribute() |public ComponentHandlerAttribute(Type handler, bool allowMultiple)| +|ComponentHandlerAttribute()||public ComponentHandlerAttribute(Type handler)| +|ComponentHandlerAttribute()||public ComponentHandlerAttribute(Type handler, bool allowMultiple)| ## ComponentHelper -|public method|description| +|public method|since|description| |--|--| -| GetAngleAxis() |public static AngleAxis GetAngleAxis(List<MainComponent> components, int polarIndex)| -| GetRadiusAxis() |public static RadiusAxis GetRadiusAxis(List<MainComponent> components, int polarIndex)| -| GetXAxisOnZeroOffset() |public static float GetXAxisOnZeroOffset(List<MainComponent> components, XAxis axis)| -| GetYAxisOnZeroOffset() |public static float GetYAxisOnZeroOffset(List<MainComponent> components, YAxis axis)| -| IsAnyCategoryOfYAxis() |public static bool IsAnyCategoryOfYAxis(List<MainComponent> components)| +|GetAngleAxis()||public static AngleAxis GetAngleAxis(List<MainComponent> components, int polarIndex)| +|GetRadiusAxis()||public static RadiusAxis GetRadiusAxis(List<MainComponent> components, int polarIndex)| +|GetXAxisOnZeroOffset()||public static float GetXAxisOnZeroOffset(List<MainComponent> components, XAxis axis)| +|GetYAxisOnZeroOffset()||public static float GetYAxisOnZeroOffset(List<MainComponent> components, YAxis axis)| +|IsAnyCategoryOfYAxis()||public static bool IsAnyCategoryOfYAxis(List<MainComponent> components)| ## CoordOptionsAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains<T>() |public bool Contains<T>() where T : CoordSystem| -| CoordOptionsAttribute() |public CoordOptionsAttribute(Type coord)| -| CoordOptionsAttribute() |public CoordOptionsAttribute(Type coord, Type coord2)| -| CoordOptionsAttribute() |public CoordOptionsAttribute(Type coord, Type coord2, Type coord3)| -| CoordOptionsAttribute() |public CoordOptionsAttribute(Type coord, Type coord2, Type coord3, Type coord4)| +|Contains<T>()||public bool Contains<T>() where T : CoordSystem| +|CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord)| +|CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord, Type coord2)| +|CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord, Type coord2, Type coord3)| +|CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord, Type coord2, Type coord3, Type coord4)| ## DataZoomContext @@ -538,43 +538,43 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## DataZoomHelper -|public method|description| +|public method|since|description| |--|--| -| UpdateDataZoomRuntimeStartEndValue() |public static void UpdateDataZoomRuntimeStartEndValue(DataZoom dataZoom, Serie serie)| -| UpdateDataZoomRuntimeStartEndValue<T>() |public static void UpdateDataZoomRuntimeStartEndValue<T>(BaseChart chart) where T : Serie| +|UpdateDataZoomRuntimeStartEndValue()||public static void UpdateDataZoomRuntimeStartEndValue(DataZoom dataZoom, Serie serie)| +|UpdateDataZoomRuntimeStartEndValue<T>()||public static void UpdateDataZoomRuntimeStartEndValue<T>(BaseChart chart) where T : Serie| ## DateTimeUtil -|public method|description| +|public method|since|description| |--|--| -| GetDateTime() |public static DateTime GetDateTime(int timestamp)| -| GetTimestamp() |public static int GetTimestamp()| -| GetTimestamp() |public static int GetTimestamp(DateTime time)| +|GetDateTime()||public static DateTime GetDateTime(int timestamp)| +|GetTimestamp()||public static int GetTimestamp()| +|GetTimestamp()||public static int GetTimestamp(DateTime time)| ## DefaultAnimationAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| DefaultAnimationAttribute() |public DefaultAnimationAttribute(AnimationType handler)| +|DefaultAnimationAttribute()||public DefaultAnimationAttribute(AnimationType handler)| ## DefineSymbolsUtil -|public method|description| +|public method|since|description| |--|--| -| AddGlobalDefine() |public static void AddGlobalDefine(string symbol)| -| RemoveGlobalDefine() |public static void RemoveGlobalDefine(string symbol)| +|AddGlobalDefine()||public static void AddGlobalDefine(string symbol)| +|RemoveGlobalDefine()||public static void RemoveGlobalDefine(string symbol)| ## FormatterHelper -|public method|description| +|public method|since|description| |--|--| -| NeedFormat() |public static bool NeedFormat(string content)| -| ReplaceAxisLabelContent() |public static void ReplaceAxisLabelContent(ref string content, string numericFormatter, double value)| -| ReplaceAxisLabelContent() |public static void ReplaceAxisLabelContent(ref string content, string value)| -| TrimAndReplaceLine() |public static string TrimAndReplaceLine(string content)| -| TrimAndReplaceLine() |public static string TrimAndReplaceLine(StringBuilder sb)| +|NeedFormat()||public static bool NeedFormat(string content)| +|ReplaceAxisLabelContent()||public static void ReplaceAxisLabelContent(ref string content, string numericFormatter, double value)| +|ReplaceAxisLabelContent()||public static void ReplaceAxisLabelContent(ref string content, string value)| +|TrimAndReplaceLine()||public static string TrimAndReplaceLine(string content)| +|TrimAndReplaceLine()||public static string TrimAndReplaceLine(StringBuilder sb)| ## GridCoordContext @@ -588,39 +588,39 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| IgnoreDoc() |public IgnoreDoc()| +|IgnoreDoc()||public IgnoreDoc()| ## InputHelper -|public method|description| +|public method|since|description| |--|--| -| GetKeyDown() |public static bool GetKeyDown(KeyCode keyCode)| -| GetTouch() |public static Touch GetTouch(int v)| +|GetKeyDown()||public static bool GetKeyDown(KeyCode keyCode)| +|GetTouch()||public static Touch GetTouch(int v)| ## InteractData -|public method|description| +|public method|since|description| |--|--| -| Reset() |public void Reset()| -| SetColor() |public void SetColor(ref bool needInteract, Color32 color)| -| SetColor() |public void SetColor(ref bool needInteract, Color32 color, Color32 toColor)| -| SetValue() |public void SetValue(ref bool needInteract, float size)| -| SetValue() |public void SetValue(ref bool needInteract, float size, bool highlight, float rate = 1.3f)| -| SetValueAndColor() |public void SetValueAndColor(ref bool needInteract, float value, Color32 color)| -| SetValueAndColor() |public void SetValueAndColor(ref bool needInteract, float value, Color32 color, Color32 toColor)| -| TryGetColor() |public bool TryGetColor(ref Color32 color, ref bool interacting, float animationDuration = 250)| -| TryGetColor() |public bool TryGetColor(ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250)| -| TryGetValue() |public bool TryGetValue(ref float value, ref bool interacting, float animationDuration = 250)| -| TryGetValueAndColor() |public bool TryGetValueAndColor(ref float value, ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250)| +|Reset()||public void Reset()| +|SetColor()||public void SetColor(ref bool needInteract, Color32 color)| +|SetColor()||public void SetColor(ref bool needInteract, Color32 color, Color32 toColor)| +|SetValue()||public void SetValue(ref bool needInteract, float size)| +|SetValue()||public void SetValue(ref bool needInteract, float size, bool highlight, float rate = 1.3f)| +|SetValueAndColor()||public void SetValueAndColor(ref bool needInteract, float value, Color32 color)| +|SetValueAndColor()||public void SetValueAndColor(ref bool needInteract, float value, Color32 color, Color32 toColor)| +|TryGetColor()||public bool TryGetColor(ref Color32 color, ref bool interacting, float animationDuration = 250)| +|TryGetColor()||public bool TryGetColor(ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250)| +|TryGetValue()||public bool TryGetValue(ref float value, ref bool interacting, float animationDuration = 250)| +|TryGetValueAndColor()||public bool TryGetValueAndColor(ref float value, ref Color32 color, ref Color32 toColor, ref bool interacting, float animationDuration = 250)| ## LayerHelper -|public method|description| +|public method|since|description| |--|--| -| IsFixedWidthHeight() |public static bool IsFixedWidthHeight(RectTransform rt)| -| IsStretchPivot() |public static bool IsStretchPivot(RectTransform rt)| +|IsFixedWidthHeight()||public static bool IsFixedWidthHeight(RectTransform rt)| +|IsStretchPivot()||public static bool IsStretchPivot(RectTransform rt)| ## LegendContext @@ -628,37 +628,37 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## LegendHelper -|public method|description| +|public method|since|description| |--|--| -| CheckDataHighlighted() |public static bool CheckDataHighlighted(Serie serie, string legendName, bool heighlight)| -| CheckDataShow() |public static bool CheckDataShow(Serie serie, string legendName, bool show)| -| GetContentColor() |public static Color GetContentColor(BaseChart chart, int legendIndex, string legendName, Legend legend, ThemeStyle theme, bool active)| -| GetIconColor() |public static Color GetIconColor(BaseChart chart, Legend legend, int readIndex, string legendName, bool active)| -| ResetItemPosition() |public static void ResetItemPosition(Legend legend, Vector3 chartPos, float chartWidth, float chartHeight)| -| SetLegendBackground() |public static void SetLegendBackground(Legend legend, ImageStyle style)| +|CheckDataHighlighted()||public static bool CheckDataHighlighted(Serie serie, string legendName, bool heighlight)| +|CheckDataShow()||public static bool CheckDataShow(Serie serie, string legendName, bool show)| +|GetContentColor()||public static Color GetContentColor(BaseChart chart, int legendIndex, string legendName, Legend legend, ThemeStyle theme, bool active)| +|GetIconColor()||public static Color GetIconColor(BaseChart chart, Legend legend, int readIndex, string legendName, bool active)| +|ResetItemPosition()||public static void ResetItemPosition(Legend legend, Vector3 chartPos, float chartWidth, float chartHeight)| +|SetLegendBackground()||public static void SetLegendBackground(Legend legend, ImageStyle style)| ## LegendItem -|public method|description| +|public method|since|description| |--|--| -| GetIconColor() |public Color GetIconColor()| -| GetIconRect() |public Rect GetIconRect()| -| SetActive() |public void SetActive(bool active)| -| SetBackground() |public void SetBackground(ImageStyle imageStyle)| -| SetButton() |public void SetButton(Button button)| -| SetContent() |public bool SetContent(string content)| -| SetContentBackgroundColor() |public void SetContentBackgroundColor(Color color)| -| SetContentColor() |public void SetContentColor(Color color)| -| SetContentPosition() |public void SetContentPosition(Vector3 offset)| -| SetIcon() |public void SetIcon(Image icon)| -| SetIconActive() |public void SetIconActive(bool active)| -| SetIconColor() |public void SetIconColor(Color color)| -| SetIconImage() |public void SetIconImage(Sprite image)| -| SetIconSize() |public void SetIconSize(float width, float height)| -| SetObject() |public void SetObject(GameObject obj)| -| SetPosition() |public void SetPosition(Vector3 position)| -| SetText() |public void SetText(ChartText text)| -| SetTextBackground() |public void SetTextBackground(Image image)| +|GetIconColor()||public Color GetIconColor()| +|GetIconRect()||public Rect GetIconRect()| +|SetActive()||public void SetActive(bool active)| +|SetBackground()||public void SetBackground(ImageStyle imageStyle)| +|SetButton()||public void SetButton(Button button)| +|SetContent()||public bool SetContent(string content)| +|SetContentBackgroundColor()||public void SetContentBackgroundColor(Color color)| +|SetContentColor()||public void SetContentColor(Color color)| +|SetContentPosition()||public void SetContentPosition(Vector3 offset)| +|SetIcon()||public void SetIcon(Image icon)| +|SetIconActive()||public void SetIconActive(bool active)| +|SetIconColor()||public void SetIconColor(Color color)| +|SetIconImage()||public void SetIconImage(Sprite image)| +|SetIconSize()||public void SetIconSize(float width, float height)| +|SetObject()||public void SetObject(GameObject obj)| +|SetPosition()||public void SetPosition(Vector3 position)| +|SetText()||public void SetText(ChartText text)| +|SetTextBackground()||public void SetTextBackground(Image image)| ## LineChart @@ -668,49 +668,49 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| ListFor() |public ListFor(Type type)| +|ListFor()||public ListFor(Type type)| ## ListForComponent Inherits or Implemented: [ListFor](#listfor) -|public method|description| +|public method|since|description| |--|--| -| ListForComponent() |public ListForComponent(Type type) : base(type)| +|ListForComponent()||public ListForComponent(Type type) : base(type)| ## ListForSerie Inherits or Implemented: [ListFor](#listfor) -|public method|description| +|public method|since|description| |--|--| -| ListForSerie() |public ListForSerie(Type type) : base(type)| +|ListForSerie()||public ListForSerie(Type type) : base(type)| ## MainComponentContext ## MainComponentHandler -|public method|description| +|public method|since|description| |--|--| -| CheckComponent() |public virtual void CheckComponent(StringBuilder sb) { }| -| DrawBase() |public virtual void DrawBase(VertexHelper vh) { }| -| DrawTop() |public virtual void DrawTop(VertexHelper vh) { }| -| DrawUpper() |public virtual void DrawUpper(VertexHelper vh) { }| -| InitComponent() |public virtual void InitComponent() { }| -| OnBeginDrag() |public virtual void OnBeginDrag(PointerEventData eventData) { }| -| OnDrag() |public virtual void OnDrag(PointerEventData eventData) { }| -| OnEndDrag() |public virtual void OnEndDrag(PointerEventData eventData) { }| -| OnPointerClick() |public virtual void OnPointerClick(PointerEventData eventData) { }| -| OnPointerDown() |public virtual void OnPointerDown(PointerEventData eventData) { }| -| OnPointerEnter() |public virtual void OnPointerEnter(PointerEventData eventData) { }| -| OnPointerExit() |public virtual void OnPointerExit(PointerEventData eventData) { }| -| OnPointerUp() |public virtual void OnPointerUp(PointerEventData eventData) { }| -| OnScroll() |public virtual void OnScroll(PointerEventData eventData) { }| -| OnSerieDataUpdate() |public virtual void OnSerieDataUpdate(int serieIndex) { }| -| RemoveComponent() |public virtual void RemoveComponent() { }| -| Update() |public virtual void Update() { }| +|CheckComponent()||public virtual void CheckComponent(StringBuilder sb) { }| +|DrawBase()||public virtual void DrawBase(VertexHelper vh) { }| +|DrawTop()||public virtual void DrawTop(VertexHelper vh) { }| +|DrawUpper()||public virtual void DrawUpper(VertexHelper vh) { }| +|InitComponent()||public virtual void InitComponent() { }| +|OnBeginDrag()||public virtual void OnBeginDrag(PointerEventData eventData) { }| +|OnDrag()||public virtual void OnDrag(PointerEventData eventData) { }| +|OnEndDrag()||public virtual void OnEndDrag(PointerEventData eventData) { }| +|OnPointerClick()||public virtual void OnPointerClick(PointerEventData eventData) { }| +|OnPointerDown()||public virtual void OnPointerDown(PointerEventData eventData) { }| +|OnPointerEnter()||public virtual void OnPointerEnter(PointerEventData eventData) { }| +|OnPointerExit()||public virtual void OnPointerExit(PointerEventData eventData) { }| +|OnPointerUp()||public virtual void OnPointerUp(PointerEventData eventData) { }| +|OnScroll()||public virtual void OnScroll(PointerEventData eventData) { }| +|OnSerieDataUpdate()||public virtual void OnSerieDataUpdate(int serieIndex) { }| +|RemoveComponent()||public virtual void RemoveComponent() { }| +|Update()||public virtual void Update() { }| ## MainComponentHandler<T> @@ -718,39 +718,39 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) ## MathUtil -|public method|description| +|public method|since|description| |--|--| -| Abs() |public static double Abs(double d)| -| Approximately() |public static bool Approximately(double a, double b)| -| Clamp() |public static double Clamp(double d, double min, double max)| -| Clamp01() |public static double Clamp01(double value)| -| GetPrecision() |public static int GetPrecision(double value)| -| IsInteger() |public static bool IsInteger(double value)| -| Lerp() |public static double Lerp(double a, double b, double t)| +|Abs()||public static double Abs(double d)| +|Approximately()||public static bool Approximately(double a, double b)| +|Clamp()||public static double Clamp(double d, double min, double max)| +|Clamp01()||public static double Clamp01(double value)| +|GetPrecision()||public static int GetPrecision(double value)| +|IsInteger()||public static bool IsInteger(double value)| +|Lerp()||public static double Lerp(double a, double b, double t)| ## ObjectPool<T> where T Inherits or Implemented: [new()](#new()) -|public method|description| +|public method|since|description| |--|--| -| ClearAll() |public void ClearAll()| -| Get() |public T Get()| -| new() |public class ObjectPool<T> where T : new()| -| ObjectPool() |public ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease, bool newIfEmpty = true)| -| Release() |public void Release(T element)| +|ClearAll()||public void ClearAll()| +|Get()||public T Get()| +|new()||public class ObjectPool<T> where T : new()| +|ObjectPool()||public ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease, bool newIfEmpty = true)| +|Release()||public void Release(T element)| ## Painter Inherits or Implemented: [MaskableGraphic](#maskablegraphic) -|public method|description| +|public method|since|description| |--|--| -| onPopulateMesh |public Action<VertexHelper, Painter> onPopulateMesh| -| CheckRefresh() |public void CheckRefresh()| -| Init() |public void Init()| -| Refresh() |public void Refresh()| -| SetActive() |public void SetActive(bool flag, bool isDebugMode = false)| +|onPopulateMesh||public Action<VertexHelper, Painter> onPopulateMesh| +|CheckRefresh()||public void CheckRefresh()| +|Init()||public void Init()| +|Refresh()||public void Refresh()| +|SetActive()||public void SetActive(bool flag, bool isDebugMode = false)| ## ParallelChart @@ -774,12 +774,12 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## PropertyUtil -|public method|description| +|public method|since|description| |--|--| -| SetClass<T>() |public static bool SetClass<T>(ref T currentValue, T newValue, bool notNull = false) where T : class| -| SetColor() |public static bool SetColor(ref Color currentValue, Color newValue)| -| SetColor() |public static bool SetColor(ref Color32 currentValue, Color32 newValue)| -| SetStruct<T>() |public static bool SetStruct<T>(ref T currentValue, T newValue) where T : struct| +|SetClass<T>()||public static bool SetClass<T>(ref T currentValue, T newValue, bool notNull = false) where T : class| +|SetColor()||public static bool SetColor(ref Color currentValue, Color newValue)| +|SetColor()||public static bool SetColor(ref Color32 currentValue, Color32 newValue)| +|SetStruct<T>()||public static bool SetStruct<T>(ref T currentValue, T newValue) where T : struct| ## RadarChart @@ -791,24 +791,24 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## ReflectionUtil -|public method|description| +|public method|since|description| |--|--| -| DeepCloneSerializeField() |public static object DeepCloneSerializeField(object obj)| -| InvokeListAdd() |public static void InvokeListAdd(object obj, FieldInfo field, object item)| -| InvokeListAddTo<T>() |public static void InvokeListAddTo<T>(object obj, FieldInfo field, Action<T> callback)| -| InvokeListClear() |public static void InvokeListClear(object obj, FieldInfo field)| -| InvokeListCount() |public static int InvokeListCount(object obj, FieldInfo field)| -| InvokeListGet<T>() |public static T InvokeListGet<T>(object obj, FieldInfo field, int i)| +|DeepCloneSerializeField()||public static object DeepCloneSerializeField(object obj)| +|InvokeListAdd()||public static void InvokeListAdd(object obj, FieldInfo field, object item)| +|InvokeListAddTo<T>()||public static void InvokeListAddTo<T>(object obj, FieldInfo field, Action<T> callback)| +|InvokeListClear()||public static void InvokeListClear(object obj, FieldInfo field)| +|InvokeListCount()||public static int InvokeListCount(object obj, FieldInfo field)| +|InvokeListGet<T>()||public static T InvokeListGet<T>(object obj, FieldInfo field, int i)| ## RequireChartComponentAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| RequireChartComponentAttribute() |public RequireChartComponentAttribute(Type requiredComponent)| -| RequireChartComponentAttribute() |public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2)| -| RequireChartComponentAttribute() |public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2, Type requiredComponent3)| +|RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent)| +|RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2)| +|RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2, Type requiredComponent3)| ## RingChart @@ -816,14 +816,14 @@ Inherits or Implemented: [BaseChart](#basechart) ## RuntimeUtil -|public method|description| +|public method|since|description| |--|--| -| GetAllAssemblyTypes() |public static IEnumerable<Type> GetAllAssemblyTypes()| -| GetAllTypesDerivedFrom() |public static IEnumerable<Type> GetAllTypesDerivedFrom(Type type)| -| GetAllTypesDerivedFrom<T>() |public static IEnumerable<Type> GetAllTypesDerivedFrom<T>()| -| GetAttribute<T>() |public static T GetAttribute<T>(this MemberInfo type, bool check = true) where T : Attribute| -| GetAttribute<T>() |public static T GetAttribute<T>(this Type type, bool check = true) where T : Attribute| -| HasSubclass() |public static bool HasSubclass(Type type)| +|GetAllAssemblyTypes()||public static IEnumerable<Type> GetAllAssemblyTypes()| +|GetAllTypesDerivedFrom()||public static IEnumerable<Type> GetAllTypesDerivedFrom(Type type)| +|GetAllTypesDerivedFrom<T>()||public static IEnumerable<Type> GetAllTypesDerivedFrom<T>()| +|GetAttribute<T>()||public static T GetAttribute<T>(this MemberInfo type, bool check = true) where T : Attribute| +|GetAttribute<T>()||public static T GetAttribute<T>(this Type type, bool check = true) where T : Attribute| +|HasSubclass()||public static bool HasSubclass(Type type)| ## ScatterChart @@ -833,18 +833,18 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : ISerieComponent| -| SerieComponentAttribute() |public SerieComponentAttribute()| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| -| SerieComponentAttribute() |public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| +|Contains()||public bool Contains(Type type)| +|Contains<T>()||public bool Contains<T>() where T : ISerieComponent| +|SerieComponentAttribute()||public SerieComponentAttribute()| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| +|SerieComponentAttribute()||public SerieComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| ## SerieContext @@ -852,209 +852,209 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : Serie| -| SerieConvertAttribute() |public SerieConvertAttribute(Type serie)| -| SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2)| -| SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2, Type serie3)| -| SerieConvertAttribute() |public SerieConvertAttribute(Type serie, Type serie2, Type serie3, Type serie4)| +|Contains()||public bool Contains(Type type)| +|Contains<T>()||public bool Contains<T>() where T : Serie| +|SerieConvertAttribute()||public SerieConvertAttribute(Type serie)| +|SerieConvertAttribute()||public SerieConvertAttribute(Type serie, Type serie2)| +|SerieConvertAttribute()||public SerieConvertAttribute(Type serie, Type serie2, Type serie3)| +|SerieConvertAttribute()||public SerieConvertAttribute(Type serie, Type serie2, Type serie3, Type serie4)| ## SerieDataComponentAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains() |public bool Contains(Type type)| -| Contains<T>() |public bool Contains<T>() where T : ISerieComponent| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute()| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| -| SerieDataComponentAttribute() |public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| +|Contains()||public bool Contains(Type type)| +|Contains<T>()||public bool Contains<T>() where T : ISerieComponent| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute()| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6)| +|SerieDataComponentAttribute()||public SerieDataComponentAttribute(Type type1, Type type2, Type type3, Type type4, Type type5, Type type6, Type type7)| ## SerieDataContext -|public method|description| +|public method|since|description| |--|--| -| Reset() |public void Reset()| +|Reset()||public void Reset()| ## SerieDataExtraFieldAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Contains() |public bool Contains(string field)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute()| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6)| -| SerieDataExtraFieldAttribute() |public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6, string field7)| +|Contains()||public bool Contains(string field)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute()| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6)| +|SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1, string field2, string field3, string field4, string field5, string field6, string field7)| ## SerieEventData -|public method|description| +|public method|since|description| |--|--| -| Reset() |public void Reset()| +|Reset()||public void Reset()| ## SerieEventDataPool -|public method|description| +|public method|since|description| |--|--| -| Get() |public static SerieEventData Get(Vector3 pos, int serieIndex, int dataIndex, int dimension, double value)| -| Release() |public static void Release(SerieEventData toRelease)| +|Get()||public static SerieEventData Get(Vector3 pos, int serieIndex, int dataIndex, int dimension, double value)| +|Release()||public static void Release(SerieEventData toRelease)| ## SerieHandler -|public method|description| +|public method|since|description| |--|--| -| CheckComponent() |public virtual void CheckComponent(StringBuilder sb) { }| -| DrawBase() |public virtual void DrawBase(VertexHelper vh) { }| -| DrawSerie() |public virtual void DrawSerie(VertexHelper vh) { }| -| DrawTop() |public virtual void DrawTop(VertexHelper vh) { }| -| DrawUpper() |public virtual void DrawUpper(VertexHelper vh) { }| -| InitComponent() |public virtual void InitComponent() { }| -| OnBeginDrag() |public virtual void OnBeginDrag(PointerEventData eventData) { }| -| OnDrag() |public virtual void OnDrag(PointerEventData eventData) { }| -| OnEndDrag() |public virtual void OnEndDrag(PointerEventData eventData) { }| -| OnLegendButtonClick() |public virtual void OnLegendButtonClick(int index, string legendName, bool show) { }| -| OnLegendButtonEnter() |public virtual void OnLegendButtonEnter(int index, string legendName) { }| -| OnLegendButtonExit() |public virtual void OnLegendButtonExit(int index, string legendName) { }| -| OnPointerClick() |public virtual void OnPointerClick(PointerEventData eventData) { }| -| OnPointerDown() |public virtual void OnPointerDown(PointerEventData eventData) { }| -| OnPointerEnter() |public virtual void OnPointerEnter(PointerEventData eventData) { }| -| OnPointerExit() |public virtual void OnPointerExit(PointerEventData eventData) { }| -| OnPointerUp() |public virtual void OnPointerUp(PointerEventData eventData) { }| -| OnScroll() |public virtual void OnScroll(PointerEventData eventData) { }| -| RefreshLabelInternal() |public virtual void RefreshLabelInternal() { }| -| RefreshLabelNextFrame() |public virtual void RefreshLabelNextFrame() { }| -| RemoveComponent() |public virtual void RemoveComponent() { }| -| Update() |public virtual void Update() { }| -| UpdateSerieContext() |public virtual void UpdateSerieContext() { }| +|CheckComponent()||public virtual void CheckComponent(StringBuilder sb) { }| +|DrawBase()||public virtual void DrawBase(VertexHelper vh) { }| +|DrawSerie()||public virtual void DrawSerie(VertexHelper vh) { }| +|DrawTop()||public virtual void DrawTop(VertexHelper vh) { }| +|DrawUpper()||public virtual void DrawUpper(VertexHelper vh) { }| +|InitComponent()||public virtual void InitComponent() { }| +|OnBeginDrag()||public virtual void OnBeginDrag(PointerEventData eventData) { }| +|OnDrag()||public virtual void OnDrag(PointerEventData eventData) { }| +|OnEndDrag()||public virtual void OnEndDrag(PointerEventData eventData) { }| +|OnLegendButtonClick()||public virtual void OnLegendButtonClick(int index, string legendName, bool show) { }| +|OnLegendButtonEnter()||public virtual void OnLegendButtonEnter(int index, string legendName) { }| +|OnLegendButtonExit()||public virtual void OnLegendButtonExit(int index, string legendName) { }| +|OnPointerClick()||public virtual void OnPointerClick(PointerEventData eventData) { }| +|OnPointerDown()||public virtual void OnPointerDown(PointerEventData eventData) { }| +|OnPointerEnter()||public virtual void OnPointerEnter(PointerEventData eventData) { }| +|OnPointerExit()||public virtual void OnPointerExit(PointerEventData eventData) { }| +|OnPointerUp()||public virtual void OnPointerUp(PointerEventData eventData) { }| +|OnScroll()||public virtual void OnScroll(PointerEventData eventData) { }| +|RefreshLabelInternal()||public virtual void RefreshLabelInternal() { }| +|RefreshLabelNextFrame()||public virtual void RefreshLabelNextFrame() { }| +|RemoveComponent()||public virtual void RemoveComponent() { }| +|Update()||public virtual void Update() { }| +|UpdateSerieContext()||public virtual void UpdateSerieContext() { }| ## SerieHandler<T> Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](#serie) -|public method|description| +|public method|since|description| |--|--| -| DrawLabelLineSymbol() |public void DrawLabelLineSymbol(VertexHelper vh, LabelLine labelLine, Vector3 startPos, Vector3 endPos, Color32 defaultColor)| -| GetPointerItemDataDimension() |public override int GetPointerItemDataDimension()| -| GetPointerItemDataIndex() |public override int GetPointerItemDataIndex()| -| GetSerieDataAutoColor() |public virtual Color GetSerieDataAutoColor(SerieData serieData)| -| GetSerieDataLabelOffset() |public virtual Vector3 GetSerieDataLabelOffset(SerieData serieData, LabelStyle label)| -| GetSerieDataLabelPosition() |public virtual Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)| -| GetSerieDataTitlePosition() |public virtual Vector3 GetSerieDataTitlePosition(SerieData serieData, TitleStyle titleStyle)| -| InitComponent() |public override void InitComponent()| -| OnLegendButtonClick() |public override void OnLegendButtonClick(int index, string legendName, bool show)| -| OnLegendButtonEnter() |public override void OnLegendButtonEnter(int index, string legendName)| -| OnLegendButtonExit() |public override void OnLegendButtonExit(int index, string legendName)| -| OnPointerClick() |public override void OnPointerClick(PointerEventData eventData)| -| OnPointerDown() |public override void OnPointerDown(PointerEventData eventData)| -| RefreshEndLabelInternal() |public virtual void RefreshEndLabelInternal()| -| RefreshLabelInternal() |public override void RefreshLabelInternal()| -| RefreshLabelNextFrame() |public override void RefreshLabelNextFrame()| -| RemoveComponent() |public override void RemoveComponent()| -| Update() |public override void Update()| +|DrawLabelLineSymbol()||public void DrawLabelLineSymbol(VertexHelper vh, LabelLine labelLine, Vector3 startPos, Vector3 endPos, Color32 defaultColor)| +|GetPointerItemDataDimension()||public override int GetPointerItemDataDimension()| +|GetPointerItemDataIndex()||public override int GetPointerItemDataIndex()| +|GetSerieDataAutoColor()||public virtual Color GetSerieDataAutoColor(SerieData serieData)| +|GetSerieDataLabelOffset()||public virtual Vector3 GetSerieDataLabelOffset(SerieData serieData, LabelStyle label)| +|GetSerieDataLabelPosition()||public virtual Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)| +|GetSerieDataTitlePosition()||public virtual Vector3 GetSerieDataTitlePosition(SerieData serieData, TitleStyle titleStyle)| +|InitComponent()||public override void InitComponent()| +|OnLegendButtonClick()||public override void OnLegendButtonClick(int index, string legendName, bool show)| +|OnLegendButtonEnter()||public override void OnLegendButtonEnter(int index, string legendName)| +|OnLegendButtonExit()||public override void OnLegendButtonExit(int index, string legendName)| +|OnPointerClick()||public override void OnPointerClick(PointerEventData eventData)| +|OnPointerDown()||public override void OnPointerDown(PointerEventData eventData)| +|RefreshEndLabelInternal()||public virtual void RefreshEndLabelInternal()| +|RefreshLabelInternal()||public override void RefreshLabelInternal()| +|RefreshLabelNextFrame()||public override void RefreshLabelNextFrame()| +|RemoveComponent()||public override void RemoveComponent()| +|Update()||public override void Update()| ## SerieHandlerAttribute Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| SerieHandlerAttribute() |public SerieHandlerAttribute(Type handler)| -| SerieHandlerAttribute() |public SerieHandlerAttribute(Type handler, bool allowMultiple)| +|SerieHandlerAttribute()||public SerieHandlerAttribute(Type handler)| +|SerieHandlerAttribute()||public SerieHandlerAttribute(Type handler, bool allowMultiple)| ## SerieHelper -|public method|description| +|public method|since|description| |--|--| -| CloneSerie<T>() |public static T CloneSerie<T>(Serie serie) where T : Serie| -| CopySerie() |public static void CopySerie(Serie oldSerie, Serie newSerie)| -| GetAllMinMaxData() |public static void GetAllMinMaxData(Serie serie, double ceilRate = 0, DataZoom dataZoom = null)| -| GetAreaStyle() |public static AreaStyle GetAreaStyle(Serie serie, SerieData serieData)| -| GetAverageData() |public static double GetAverageData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetBlurStyle() |public static BlurStyle GetBlurStyle(Serie serie, SerieData serieData)| -| GetEmphasisStyle() |public static EmphasisStyle GetEmphasisStyle(Serie serie, SerieData serieData)| -| GetItemColor() |public static Color32 GetItemColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, SerieState state = SerieState.Auto, bool opacity = true)| -| GetItemFormatter() |public static string GetItemFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)| -| GetItemMarker() |public static string GetItemMarker(Serie serie, SerieData serieData, string defaultMarker = null)| -| GetItemStyle() |public static ItemStyle GetItemStyle(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| -| GetLineColor() |public static Color32 GetLineColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, SerieState state = SerieState.Auto)| -| GetLineStyle() |public static LineStyle GetLineStyle(Serie serie, SerieData serieData)| -| GetMaxData() |public static double GetMaxData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetMaxSerieData() |public static SerieData GetMaxSerieData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetMedianData() |public static double GetMedianData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetMinData() |public static double GetMinData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetMinMaxData() |public static void GetMinMaxData(Serie serie, out double min, out double max, DataZoom dataZoom = null, int dimension = 0)<br/>获得系列所有数据的最大最小值。 | -| GetMinSerieData() |public static SerieData GetMinSerieData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| -| GetNumericFormatter() |public static string GetNumericFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)| -| GetSelectStyle() |public static SelectStyle GetSelectStyle(Serie serie, SerieData serieData)| -| GetSerieLabel() |public static LabelStyle GetSerieLabel(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| -| GetSerieLabelLine() |public static LabelLine GetSerieLabelLine(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| -| GetSerieState() |public static SerieState GetSerieState(Serie serie)| -| GetSerieState() |public static SerieState GetSerieState(Serie serie, SerieData serieData, bool defaultSerieState = false)| -| GetSerieState() |public static SerieState GetSerieState(SerieData serieData)| -| GetSerieSymbol() |public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| -| GetStateStyle() |public static StateStyle GetStateStyle(Serie serie, SerieData serieData, SerieState state)| -| GetSysmbolSize() |public static float GetSysmbolSize(Serie serie, SerieData serieData, ThemeStyle theme, float defaultSize, SerieState state = SerieState.Auto)| -| GetTitleStyle() |public static TitleStyle GetTitleStyle(Serie serie, SerieData serieData)| -| IsAllZeroValue() |public static bool IsAllZeroValue(Serie serie, int dimension = 1)<br/>系列指定维数的数据是否全部为0。 | -| IsDownPoint() |public static bool IsDownPoint(Serie serie, int index)| -| UpdateCenter() |public static void UpdateCenter(Serie serie, Vector3 chartPosition, float chartWidth, float chartHeight)<br/>更新运行时中心点和半径 | -| UpdateFilterData() |public static void UpdateFilterData(Serie serie, DataZoom dataZoom)<br/>根据dataZoom更新数据列表缓存 | -| UpdateMinMaxData() |public static void UpdateMinMaxData(Serie serie, int dimension, double ceilRate = 0, DataZoom dataZoom = null)<br/>获得指定维数的最大最小值 | -| UpdateRect() |public static void UpdateRect(Serie serie, Vector3 chartPosition, float chartWidth, float chartHeight)| -| UpdateSerieRuntimeFilterData() |public static void UpdateSerieRuntimeFilterData(Serie serie, bool filterInvisible = true)| +|CloneSerie<T>()||public static T CloneSerie<T>(Serie serie) where T : Serie| +|CopySerie()||public static void CopySerie(Serie oldSerie, Serie newSerie)| +|GetAllMinMaxData()||public static void GetAllMinMaxData(Serie serie, double ceilRate = 0, DataZoom dataZoom = null)| +|GetAreaStyle()||public static AreaStyle GetAreaStyle(Serie serie, SerieData serieData)| +|GetAverageData()||public static double GetAverageData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetBlurStyle()||public static BlurStyle GetBlurStyle(Serie serie, SerieData serieData)| +|GetEmphasisStyle()||public static EmphasisStyle GetEmphasisStyle(Serie serie, SerieData serieData)| +|GetItemColor()||public static Color32 GetItemColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, SerieState state = SerieState.Auto, bool opacity = true)| +|GetItemFormatter()||public static string GetItemFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)| +|GetItemMarker()||public static string GetItemMarker(Serie serie, SerieData serieData, string defaultMarker = null)| +|GetItemStyle()||public static ItemStyle GetItemStyle(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| +|GetLineColor()||public static Color32 GetLineColor(Serie serie, SerieData serieData, ThemeStyle theme, int index, SerieState state = SerieState.Auto)| +|GetLineStyle()||public static LineStyle GetLineStyle(Serie serie, SerieData serieData)| +|GetMaxData()||public static double GetMaxData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetMaxSerieData()||public static SerieData GetMaxSerieData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetMedianData()||public static double GetMedianData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetMinData()||public static double GetMinData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetMinMaxData()||public static void GetMinMaxData(Serie serie, out double min, out double max, DataZoom dataZoom = null, int dimension = 0)<br/>获得系列所有数据的最大最小值。 | +|GetMinSerieData()||public static SerieData GetMinSerieData(Serie serie, int dimension = 1, DataZoom dataZoom = null)| +|GetNumericFormatter()||public static string GetNumericFormatter(Serie serie, SerieData serieData, string defaultFormatter = null)| +|GetSelectStyle()||public static SelectStyle GetSelectStyle(Serie serie, SerieData serieData)| +|GetSerieLabel()||public static LabelStyle GetSerieLabel(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| +|GetSerieLabelLine()||public static LabelLine GetSerieLabelLine(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| +|GetSerieState()||public static SerieState GetSerieState(Serie serie)| +|GetSerieState()||public static SerieState GetSerieState(Serie serie, SerieData serieData, bool defaultSerieState = false)| +|GetSerieState()||public static SerieState GetSerieState(SerieData serieData)| +|GetSerieSymbol()||public static SerieSymbol GetSerieSymbol(Serie serie, SerieData serieData, SerieState state = SerieState.Auto)| +|GetStateStyle()||public static StateStyle GetStateStyle(Serie serie, SerieData serieData, SerieState state)| +|GetSysmbolSize()||public static float GetSysmbolSize(Serie serie, SerieData serieData, ThemeStyle theme, float defaultSize, SerieState state = SerieState.Auto)| +|GetTitleStyle()||public static TitleStyle GetTitleStyle(Serie serie, SerieData serieData)| +|IsAllZeroValue()||public static bool IsAllZeroValue(Serie serie, int dimension = 1)<br/>系列指定维数的数据是否全部为0。 | +|IsDownPoint()||public static bool IsDownPoint(Serie serie, int index)| +|UpdateCenter()||public static void UpdateCenter(Serie serie, Vector3 chartPosition, float chartWidth, float chartHeight)<br/>更新运行时中心点和半径 | +|UpdateFilterData()||public static void UpdateFilterData(Serie serie, DataZoom dataZoom)<br/>根据dataZoom更新数据列表缓存 | +|UpdateMinMaxData()||public static void UpdateMinMaxData(Serie serie, int dimension, double ceilRate = 0, DataZoom dataZoom = null)<br/>获得指定维数的最大最小值 | +|UpdateRect()||public static void UpdateRect(Serie serie, Vector3 chartPosition, float chartWidth, float chartHeight)| +|UpdateSerieRuntimeFilterData()||public static void UpdateSerieRuntimeFilterData(Serie serie, bool filterInvisible = true)| ## SerieLabelHelper -|public method|description| +|public method|since|description| |--|--| -| AvoidLabelOverlap() |public static void AvoidLabelOverlap(Serie serie, ComponentTheme theme)| -| CanShowLabel() |public static bool CanShowLabel(Serie serie, SerieData serieData, LabelStyle label, int dimesion)| -| GetLabelColor() |public static Color GetLabelColor(Serie serie, ThemeStyle theme, int index)| -| GetRealLabelPosition() |public static Vector3 GetRealLabelPosition(Serie serie, SerieData serieData, LabelStyle label, LabelLine labelLine)| -| SetGaugeLabelText() |public static void SetGaugeLabelText(Serie serie)| -| UpdatePieLabelPosition() |public static void UpdatePieLabelPosition(Serie serie, SerieData serieData)| +|AvoidLabelOverlap()||public static void AvoidLabelOverlap(Serie serie, ComponentTheme theme)| +|CanShowLabel()||public static bool CanShowLabel(Serie serie, SerieData serieData, LabelStyle label, int dimesion)| +|GetLabelColor()||public static Color GetLabelColor(Serie serie, ThemeStyle theme, int index)| +|GetRealLabelPosition()||public static Vector3 GetRealLabelPosition(Serie serie, SerieData serieData, LabelStyle label, LabelLine labelLine)| +|SetGaugeLabelText()||public static void SetGaugeLabelText(Serie serie)| +|UpdatePieLabelPosition()||public static void UpdatePieLabelPosition(Serie serie, SerieData serieData)| ## SerieLabelPool -|public method|description| +|public method|since|description| |--|--| -| ClearAll() |public static void ClearAll()| -| Release() |public static void Release(GameObject element)| -| ReleaseAll() |public static void ReleaseAll(Transform parent)| +|ClearAll()||public static void ClearAll()| +|Release()||public static void Release(GameObject element)| +|ReleaseAll()||public static void ReleaseAll(Transform parent)| ## SerieParams ## SeriesHelper -|public method|description| +|public method|since|description| |--|--| -| GetLastStackSerie() |public static Serie GetLastStackSerie(List<Serie> series, Serie serie)<br/>获得上一个同堆叠且显示的serie。 | -| GetLegalSerieNameList() |public static List<string> GetLegalSerieNameList(List<Serie> series)| -| GetMaxSerieDataCount() |public static int GetMaxSerieDataCount(List<Serie> series)| -| GetNameColor() |public static Color GetNameColor(BaseChart chart, int index, string name)| -| GetStackSeries() |public static void GetStackSeries(List<Serie> series, ref Dictionary<int, List<Serie>> stackSeries)<br/>获得堆叠系列列表 | -| IsAnyClipSerie() |public static bool IsAnyClipSerie(List<Serie> series)<br/>是否有需裁剪的serie。 | -| IsLegalLegendName() |public static bool IsLegalLegendName(string name)| -| IsPercentStack<T>() |public static bool IsPercentStack<T>(List<Serie> series) where T : Serie<br/>是否时百分比堆叠 | -| IsPercentStack<T>() |public static bool IsPercentStack<T>(List<Serie> series, string stackName) where T : Serie<br/>是否时百分比堆叠 | -| IsStack() |public static bool IsStack(List<Serie> series)<br/>是否由数据堆叠 | -| IsStack<T>() |public static bool IsStack<T>(List<Serie> series, string stackName) where T : Serie<br/>是否堆叠 | -| UpdateSerieNameList() |public static void UpdateSerieNameList(BaseChart chart, ref List<string> serieNameList)<br/>获得所有系列名,不包含空名字。 | -| UpdateStackDataList() |public static void UpdateStackDataList(List<Serie> series, Serie currSerie, DataZoom dataZoom, List<List<SerieData>> dataList)| +|GetLastStackSerie()||public static Serie GetLastStackSerie(List<Serie> series, Serie serie)<br/>获得上一个同堆叠且显示的serie。 | +|GetLegalSerieNameList()||public static List<string> GetLegalSerieNameList(List<Serie> series)| +|GetMaxSerieDataCount()||public static int GetMaxSerieDataCount(List<Serie> series)| +|GetNameColor()||public static Color GetNameColor(BaseChart chart, int index, string name)| +|GetStackSeries()||public static void GetStackSeries(List<Serie> series, ref Dictionary<int, List<Serie>> stackSeries)<br/>获得堆叠系列列表 | +|IsAnyClipSerie()||public static bool IsAnyClipSerie(List<Serie> series)<br/>是否有需裁剪的serie。 | +|IsLegalLegendName()||public static bool IsLegalLegendName(string name)| +|IsPercentStack<T>()||public static bool IsPercentStack<T>(List<Serie> series) where T : Serie<br/>是否时百分比堆叠 | +|IsPercentStack<T>()||public static bool IsPercentStack<T>(List<Serie> series, string stackName) where T : Serie<br/>是否时百分比堆叠 | +|IsStack()||public static bool IsStack(List<Serie> series)<br/>是否由数据堆叠 | +|IsStack<T>()||public static bool IsStack<T>(List<Serie> series, string stackName) where T : Serie<br/>是否堆叠 | +|UpdateSerieNameList()||public static void UpdateSerieNameList(BaseChart chart, ref List<string> serieNameList)<br/>获得所有系列名,不包含空名字。 | +|UpdateStackDataList()||public static void UpdateStackDataList(List<Serie> series, Serie currSerie, DataZoom dataZoom, List<List<SerieData>> dataList)| ## SimplifiedBarChart @@ -1072,17 +1072,17 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) -|public method|description| +|public method|since|description| |--|--| -| Since() |public Since(string version)| +|Since()||public Since(string version)| ## SVG -|public method|description| +|public method|since|description| |--|--| -| DrawPath() |public static void DrawPath(VertexHelper vh, string path)| -| DrawPath() |public static void DrawPath(VertexHelper vh, SVGPath path)| -| Test() |public static void Test(VertexHelper vh)| +|DrawPath()||public static void DrawPath(VertexHelper vh, string path)| +|DrawPath()||public static void DrawPath(VertexHelper vh, SVGPath path)| +|Test()||public static void Test(VertexHelper vh)| ## SVGImage @@ -1090,17 +1090,17 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## SVGPath -|public method|description| +|public method|since|description| |--|--| -| AddSegment() |public void AddSegment(SVGPathSeg seg)| -| Draw() |public void Draw(VertexHelper vh)| -| Parse() |public static SVGPath Parse(string path)| +|AddSegment()||public void AddSegment(SVGPathSeg seg)| +|Draw()||public void Draw(VertexHelper vh)| +|Parse()||public static SVGPath Parse(string path)| ## SVGPathSeg -|public method|description| +|public method|since|description| |--|--| -| SVGPathSeg() |public SVGPathSeg(SVGPathSegType type)| +|SVGPathSeg()||public SVGPathSeg(SVGPathSegType type)| ## TooltipContext @@ -1108,47 +1108,47 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## TooltipHelper -|public method|description| +|public method|since|description| |--|--| -| GetItemNumericFormatter() |public static string GetItemNumericFormatter(Tooltip tooltip, Serie serie, SerieData serieData)| -| GetLineColor() |public static Color32 GetLineColor(Tooltip tooltip, Color32 defaultColor)| -| IsIgnoreFormatter() |public static bool IsIgnoreFormatter(string itemFormatter)| -| LimitInRect() |public static void LimitInRect(Tooltip tooltip, Rect chartRect)| +|GetItemNumericFormatter()||public static string GetItemNumericFormatter(Tooltip tooltip, Serie serie, SerieData serieData)| +|GetLineColor()||public static Color32 GetLineColor(Tooltip tooltip, Color32 defaultColor)| +|IsIgnoreFormatter()||public static bool IsIgnoreFormatter(string itemFormatter)| +|LimitInRect()||public static void LimitInRect(Tooltip tooltip, Rect chartRect)| ## TooltipView -|public method|description| +|public method|since|description| |--|--| -| CreateView() |public static TooltipView CreateView(Tooltip tooltip, ThemeStyle theme, Transform parent)| -| GetCurrentPos() |public Vector3 GetCurrentPos()| -| GetTargetPos() |public Vector3 GetTargetPos()| -| Refresh() |public void Refresh()| -| SetActive() |public void SetActive(bool flag)| -| Update() |public void Update()| -| UpdatePosition() |public void UpdatePosition(Vector3 pos)| +|CreateView()||public static TooltipView CreateView(Tooltip tooltip, ThemeStyle theme, Transform parent)| +|GetCurrentPos()||public Vector3 GetCurrentPos()| +|GetTargetPos()||public Vector3 GetTargetPos()| +|Refresh()||public void Refresh()| +|SetActive()||public void SetActive(bool flag)| +|Update()||public void Update()| +|UpdatePosition()||public void UpdatePosition(Vector3 pos)| ## TooltipViewItem ## UGL -|public method|description| +|public method|since|description| |--|--| -| DrawDiamond() |public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color)<br/>Draw a diamond. 画菱形(钻石形状) | -| DrawDiamond() |public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color, Color32 toColor)<br/>Draw a diamond. 画菱形(钻石形状) | -| DrawEllipse() |public static void DrawEllipse(VertexHelper vh, Vector3 center, float w, float h, Color32 color, float smoothness = 1)| -| DrawLine() |public static void DrawLine(VertexHelper vh, List<Vector3> points, float width, Color32 color, bool smooth, bool closepath = false)| -| DrawLine() |public static void DrawLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, Color32 color)<br/>Draw a line. 画直线 | -| DrawLine() |public static void DrawLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, Color32 color, Color32 toColor)<br/>Draw a line. 画直线 | -| DrawPolygon() |public static void DrawPolygon(VertexHelper vh, List<Vector3> points, Color32 color)<br/>填充任意多边形(目前只支持凸多边形) | -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Rect rect, Color32 color)| -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Rect rect, Color32 color, Color32 toColor)| -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color)| -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color, Color32 toColor)| -| DrawRectangle() |public static void DrawRectangle(VertexHelper vh, Vector3 p1, Vector3 p2, float radius, Color32 color)<br/>Draw a rectangle. 画带长方形 | -| DrawSquare() |public static void DrawSquare(VertexHelper vh, Vector3 center, float radius, Color32 color)<br/>Draw a square. 画正方形 | -| DrawSvgPath() |public static void DrawSvgPath(VertexHelper vh, string path)| -| DrawTriangle() |public static void DrawTriangle(VertexHelper vh, Vector3 pos, float size, Color32 color)| -| DrawTriangle() |public static void DrawTriangle(VertexHelper vh, Vector3 pos, float size, Color32 color, Color32 toColor)| +|DrawDiamond()||public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color)<br/>Draw a diamond. 画菱形(钻石形状) | +|DrawDiamond()||public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color, Color32 toColor)<br/>Draw a diamond. 画菱形(钻石形状) | +|DrawEllipse()||public static void DrawEllipse(VertexHelper vh, Vector3 center, float w, float h, Color32 color, float smoothness = 1)| +|DrawLine()||public static void DrawLine(VertexHelper vh, List<Vector3> points, float width, Color32 color, bool smooth, bool closepath = false)| +|DrawLine()||public static void DrawLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, Color32 color)<br/>Draw a line. 画直线 | +|DrawLine()||public static void DrawLine(VertexHelper vh, Vector3 startPoint, Vector3 endPoint, float width, Color32 color, Color32 toColor)<br/>Draw a line. 画直线 | +|DrawPolygon()||public static void DrawPolygon(VertexHelper vh, List<Vector3> points, Color32 color)<br/>填充任意多边形(目前只支持凸多边形) | +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Rect rect, Color32 color)| +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Rect rect, Color32 color, Color32 toColor)| +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color)| +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Rect rect, float border, Color32 color, Color32 toColor)| +|DrawRectangle()||public static void DrawRectangle(VertexHelper vh, Vector3 p1, Vector3 p2, float radius, Color32 color)<br/>Draw a rectangle. 画带长方形 | +|DrawSquare()||public static void DrawSquare(VertexHelper vh, Vector3 center, float radius, Color32 color)<br/>Draw a square. 画正方形 | +|DrawSvgPath()||public static void DrawSvgPath(VertexHelper vh, string path)| +|DrawTriangle()||public static void DrawTriangle(VertexHelper vh, Vector3 pos, float size, Color32 color)| +|DrawTriangle()||public static void DrawTriangle(VertexHelper vh, Vector3 pos, float size, Color32 color, Color32 toColor)| ## UGLExample @@ -1156,30 +1156,30 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## UGLHelper -|public method|description| +|public method|since|description| |--|--| -| GetAngle360() |public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | -| GetBezier() |public static Vector3 GetBezier(float t, Vector3 sp, Vector3 cp, Vector3 ep)| -| GetBezier2() |public static Vector3 GetBezier2(float t, Vector3 sp, Vector3 p1, Vector3 p2, Vector3 ep)| -| GetBezierList() |public static List<Vector3> GetBezierList(Vector3 sp, Vector3 ep, int segment, Vector3 cp)| -| GetDire() |public static Vector3 GetDire(float angle, bool isDegree = false)| -| GetIntersection() |public static bool GetIntersection(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, ref Vector3 intersection)<br/>获得两直线的交点 | -| GetPos() |public static Vector3 GetPos(Vector3 center, float radius, float angle, bool isDegree = false)| -| GetVertialDire() |public static Vector3 GetVertialDire(Vector3 dire)| -| IsClearColor() |public static bool IsClearColor(Color color)| -| IsClearColor() |public static bool IsClearColor(Color32 color)| -| IsPointInPolygon() |public static bool IsPointInPolygon(Vector3 p, List<Vector2> polyons)| -| IsPointInPolygon() |public static bool IsPointInPolygon(Vector3 p, List<Vector3> polyons)| -| IsPointInTriangle() |public static bool IsPointInTriangle(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 check)| -| IsValueEqualsColor() |public static bool IsValueEqualsColor(Color color1, Color color2)| -| IsValueEqualsColor() |public static bool IsValueEqualsColor(Color32 color1, Color32 color2)| -| IsValueEqualsList<T>() |public static bool IsValueEqualsList<T>(List<T> list1, List<T> list2)| -| IsValueEqualsString() |public static bool IsValueEqualsString(string str1, string str2)| -| IsValueEqualsVector2() |public static bool IsValueEqualsVector2(Vector2 v1, Vector2 v2)| -| IsValueEqualsVector3() |public static bool IsValueEqualsVector3(Vector3 v1, Vector2 v2)| -| IsValueEqualsVector3() |public static bool IsValueEqualsVector3(Vector3 v1, Vector3 v2)| -| IsZeroVector() |public static bool IsZeroVector(Vector3 pos)| -| RotateRound() |public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| +|GetAngle360()||public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | +|GetBezier()||public static Vector3 GetBezier(float t, Vector3 sp, Vector3 cp, Vector3 ep)| +|GetBezier2()||public static Vector3 GetBezier2(float t, Vector3 sp, Vector3 p1, Vector3 p2, Vector3 ep)| +|GetBezierList()||public static List<Vector3> GetBezierList(Vector3 sp, Vector3 ep, int segment, Vector3 cp)| +|GetDire()||public static Vector3 GetDire(float angle, bool isDegree = false)| +|GetIntersection()||public static bool GetIntersection(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, ref Vector3 intersection)<br/>获得两直线的交点 | +|GetPos()||public static Vector3 GetPos(Vector3 center, float radius, float angle, bool isDegree = false)| +|GetVertialDire()||public static Vector3 GetVertialDire(Vector3 dire)| +|IsClearColor()||public static bool IsClearColor(Color color)| +|IsClearColor()||public static bool IsClearColor(Color32 color)| +|IsPointInPolygon()||public static bool IsPointInPolygon(Vector3 p, List<Vector2> polyons)| +|IsPointInPolygon()||public static bool IsPointInPolygon(Vector3 p, List<Vector3> polyons)| +|IsPointInTriangle()||public static bool IsPointInTriangle(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 check)| +|IsValueEqualsColor()||public static bool IsValueEqualsColor(Color color1, Color color2)| +|IsValueEqualsColor()||public static bool IsValueEqualsColor(Color32 color1, Color32 color2)| +|IsValueEqualsList<T>()||public static bool IsValueEqualsList<T>(List<T> list1, List<T> list2)| +|IsValueEqualsString()||public static bool IsValueEqualsString(string str1, string str2)| +|IsValueEqualsVector2()||public static bool IsValueEqualsVector2(Vector2 v1, Vector2 v2)| +|IsValueEqualsVector3()||public static bool IsValueEqualsVector3(Vector3 v1, Vector2 v2)| +|IsValueEqualsVector3()||public static bool IsValueEqualsVector3(Vector3 v1, Vector3 v2)| +|IsZeroVector()||public static bool IsZeroVector(Vector3 pos)| +|RotateRound()||public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| ## VisualMapContext @@ -1187,54 +1187,54 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## VisualMapHelper -|public method|description| +|public method|since|description| |--|--| -| AutoSetLineMinMax() |public static void AutoSetLineMinMax(VisualMap visualMap, Serie serie, bool isY, Axis axis, Axis relativedAxis)| -| GetDimension() |public static int GetDimension(VisualMap visualMap, int defaultDimension)| -| IsNeedAreaGradient() |public static bool IsNeedAreaGradient(VisualMap visualMap)| -| IsNeedGradient() |public static bool IsNeedGradient(VisualMap visualMap)| -| IsNeedLineGradient() |public static bool IsNeedLineGradient(VisualMap visualMap)| -| SetMinMax() |public static void SetMinMax(VisualMap visualMap, double min, double max)| +|AutoSetLineMinMax()||public static void AutoSetLineMinMax(VisualMap visualMap, Serie serie, bool isY, Axis axis, Axis relativedAxis)| +|GetDimension()||public static int GetDimension(VisualMap visualMap, int defaultDimension)| +|IsNeedAreaGradient()||public static bool IsNeedAreaGradient(VisualMap visualMap)| +|IsNeedGradient()||public static bool IsNeedGradient(VisualMap visualMap)| +|IsNeedLineGradient()||public static bool IsNeedLineGradient(VisualMap visualMap)| +|SetMinMax()||public static void SetMinMax(VisualMap visualMap, double min, double max)| ## XChartsMgr -|public method|description| +|public method|since|description| |--|--| -| AddChart() |public static void AddChart(BaseChart chart)| -| ContainsChart() |public static bool ContainsChart(BaseChart chart)| -| ContainsChart() |public static bool ContainsChart(string chartName)| -| GetChart() |public static BaseChart GetChart(string chartName)| -| GetCharts() |public static List<BaseChart> GetCharts(string chartName)| -| GetPackageFullPath() |public static string GetPackageFullPath()| -| GetRepeatChartNameInfo() |public static string GetRepeatChartNameInfo(BaseChart chart, string chartName)| -| IsRepeatChartName() |public static bool IsRepeatChartName(BaseChart chart, string chartName = null)| -| RemoveAllChartObject() |public static void RemoveAllChartObject()| -| RemoveChart() |public static void RemoveChart(string chartName)| +|AddChart()||public static void AddChart(BaseChart chart)| +|ContainsChart()||public static bool ContainsChart(BaseChart chart)| +|ContainsChart()||public static bool ContainsChart(string chartName)| +|GetChart()||public static BaseChart GetChart(string chartName)| +|GetCharts()||public static List<BaseChart> GetCharts(string chartName)| +|GetPackageFullPath()||public static string GetPackageFullPath()| +|GetRepeatChartNameInfo()||public static string GetRepeatChartNameInfo(BaseChart chart, string chartName)| +|IsRepeatChartName()||public static bool IsRepeatChartName(BaseChart chart, string chartName = null)| +|RemoveAllChartObject()||public static void RemoveAllChartObject()| +|RemoveChart()||public static void RemoveChart(string chartName)| ## XCResourceImporterWindow Inherits or Implemented: [UnityEditor.EditorWindow](#unityeditor.editorwindow) -|public method|description| +|public method|since|description| |--|--| -| ShowPackageImporterWindow() |public static void ShowPackageImporterWindow()| +|ShowPackageImporterWindow()||public static void ShowPackageImporterWindow()| ## XCThemeMgr -|public method|description| +|public method|since|description| |--|--| -| AddTheme() |public static void AddTheme(Theme theme)| -| CheckReloadTheme() |public static void CheckReloadTheme()| -| ContainsTheme() |public static bool ContainsTheme(string themeName)| -| ExportTheme() |public static bool ExportTheme(Theme theme)| -| ExportTheme() |public static bool ExportTheme(Theme theme, string themeNewName)| -| GetAllThemeNames() |public static List<string> GetAllThemeNames()| -| GetTheme() |public static Theme GetTheme(string themeName)| -| GetTheme() |public static Theme GetTheme(ThemeType type)| -| GetThemeAssetPath() |public static string GetThemeAssetPath(string themeName)| -| GetThemeList() |public static List<Theme> GetThemeList()| -| LoadTheme() |public static Theme LoadTheme(string themeName)| -| LoadTheme() |public static Theme LoadTheme(ThemeType type)| -| ReloadThemeList() |public static void ReloadThemeList()<br/>重新加载主题列表 | -| SwitchTheme() |public static void SwitchTheme(BaseChart chart, string themeName)| +|AddTheme()||public static void AddTheme(Theme theme)| +|CheckReloadTheme()||public static void CheckReloadTheme()| +|ContainsTheme()||public static bool ContainsTheme(string themeName)| +|ExportTheme()||public static bool ExportTheme(Theme theme)| +|ExportTheme()||public static bool ExportTheme(Theme theme, string themeNewName)| +|GetAllThemeNames()||public static List<string> GetAllThemeNames()| +|GetTheme()||public static Theme GetTheme(string themeName)| +|GetTheme()||public static Theme GetTheme(ThemeType type)| +|GetThemeAssetPath()||public static string GetThemeAssetPath(string themeName)| +|GetThemeList()||public static List<Theme> GetThemeList()| +|LoadTheme()||public static Theme LoadTheme(string themeName)| +|LoadTheme()||public static Theme LoadTheme(ThemeType type)| +|ReloadThemeList()||public static void ReloadThemeList()<br/>重新加载主题列表 | +|SwitchTheme()||public static void SwitchTheme(BaseChart chart, string themeName)| From 6f69af3945a0ba893f5fb8385ff3e438dae97d25 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Thu, 9 Mar 2023 22:51:09 +0800 Subject: [PATCH 42/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0API=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E7=9A=84since?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/en/api.md | 122 +++++++++++++++++++-------------------- Documentation~/zh/api.md | 122 +++++++++++++++++++-------------------- 2 files changed, 122 insertions(+), 122 deletions(-) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index f5fa8f13..96268576 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -105,7 +105,7 @@ slug: /api ## AnimationStyleHelper |public method|since|description| -|--|--| +|--|--|--| |CheckDataAnimation()||public static float CheckDataAnimation(BaseChart chart, Serie serie, int dataIndex, float destProgress, float startPorgress = 0)| |GetAnimationPosition()||public static bool GetAnimationPosition(AnimationStyle animation, bool isY, Vector3 lp, Vector3 cp, float progress, ref Vector3 ip)| |UpdateAnimationType()||public static void UpdateAnimationType(AnimationStyle animation, AnimationType defaultType)| @@ -122,7 +122,7 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) ## AxisHelper |public method|since|description| -|--|--| +|--|--|--| |AdjustCircleLabelPos()||public static void AdjustCircleLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| |AdjustMinMaxValue()||public static void AdjustMinMaxValue(Axis axis, ref double minValue, ref double maxValue, bool needFormat, double ceilRate = 0)<br/>调整最大最小值 | |AdjustRadiusAxisLabelPos()||public static void AdjustRadiusAxisLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| @@ -154,7 +154,7 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver](#iserializationcallbackreceiver) |public method|since|description| -|--|--| +|--|--|--| |onAxisPointerValueChanged||public Action<Axis, double> onAxisPointerValueChanged<br/>坐标轴变更数据索引时回调。参数:axis, dataIndex/dataValue | |onDraw||public Action<VertexHelper> onDraw<br/>自定义绘制回调。在绘制Serie前调用。 | |onDrawAfterSerie||public Action<VertexHelper, Serie> onDrawAfterSerie<br/>自定义Serie绘制回调。在每个Serie绘制完后调用。 | @@ -342,7 +342,7 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandler](#ipointerdownhandler),[IPointerUpHandler](#ipointeruphandler),[](#) |public method|since|description| -|--|--| +|--|--|--| |onBeginDrag||public Action<PointerEventData, BaseGraph> onBeginDrag<br/>鼠标开始拖拽回调。 | |onDrag||public Action<PointerEventData, BaseGraph> onDrag<br/>鼠标拖拽回调。 | |onEndDrag||public Action<PointerEventData, BaseGraph> onEndDrag<br/>鼠标结束拖拽回调。 | @@ -377,7 +377,7 @@ Inherits or Implemented: [BaseChart](#basechart) ## ChartCached |public method|since|description| -|--|--| +|--|--|--| |ColorToDotStr()||public static string ColorToDotStr(Color color)| |ColorToStr()||public static string ColorToStr(Color color)| |FloatToStr()||public static string FloatToStr(double value, string numericFormatter = "F", int precision = 0)| @@ -392,7 +392,7 @@ Inherits or Implemented: [BaseChart](#basechart) ## ChartHelper |public method|since|description| -|--|--| +|--|--|--| |ActiveAllObject()||public static void ActiveAllObject(Transform parent, bool active, string match = null)| |AddIcon()||public static Image AddIcon(string name, Transform parent, IconStyle iconStyle)| |Cancat()||public static string Cancat(string str1, int i)| @@ -459,7 +459,7 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Image](#image) |public method|since|description| -|--|--| +|--|--|--| |GetHeight()||public float GetHeight()| |GetPosition()||public Vector3 GetPosition()| |GetTextHeight()||public float GetTextHeight()| @@ -485,20 +485,20 @@ Inherits or Implemented: [Image](#image) ## ChartObject |public method|since|description| -|--|--| +|--|--|--| |Destroy()||public virtual void Destroy()| ## CheckHelper |public method|since|description| -|--|--| +|--|--|--| |CheckChart()||public static string CheckChart(BaseChart chart)| |CheckChart()||public static string CheckChart(BaseGraph chart)| ## ColorUtil |public method|since|description| -|--|--| +|--|--|--| |GetColor()||public static Color32 GetColor(string hexColorStr)<br/>Convert the html string to color. | ## ComponentHandlerAttribute @@ -506,14 +506,14 @@ Inherits or Implemented: [Image](#image) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |ComponentHandlerAttribute()||public ComponentHandlerAttribute(Type handler)| |ComponentHandlerAttribute()||public ComponentHandlerAttribute(Type handler, bool allowMultiple)| ## ComponentHelper |public method|since|description| -|--|--| +|--|--|--| |GetAngleAxis()||public static AngleAxis GetAngleAxis(List<MainComponent> components, int polarIndex)| |GetRadiusAxis()||public static RadiusAxis GetRadiusAxis(List<MainComponent> components, int polarIndex)| |GetXAxisOnZeroOffset()||public static float GetXAxisOnZeroOffset(List<MainComponent> components, XAxis axis)| @@ -525,7 +525,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains<T>()||public bool Contains<T>() where T : CoordSystem| |CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord)| |CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord, Type coord2)| @@ -539,14 +539,14 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## DataZoomHelper |public method|since|description| -|--|--| +|--|--|--| |UpdateDataZoomRuntimeStartEndValue()||public static void UpdateDataZoomRuntimeStartEndValue(DataZoom dataZoom, Serie serie)| |UpdateDataZoomRuntimeStartEndValue<T>()||public static void UpdateDataZoomRuntimeStartEndValue<T>(BaseChart chart) where T : Serie| ## DateTimeUtil |public method|since|description| -|--|--| +|--|--|--| |GetDateTime()||public static DateTime GetDateTime(int timestamp)| |GetTimestamp()||public static int GetTimestamp()| |GetTimestamp()||public static int GetTimestamp(DateTime time)| @@ -556,20 +556,20 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |DefaultAnimationAttribute()||public DefaultAnimationAttribute(AnimationType handler)| ## DefineSymbolsUtil |public method|since|description| -|--|--| +|--|--|--| |AddGlobalDefine()||public static void AddGlobalDefine(string symbol)| |RemoveGlobalDefine()||public static void RemoveGlobalDefine(string symbol)| ## FormatterHelper |public method|since|description| -|--|--| +|--|--|--| |NeedFormat()||public static bool NeedFormat(string content)| |ReplaceAxisLabelContent()||public static void ReplaceAxisLabelContent(ref string content, string numericFormatter, double value)| |ReplaceAxisLabelContent()||public static void ReplaceAxisLabelContent(ref string content, string value)| @@ -589,20 +589,20 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |IgnoreDoc()||public IgnoreDoc()| ## InputHelper |public method|since|description| -|--|--| +|--|--|--| |GetKeyDown()||public static bool GetKeyDown(KeyCode keyCode)| |GetTouch()||public static Touch GetTouch(int v)| ## InteractData |public method|since|description| -|--|--| +|--|--|--| |Reset()||public void Reset()| |SetColor()||public void SetColor(ref bool needInteract, Color32 color)| |SetColor()||public void SetColor(ref bool needInteract, Color32 color, Color32 toColor)| @@ -618,7 +618,7 @@ Inherits or Implemented: [Attribute](#attribute) ## LayerHelper |public method|since|description| -|--|--| +|--|--|--| |IsFixedWidthHeight()||public static bool IsFixedWidthHeight(RectTransform rt)| |IsStretchPivot()||public static bool IsStretchPivot(RectTransform rt)| @@ -629,7 +629,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## LegendHelper |public method|since|description| -|--|--| +|--|--|--| |CheckDataHighlighted()||public static bool CheckDataHighlighted(Serie serie, string legendName, bool heighlight)| |CheckDataShow()||public static bool CheckDataShow(Serie serie, string legendName, bool show)| |GetContentColor()||public static Color GetContentColor(BaseChart chart, int legendIndex, string legendName, Legend legend, ThemeStyle theme, bool active)| @@ -640,7 +640,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## LegendItem |public method|since|description| -|--|--| +|--|--|--| |GetIconColor()||public Color GetIconColor()| |GetIconRect()||public Rect GetIconRect()| |SetActive()||public void SetActive(bool active)| @@ -669,7 +669,7 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |ListFor()||public ListFor(Type type)| ## ListForComponent @@ -677,7 +677,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [ListFor](#listfor) |public method|since|description| -|--|--| +|--|--|--| |ListForComponent()||public ListForComponent(Type type) : base(type)| ## ListForSerie @@ -685,7 +685,7 @@ Inherits or Implemented: [ListFor](#listfor) Inherits or Implemented: [ListFor](#listfor) |public method|since|description| -|--|--| +|--|--|--| |ListForSerie()||public ListForSerie(Type type) : base(type)| ## MainComponentContext @@ -693,7 +693,7 @@ Inherits or Implemented: [ListFor](#listfor) ## MainComponentHandler |public method|since|description| -|--|--| +|--|--|--| |CheckComponent()||public virtual void CheckComponent(StringBuilder sb) { }| |DrawBase()||public virtual void DrawBase(VertexHelper vh) { }| |DrawTop()||public virtual void DrawTop(VertexHelper vh) { }| @@ -719,7 +719,7 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) ## MathUtil |public method|since|description| -|--|--| +|--|--|--| |Abs()||public static double Abs(double d)| |Approximately()||public static bool Approximately(double a, double b)| |Clamp()||public static double Clamp(double d, double min, double max)| @@ -733,7 +733,7 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) Inherits or Implemented: [new()](#new()) |public method|since|description| -|--|--| +|--|--|--| |ClearAll()||public void ClearAll()| |Get()||public T Get()| |new()||public class ObjectPool<T> where T : new()| @@ -745,7 +745,7 @@ Inherits or Implemented: [new()](#new()) Inherits or Implemented: [MaskableGraphic](#maskablegraphic) |public method|since|description| -|--|--| +|--|--|--| |onPopulateMesh||public Action<VertexHelper, Painter> onPopulateMesh| |CheckRefresh()||public void CheckRefresh()| |Init()||public void Init()| @@ -775,7 +775,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## PropertyUtil |public method|since|description| -|--|--| +|--|--|--| |SetClass<T>()||public static bool SetClass<T>(ref T currentValue, T newValue, bool notNull = false) where T : class| |SetColor()||public static bool SetColor(ref Color currentValue, Color newValue)| |SetColor()||public static bool SetColor(ref Color32 currentValue, Color32 newValue)| @@ -792,7 +792,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## ReflectionUtil |public method|since|description| -|--|--| +|--|--|--| |DeepCloneSerializeField()||public static object DeepCloneSerializeField(object obj)| |InvokeListAdd()||public static void InvokeListAdd(object obj, FieldInfo field, object item)| |InvokeListAddTo<T>()||public static void InvokeListAddTo<T>(object obj, FieldInfo field, Action<T> callback)| @@ -805,7 +805,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent)| |RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2)| |RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2, Type requiredComponent3)| @@ -817,7 +817,7 @@ Inherits or Implemented: [BaseChart](#basechart) ## RuntimeUtil |public method|since|description| -|--|--| +|--|--|--| |GetAllAssemblyTypes()||public static IEnumerable<Type> GetAllAssemblyTypes()| |GetAllTypesDerivedFrom()||public static IEnumerable<Type> GetAllTypesDerivedFrom(Type type)| |GetAllTypesDerivedFrom<T>()||public static IEnumerable<Type> GetAllTypesDerivedFrom<T>()| @@ -834,7 +834,7 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains()||public bool Contains(Type type)| |Contains<T>()||public bool Contains<T>() where T : ISerieComponent| |SerieComponentAttribute()||public SerieComponentAttribute()| @@ -853,7 +853,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains()||public bool Contains(Type type)| |Contains<T>()||public bool Contains<T>() where T : Serie| |SerieConvertAttribute()||public SerieConvertAttribute(Type serie)| @@ -866,7 +866,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains()||public bool Contains(Type type)| |Contains<T>()||public bool Contains<T>() where T : ISerieComponent| |SerieDataComponentAttribute()||public SerieDataComponentAttribute()| @@ -881,7 +881,7 @@ Inherits or Implemented: [Attribute](#attribute) ## SerieDataContext |public method|since|description| -|--|--| +|--|--|--| |Reset()||public void Reset()| ## SerieDataExtraFieldAttribute @@ -889,7 +889,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains()||public bool Contains(string field)| |SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute()| |SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1)| @@ -903,20 +903,20 @@ Inherits or Implemented: [Attribute](#attribute) ## SerieEventData |public method|since|description| -|--|--| +|--|--|--| |Reset()||public void Reset()| ## SerieEventDataPool |public method|since|description| -|--|--| +|--|--|--| |Get()||public static SerieEventData Get(Vector3 pos, int serieIndex, int dataIndex, int dimension, double value)| |Release()||public static void Release(SerieEventData toRelease)| ## SerieHandler |public method|since|description| -|--|--| +|--|--|--| |CheckComponent()||public virtual void CheckComponent(StringBuilder sb) { }| |DrawBase()||public virtual void DrawBase(VertexHelper vh) { }| |DrawSerie()||public virtual void DrawSerie(VertexHelper vh) { }| @@ -946,7 +946,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](#serie) |public method|since|description| -|--|--| +|--|--|--| |DrawLabelLineSymbol()||public void DrawLabelLineSymbol(VertexHelper vh, LabelLine labelLine, Vector3 startPos, Vector3 endPos, Color32 defaultColor)| |GetPointerItemDataDimension()||public override int GetPointerItemDataDimension()| |GetPointerItemDataIndex()||public override int GetPointerItemDataIndex()| @@ -971,14 +971,14 @@ Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](# Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |SerieHandlerAttribute()||public SerieHandlerAttribute(Type handler)| |SerieHandlerAttribute()||public SerieHandlerAttribute(Type handler, bool allowMultiple)| ## SerieHelper |public method|since|description| -|--|--| +|--|--|--| |CloneSerie<T>()||public static T CloneSerie<T>(Serie serie) where T : Serie| |CopySerie()||public static void CopySerie(Serie oldSerie, Serie newSerie)| |GetAllMinMaxData()||public static void GetAllMinMaxData(Serie serie, double ceilRate = 0, DataZoom dataZoom = null)| @@ -1020,7 +1020,7 @@ Inherits or Implemented: [Attribute](#attribute) ## SerieLabelHelper |public method|since|description| -|--|--| +|--|--|--| |AvoidLabelOverlap()||public static void AvoidLabelOverlap(Serie serie, ComponentTheme theme)| |CanShowLabel()||public static bool CanShowLabel(Serie serie, SerieData serieData, LabelStyle label, int dimesion)| |GetLabelColor()||public static Color GetLabelColor(Serie serie, ThemeStyle theme, int index)| @@ -1031,7 +1031,7 @@ Inherits or Implemented: [Attribute](#attribute) ## SerieLabelPool |public method|since|description| -|--|--| +|--|--|--| |ClearAll()||public static void ClearAll()| |Release()||public static void Release(GameObject element)| |ReleaseAll()||public static void ReleaseAll(Transform parent)| @@ -1041,7 +1041,7 @@ Inherits or Implemented: [Attribute](#attribute) ## SeriesHelper |public method|since|description| -|--|--| +|--|--|--| |GetLastStackSerie()||public static Serie GetLastStackSerie(List<Serie> series, Serie serie)<br/>获得上一个同堆叠且显示的serie。 | |GetLegalSerieNameList()||public static List<string> GetLegalSerieNameList(List<Serie> series)| |GetMaxSerieDataCount()||public static int GetMaxSerieDataCount(List<Serie> series)| @@ -1073,13 +1073,13 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Since()||public Since(string version)| ## SVG |public method|since|description| -|--|--| +|--|--|--| |DrawPath()||public static void DrawPath(VertexHelper vh, string path)| |DrawPath()||public static void DrawPath(VertexHelper vh, SVGPath path)| |Test()||public static void Test(VertexHelper vh)| @@ -1091,7 +1091,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## SVGPath |public method|since|description| -|--|--| +|--|--|--| |AddSegment()||public void AddSegment(SVGPathSeg seg)| |Draw()||public void Draw(VertexHelper vh)| |Parse()||public static SVGPath Parse(string path)| @@ -1099,7 +1099,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## SVGPathSeg |public method|since|description| -|--|--| +|--|--|--| |SVGPathSeg()||public SVGPathSeg(SVGPathSegType type)| ## TooltipContext @@ -1109,7 +1109,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## TooltipHelper |public method|since|description| -|--|--| +|--|--|--| |GetItemNumericFormatter()||public static string GetItemNumericFormatter(Tooltip tooltip, Serie serie, SerieData serieData)| |GetLineColor()||public static Color32 GetLineColor(Tooltip tooltip, Color32 defaultColor)| |IsIgnoreFormatter()||public static bool IsIgnoreFormatter(string itemFormatter)| @@ -1118,7 +1118,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## TooltipView |public method|since|description| -|--|--| +|--|--|--| |CreateView()||public static TooltipView CreateView(Tooltip tooltip, ThemeStyle theme, Transform parent)| |GetCurrentPos()||public Vector3 GetCurrentPos()| |GetTargetPos()||public Vector3 GetTargetPos()| @@ -1132,7 +1132,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## UGL |public method|since|description| -|--|--| +|--|--|--| |DrawDiamond()||public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color)<br/>Draw a diamond. 画菱形(钻石形状) | |DrawDiamond()||public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color, Color32 toColor)<br/>Draw a diamond. 画菱形(钻石形状) | |DrawEllipse()||public static void DrawEllipse(VertexHelper vh, Vector3 center, float w, float h, Color32 color, float smoothness = 1)| @@ -1157,7 +1157,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## UGLHelper |public method|since|description| -|--|--| +|--|--|--| |GetAngle360()||public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | |GetBezier()||public static Vector3 GetBezier(float t, Vector3 sp, Vector3 cp, Vector3 ep)| |GetBezier2()||public static Vector3 GetBezier2(float t, Vector3 sp, Vector3 p1, Vector3 p2, Vector3 ep)| @@ -1188,7 +1188,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## VisualMapHelper |public method|since|description| -|--|--| +|--|--|--| |AutoSetLineMinMax()||public static void AutoSetLineMinMax(VisualMap visualMap, Serie serie, bool isY, Axis axis, Axis relativedAxis)| |GetDimension()||public static int GetDimension(VisualMap visualMap, int defaultDimension)| |IsNeedAreaGradient()||public static bool IsNeedAreaGradient(VisualMap visualMap)| @@ -1199,7 +1199,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## XChartsMgr |public method|since|description| -|--|--| +|--|--|--| |AddChart()||public static void AddChart(BaseChart chart)| |ContainsChart()||public static bool ContainsChart(BaseChart chart)| |ContainsChart()||public static bool ContainsChart(string chartName)| @@ -1216,13 +1216,13 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) Inherits or Implemented: [UnityEditor.EditorWindow](#unityeditor.editorwindow) |public method|since|description| -|--|--| +|--|--|--| |ShowPackageImporterWindow()||public static void ShowPackageImporterWindow()| ## XCThemeMgr |public method|since|description| -|--|--| +|--|--|--| |AddTheme()||public static void AddTheme(Theme theme)| |CheckReloadTheme()||public static void CheckReloadTheme()| |ContainsTheme()||public static bool ContainsTheme(string themeName)| diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 641f5aeb..9a399ee4 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -105,7 +105,7 @@ slug: /api ## AnimationStyleHelper |public method|since|description| -|--|--| +|--|--|--| |CheckDataAnimation()||public static float CheckDataAnimation(BaseChart chart, Serie serie, int dataIndex, float destProgress, float startPorgress = 0)| |GetAnimationPosition()||public static bool GetAnimationPosition(AnimationStyle animation, bool isY, Vector3 lp, Vector3 cp, float progress, ref Vector3 ip)| |UpdateAnimationType()||public static void UpdateAnimationType(AnimationStyle animation, AnimationType defaultType)| @@ -122,7 +122,7 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) ## AxisHelper |public method|since|description| -|--|--| +|--|--|--| |AdjustCircleLabelPos()||public static void AdjustCircleLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| |AdjustMinMaxValue()||public static void AdjustMinMaxValue(Axis axis, ref double minValue, ref double maxValue, bool needFormat, double ceilRate = 0)<br/>调整最大最小值 | |AdjustRadiusAxisLabelPos()||public static void AdjustRadiusAxisLabelPos(ChartLabel txt, Vector3 pos, Vector3 cenPos, float txtHig, Vector3 offset)| @@ -154,7 +154,7 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver](#iserializationcallbackreceiver) |public method|since|description| -|--|--| +|--|--|--| |onAxisPointerValueChanged||public Action<Axis, double> onAxisPointerValueChanged<br/>坐标轴变更数据索引时回调。参数:axis, dataIndex/dataValue | |onDraw||public Action<VertexHelper> onDraw<br/>自定义绘制回调。在绘制Serie前调用。 | |onDrawAfterSerie||public Action<VertexHelper, Serie> onDrawAfterSerie<br/>自定义Serie绘制回调。在每个Serie绘制完后调用。 | @@ -342,7 +342,7 @@ Inherits or Implemented: [BaseGraph](#basegraph),[ISerializationCallbackReceiver Inherits or Implemented: [MaskableGraphic](#maskablegraphic),[IPointerDownHandler](#ipointerdownhandler),[IPointerUpHandler](#ipointeruphandler),[](#) |public method|since|description| -|--|--| +|--|--|--| |onBeginDrag||public Action<PointerEventData, BaseGraph> onBeginDrag<br/>鼠标开始拖拽回调。 | |onDrag||public Action<PointerEventData, BaseGraph> onDrag<br/>鼠标拖拽回调。 | |onEndDrag||public Action<PointerEventData, BaseGraph> onEndDrag<br/>鼠标结束拖拽回调。 | @@ -377,7 +377,7 @@ Inherits or Implemented: [BaseChart](#basechart) ## ChartCached |public method|since|description| -|--|--| +|--|--|--| |ColorToDotStr()||public static string ColorToDotStr(Color color)| |ColorToStr()||public static string ColorToStr(Color color)| |FloatToStr()||public static string FloatToStr(double value, string numericFormatter = "F", int precision = 0)| @@ -392,7 +392,7 @@ Inherits or Implemented: [BaseChart](#basechart) ## ChartHelper |public method|since|description| -|--|--| +|--|--|--| |ActiveAllObject()||public static void ActiveAllObject(Transform parent, bool active, string match = null)| |AddIcon()||public static Image AddIcon(string name, Transform parent, IconStyle iconStyle)| |Cancat()||public static string Cancat(string str1, int i)| @@ -459,7 +459,7 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Image](#image) |public method|since|description| -|--|--| +|--|--|--| |GetHeight()||public float GetHeight()| |GetPosition()||public Vector3 GetPosition()| |GetTextHeight()||public float GetTextHeight()| @@ -485,20 +485,20 @@ Inherits or Implemented: [Image](#image) ## ChartObject |public method|since|description| -|--|--| +|--|--|--| |Destroy()||public virtual void Destroy()| ## CheckHelper |public method|since|description| -|--|--| +|--|--|--| |CheckChart()||public static string CheckChart(BaseChart chart)| |CheckChart()||public static string CheckChart(BaseGraph chart)| ## ColorUtil |public method|since|description| -|--|--| +|--|--|--| |GetColor()||public static Color32 GetColor(string hexColorStr)<br/>将字符串颜色值转成Color。 | ## ComponentHandlerAttribute @@ -506,14 +506,14 @@ Inherits or Implemented: [Image](#image) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |ComponentHandlerAttribute()||public ComponentHandlerAttribute(Type handler)| |ComponentHandlerAttribute()||public ComponentHandlerAttribute(Type handler, bool allowMultiple)| ## ComponentHelper |public method|since|description| -|--|--| +|--|--|--| |GetAngleAxis()||public static AngleAxis GetAngleAxis(List<MainComponent> components, int polarIndex)| |GetRadiusAxis()||public static RadiusAxis GetRadiusAxis(List<MainComponent> components, int polarIndex)| |GetXAxisOnZeroOffset()||public static float GetXAxisOnZeroOffset(List<MainComponent> components, XAxis axis)| @@ -525,7 +525,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains<T>()||public bool Contains<T>() where T : CoordSystem| |CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord)| |CoordOptionsAttribute()||public CoordOptionsAttribute(Type coord, Type coord2)| @@ -539,14 +539,14 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## DataZoomHelper |public method|since|description| -|--|--| +|--|--|--| |UpdateDataZoomRuntimeStartEndValue()||public static void UpdateDataZoomRuntimeStartEndValue(DataZoom dataZoom, Serie serie)| |UpdateDataZoomRuntimeStartEndValue<T>()||public static void UpdateDataZoomRuntimeStartEndValue<T>(BaseChart chart) where T : Serie| ## DateTimeUtil |public method|since|description| -|--|--| +|--|--|--| |GetDateTime()||public static DateTime GetDateTime(int timestamp)| |GetTimestamp()||public static int GetTimestamp()| |GetTimestamp()||public static int GetTimestamp(DateTime time)| @@ -556,20 +556,20 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |DefaultAnimationAttribute()||public DefaultAnimationAttribute(AnimationType handler)| ## DefineSymbolsUtil |public method|since|description| -|--|--| +|--|--|--| |AddGlobalDefine()||public static void AddGlobalDefine(string symbol)| |RemoveGlobalDefine()||public static void RemoveGlobalDefine(string symbol)| ## FormatterHelper |public method|since|description| -|--|--| +|--|--|--| |NeedFormat()||public static bool NeedFormat(string content)| |ReplaceAxisLabelContent()||public static void ReplaceAxisLabelContent(ref string content, string numericFormatter, double value)| |ReplaceAxisLabelContent()||public static void ReplaceAxisLabelContent(ref string content, string value)| @@ -589,20 +589,20 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |IgnoreDoc()||public IgnoreDoc()| ## InputHelper |public method|since|description| -|--|--| +|--|--|--| |GetKeyDown()||public static bool GetKeyDown(KeyCode keyCode)| |GetTouch()||public static Touch GetTouch(int v)| ## InteractData |public method|since|description| -|--|--| +|--|--|--| |Reset()||public void Reset()| |SetColor()||public void SetColor(ref bool needInteract, Color32 color)| |SetColor()||public void SetColor(ref bool needInteract, Color32 color, Color32 toColor)| @@ -618,7 +618,7 @@ Inherits or Implemented: [Attribute](#attribute) ## LayerHelper |public method|since|description| -|--|--| +|--|--|--| |IsFixedWidthHeight()||public static bool IsFixedWidthHeight(RectTransform rt)| |IsStretchPivot()||public static bool IsStretchPivot(RectTransform rt)| @@ -629,7 +629,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## LegendHelper |public method|since|description| -|--|--| +|--|--|--| |CheckDataHighlighted()||public static bool CheckDataHighlighted(Serie serie, string legendName, bool heighlight)| |CheckDataShow()||public static bool CheckDataShow(Serie serie, string legendName, bool show)| |GetContentColor()||public static Color GetContentColor(BaseChart chart, int legendIndex, string legendName, Legend legend, ThemeStyle theme, bool active)| @@ -640,7 +640,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## LegendItem |public method|since|description| -|--|--| +|--|--|--| |GetIconColor()||public Color GetIconColor()| |GetIconRect()||public Rect GetIconRect()| |SetActive()||public void SetActive(bool active)| @@ -669,7 +669,7 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |ListFor()||public ListFor(Type type)| ## ListForComponent @@ -677,7 +677,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [ListFor](#listfor) |public method|since|description| -|--|--| +|--|--|--| |ListForComponent()||public ListForComponent(Type type) : base(type)| ## ListForSerie @@ -685,7 +685,7 @@ Inherits or Implemented: [ListFor](#listfor) Inherits or Implemented: [ListFor](#listfor) |public method|since|description| -|--|--| +|--|--|--| |ListForSerie()||public ListForSerie(Type type) : base(type)| ## MainComponentContext @@ -693,7 +693,7 @@ Inherits or Implemented: [ListFor](#listfor) ## MainComponentHandler |public method|since|description| -|--|--| +|--|--|--| |CheckComponent()||public virtual void CheckComponent(StringBuilder sb) { }| |DrawBase()||public virtual void DrawBase(VertexHelper vh) { }| |DrawTop()||public virtual void DrawTop(VertexHelper vh) { }| @@ -719,7 +719,7 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) ## MathUtil |public method|since|description| -|--|--| +|--|--|--| |Abs()||public static double Abs(double d)| |Approximately()||public static bool Approximately(double a, double b)| |Clamp()||public static double Clamp(double d, double min, double max)| @@ -733,7 +733,7 @@ Inherits or Implemented: [MainComponentHandler](#maincomponenthandler) Inherits or Implemented: [new()](#new()) |public method|since|description| -|--|--| +|--|--|--| |ClearAll()||public void ClearAll()| |Get()||public T Get()| |new()||public class ObjectPool<T> where T : new()| @@ -745,7 +745,7 @@ Inherits or Implemented: [new()](#new()) Inherits or Implemented: [MaskableGraphic](#maskablegraphic) |public method|since|description| -|--|--| +|--|--|--| |onPopulateMesh||public Action<VertexHelper, Painter> onPopulateMesh| |CheckRefresh()||public void CheckRefresh()| |Init()||public void Init()| @@ -775,7 +775,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## PropertyUtil |public method|since|description| -|--|--| +|--|--|--| |SetClass<T>()||public static bool SetClass<T>(ref T currentValue, T newValue, bool notNull = false) where T : class| |SetColor()||public static bool SetColor(ref Color currentValue, Color newValue)| |SetColor()||public static bool SetColor(ref Color32 currentValue, Color32 newValue)| @@ -792,7 +792,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## ReflectionUtil |public method|since|description| -|--|--| +|--|--|--| |DeepCloneSerializeField()||public static object DeepCloneSerializeField(object obj)| |InvokeListAdd()||public static void InvokeListAdd(object obj, FieldInfo field, object item)| |InvokeListAddTo<T>()||public static void InvokeListAddTo<T>(object obj, FieldInfo field, Action<T> callback)| @@ -805,7 +805,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent)| |RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2)| |RequireChartComponentAttribute()||public RequireChartComponentAttribute(Type requiredComponent, Type requiredComponent2, Type requiredComponent3)| @@ -817,7 +817,7 @@ Inherits or Implemented: [BaseChart](#basechart) ## RuntimeUtil |public method|since|description| -|--|--| +|--|--|--| |GetAllAssemblyTypes()||public static IEnumerable<Type> GetAllAssemblyTypes()| |GetAllTypesDerivedFrom()||public static IEnumerable<Type> GetAllTypesDerivedFrom(Type type)| |GetAllTypesDerivedFrom<T>()||public static IEnumerable<Type> GetAllTypesDerivedFrom<T>()| @@ -834,7 +834,7 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains()||public bool Contains(Type type)| |Contains<T>()||public bool Contains<T>() where T : ISerieComponent| |SerieComponentAttribute()||public SerieComponentAttribute()| @@ -853,7 +853,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains()||public bool Contains(Type type)| |Contains<T>()||public bool Contains<T>() where T : Serie| |SerieConvertAttribute()||public SerieConvertAttribute(Type serie)| @@ -866,7 +866,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains()||public bool Contains(Type type)| |Contains<T>()||public bool Contains<T>() where T : ISerieComponent| |SerieDataComponentAttribute()||public SerieDataComponentAttribute()| @@ -881,7 +881,7 @@ Inherits or Implemented: [Attribute](#attribute) ## SerieDataContext |public method|since|description| -|--|--| +|--|--|--| |Reset()||public void Reset()| ## SerieDataExtraFieldAttribute @@ -889,7 +889,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Contains()||public bool Contains(string field)| |SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute()| |SerieDataExtraFieldAttribute()||public SerieDataExtraFieldAttribute(string field1)| @@ -903,20 +903,20 @@ Inherits or Implemented: [Attribute](#attribute) ## SerieEventData |public method|since|description| -|--|--| +|--|--|--| |Reset()||public void Reset()| ## SerieEventDataPool |public method|since|description| -|--|--| +|--|--|--| |Get()||public static SerieEventData Get(Vector3 pos, int serieIndex, int dataIndex, int dimension, double value)| |Release()||public static void Release(SerieEventData toRelease)| ## SerieHandler |public method|since|description| -|--|--| +|--|--|--| |CheckComponent()||public virtual void CheckComponent(StringBuilder sb) { }| |DrawBase()||public virtual void DrawBase(VertexHelper vh) { }| |DrawSerie()||public virtual void DrawSerie(VertexHelper vh) { }| @@ -946,7 +946,7 @@ Inherits or Implemented: [Attribute](#attribute) Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](#serie) |public method|since|description| -|--|--| +|--|--|--| |DrawLabelLineSymbol()||public void DrawLabelLineSymbol(VertexHelper vh, LabelLine labelLine, Vector3 startPos, Vector3 endPos, Color32 defaultColor)| |GetPointerItemDataDimension()||public override int GetPointerItemDataDimension()| |GetPointerItemDataIndex()||public override int GetPointerItemDataIndex()| @@ -971,14 +971,14 @@ Inherits or Implemented: [SerieHandler where T](#seriehandler where t),[Serie](# Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |SerieHandlerAttribute()||public SerieHandlerAttribute(Type handler)| |SerieHandlerAttribute()||public SerieHandlerAttribute(Type handler, bool allowMultiple)| ## SerieHelper |public method|since|description| -|--|--| +|--|--|--| |CloneSerie<T>()||public static T CloneSerie<T>(Serie serie) where T : Serie| |CopySerie()||public static void CopySerie(Serie oldSerie, Serie newSerie)| |GetAllMinMaxData()||public static void GetAllMinMaxData(Serie serie, double ceilRate = 0, DataZoom dataZoom = null)| @@ -1020,7 +1020,7 @@ Inherits or Implemented: [Attribute](#attribute) ## SerieLabelHelper |public method|since|description| -|--|--| +|--|--|--| |AvoidLabelOverlap()||public static void AvoidLabelOverlap(Serie serie, ComponentTheme theme)| |CanShowLabel()||public static bool CanShowLabel(Serie serie, SerieData serieData, LabelStyle label, int dimesion)| |GetLabelColor()||public static Color GetLabelColor(Serie serie, ThemeStyle theme, int index)| @@ -1031,7 +1031,7 @@ Inherits or Implemented: [Attribute](#attribute) ## SerieLabelPool |public method|since|description| -|--|--| +|--|--|--| |ClearAll()||public static void ClearAll()| |Release()||public static void Release(GameObject element)| |ReleaseAll()||public static void ReleaseAll(Transform parent)| @@ -1041,7 +1041,7 @@ Inherits or Implemented: [Attribute](#attribute) ## SeriesHelper |public method|since|description| -|--|--| +|--|--|--| |GetLastStackSerie()||public static Serie GetLastStackSerie(List<Serie> series, Serie serie)<br/>获得上一个同堆叠且显示的serie。 | |GetLegalSerieNameList()||public static List<string> GetLegalSerieNameList(List<Serie> series)| |GetMaxSerieDataCount()||public static int GetMaxSerieDataCount(List<Serie> series)| @@ -1073,13 +1073,13 @@ Inherits or Implemented: [BaseChart](#basechart) Inherits or Implemented: [Attribute](#attribute) |public method|since|description| -|--|--| +|--|--|--| |Since()||public Since(string version)| ## SVG |public method|since|description| -|--|--| +|--|--|--| |DrawPath()||public static void DrawPath(VertexHelper vh, string path)| |DrawPath()||public static void DrawPath(VertexHelper vh, SVGPath path)| |Test()||public static void Test(VertexHelper vh)| @@ -1091,7 +1091,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## SVGPath |public method|since|description| -|--|--| +|--|--|--| |AddSegment()||public void AddSegment(SVGPathSeg seg)| |Draw()||public void Draw(VertexHelper vh)| |Parse()||public static SVGPath Parse(string path)| @@ -1099,7 +1099,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## SVGPathSeg |public method|since|description| -|--|--| +|--|--|--| |SVGPathSeg()||public SVGPathSeg(SVGPathSegType type)| ## TooltipContext @@ -1109,7 +1109,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## TooltipHelper |public method|since|description| -|--|--| +|--|--|--| |GetItemNumericFormatter()||public static string GetItemNumericFormatter(Tooltip tooltip, Serie serie, SerieData serieData)| |GetLineColor()||public static Color32 GetLineColor(Tooltip tooltip, Color32 defaultColor)| |IsIgnoreFormatter()||public static bool IsIgnoreFormatter(string itemFormatter)| @@ -1118,7 +1118,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## TooltipView |public method|since|description| -|--|--| +|--|--|--| |CreateView()||public static TooltipView CreateView(Tooltip tooltip, ThemeStyle theme, Transform parent)| |GetCurrentPos()||public Vector3 GetCurrentPos()| |GetTargetPos()||public Vector3 GetTargetPos()| @@ -1132,7 +1132,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## UGL |public method|since|description| -|--|--| +|--|--|--| |DrawDiamond()||public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color)<br/>Draw a diamond. 画菱形(钻石形状) | |DrawDiamond()||public static void DrawDiamond(VertexHelper vh, Vector3 center, float size, Color32 color, Color32 toColor)<br/>Draw a diamond. 画菱形(钻石形状) | |DrawEllipse()||public static void DrawEllipse(VertexHelper vh, Vector3 center, float w, float h, Color32 color, float smoothness = 1)| @@ -1157,7 +1157,7 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) ## UGLHelper |public method|since|description| -|--|--| +|--|--|--| |GetAngle360()||public static float GetAngle360(Vector2 from, Vector2 to)<br/>获得0-360的角度(12点钟方向为0度) | |GetBezier()||public static Vector3 GetBezier(float t, Vector3 sp, Vector3 cp, Vector3 ep)| |GetBezier2()||public static Vector3 GetBezier2(float t, Vector3 sp, Vector3 p1, Vector3 p2, Vector3 ep)| @@ -1188,7 +1188,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## VisualMapHelper |public method|since|description| -|--|--| +|--|--|--| |AutoSetLineMinMax()||public static void AutoSetLineMinMax(VisualMap visualMap, Serie serie, bool isY, Axis axis, Axis relativedAxis)| |GetDimension()||public static int GetDimension(VisualMap visualMap, int defaultDimension)| |IsNeedAreaGradient()||public static bool IsNeedAreaGradient(VisualMap visualMap)| @@ -1199,7 +1199,7 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) ## XChartsMgr |public method|since|description| -|--|--| +|--|--|--| |AddChart()||public static void AddChart(BaseChart chart)| |ContainsChart()||public static bool ContainsChart(BaseChart chart)| |ContainsChart()||public static bool ContainsChart(string chartName)| @@ -1216,13 +1216,13 @@ Inherits or Implemented: [MainComponentContext](#maincomponentcontext) Inherits or Implemented: [UnityEditor.EditorWindow](#unityeditor.editorwindow) |public method|since|description| -|--|--| +|--|--|--| |ShowPackageImporterWindow()||public static void ShowPackageImporterWindow()| ## XCThemeMgr |public method|since|description| -|--|--| +|--|--|--| |AddTheme()||public static void AddTheme(Theme theme)| |CheckReloadTheme()||public static void CheckReloadTheme()| |ContainsTheme()||public static bool ContainsTheme(string themeName)| From 99b3d243663f6c61acefcfee1f3841ac6bf0c4b4 Mon Sep 17 00:00:00 2001 From: Ambitroc <18574152056@163.com> Date: Fri, 10 Mar 2023 10:41:11 +0800 Subject: [PATCH 43/55] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=99=A4=E9=BC=A0?= =?UTF-8?q?=E6=A0=87=E4=BB=A5=E5=A4=96=E5=85=B6=E4=BB=96=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E7=9A=84Point=E4=BD=8D=E7=BD=AE=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=EF=BC=8C=E6=AF=94=E5=A6=82VR=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Internal/BaseGraph.API.cs | 3 ++- Runtime/Internal/BaseGraph.cs | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Runtime/Internal/BaseGraph.API.cs b/Runtime/Internal/BaseGraph.API.cs index d15276ff..499c24b1 100644 --- a/Runtime/Internal/BaseGraph.API.cs +++ b/Runtime/Internal/BaseGraph.API.cs @@ -51,7 +51,8 @@ namespace XCharts.Runtime /// Whether the mouse pointer is in the chart. /// |鼠标是否在图表内。 /// </summary> - public bool isPointerInChart { get; protected set; } + public bool isPointerInChart + { get { return m_PointerEventData != null; } } /// <summary> /// 警告信息。 /// </summary> diff --git a/Runtime/Internal/BaseGraph.cs b/Runtime/Internal/BaseGraph.cs index b9ffb696..8e1a8bca 100644 --- a/Runtime/Internal/BaseGraph.cs +++ b/Runtime/Internal/BaseGraph.cs @@ -1,4 +1,4 @@ -using System; +using System; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; @@ -35,6 +35,7 @@ namespace XCharts.Runtime protected bool m_PainerDirty = false; protected bool m_IsOnValidate = false; protected Vector3 m_LastLocalPosition; + protected PointerEventData m_PointerEventData; protected Action<PointerEventData, BaseGraph> m_OnPointerClick; protected Action<PointerEventData, BaseGraph> m_OnPointerDown; @@ -209,7 +210,7 @@ namespace XCharts.Runtime { if (!isPointerInChart) return; if (canvas == null) return; - Vector2 mousePos = Input.mousePosition; + Vector2 mousePos = m_PointerEventData.position; Vector2 local; if (!ScreenPointToChartPoint(mousePos, out local)) { @@ -278,13 +279,13 @@ namespace XCharts.Runtime public virtual void OnPointerEnter(PointerEventData eventData) { - isPointerInChart = true; + m_PointerEventData = eventData; if (m_OnPointerEnter != null) m_OnPointerEnter(eventData, this); } public virtual void OnPointerExit(PointerEventData eventData) { - isPointerInChart = false; + m_PointerEventData = null; if (m_OnPointerExit != null) m_OnPointerExit(eventData, this); } From dbb867e0abbb1ce88c03b02ce0d01b181fdbc8b5 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Sun, 12 Mar 2023 22:56:36 +0800 Subject: [PATCH 44/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`LabelStyle`=E7=9A=84`a?= =?UTF-8?q?utoRotate`=E5=8F=AF=E8=AE=BE=E7=BD=AE=E6=9C=89=E8=A7=92?= =?UTF-8?q?=E5=BA=A6=E7=9A=84=E7=AB=96=E7=89=88=E6=96=87=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=97=8B=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 1 + Editor/ChildComponents/LabelStyleDrawer.cs | 1 + Runtime/Component/Axis/Axis.cs | 8 +------- Runtime/Component/Axis/AxisLabel.cs | 19 +++++++++++++++---- Runtime/Component/Label/LabelStyle.cs | 10 ++++++++++ Runtime/Internal/Object/ChartLabel.cs | 14 +++++++++----- Runtime/Serie/Pie/PieHandler.cs | 1 + Runtime/Serie/SerieHandler.cs | 7 +++++++ 8 files changed, 45 insertions(+), 16 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 872efefb..b584a2b8 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,6 +65,7 @@ slug: /changelog ## master +* (2023.03.12) 增加`LabelStyle`的`autoRotate`可设置有角度的竖版文本的自动旋转 * (2023.03.09) 增加`Chart`的`onSerieClick`,`onSerieDown`,`onSerieEnter`和`onSerieExit`回调 * (2023.03.09) 修复`Pie`的点击选中偏移不生效的问题 * (2023.03.04) 增加`Legend`的`Positions`可自定义图例的位置 diff --git a/Editor/ChildComponents/LabelStyleDrawer.cs b/Editor/ChildComponents/LabelStyleDrawer.cs index 103b345b..359da59d 100644 --- a/Editor/ChildComponents/LabelStyleDrawer.cs +++ b/Editor/ChildComponents/LabelStyleDrawer.cs @@ -20,6 +20,7 @@ namespace XCharts.Editor PropertyField(prop, "m_AutoOffset"); PropertyField(prop, "m_Offset"); PropertyField(prop, "m_Distance"); + PropertyField(prop, "m_AutoRotate"); PropertyField(prop, "m_Rotate"); PropertyField(prop, "m_Width"); PropertyField(prop, "m_Height"); diff --git a/Runtime/Component/Axis/Axis.cs b/Runtime/Component/Axis/Axis.cs index d74301a1..2c4ca54d 100644 --- a/Runtime/Component/Axis/Axis.cs +++ b/Runtime/Component/Axis/Axis.cs @@ -576,13 +576,7 @@ namespace XCharts.Runtime { total = context.labelValueList.Count; } - var labelShow = axisLabel.show && (axisLabel.interval == 0 || index % (axisLabel.interval + 1) == 0); - if (labelShow) - { - if (!axisLabel.showStartLabel && index == 0) labelShow = false; - else if (!axisLabel.showEndLabel && index == total - 1) labelShow = false; - } - return labelShow; + return axisLabel.IsNeedShowLabel(index, total); } public void SetNeedUpdateFilterData() diff --git a/Runtime/Component/Axis/AxisLabel.cs b/Runtime/Component/Axis/AxisLabel.cs index 934f5e0d..0daf6836 100644 --- a/Runtime/Component/Axis/AxisLabel.cs +++ b/Runtime/Component/Axis/AxisLabel.cs @@ -96,10 +96,10 @@ namespace XCharts.Runtime return new AxisLabel() { m_Show = true, - m_Interval = 0, - m_Inside = false, - m_Distance = 8, - m_TextStyle = new TextStyle(), + m_Interval = 0, + m_Inside = false, + m_Distance = 8, + m_TextStyle = new TextStyle(), }; } } @@ -168,5 +168,16 @@ namespace XCharts.Runtime } return base.GetFormatterContent(labelIndex, value, minValue, maxValue, isLog); } + + public bool IsNeedShowLabel(int index, int total) + { + var labelShow = show && (interval == 0 || index % (interval + 1) == 0); + if (labelShow) + { + if (!showStartLabel && index == 0) labelShow = false; + else if (!showEndLabel && index == total - 1) labelShow = false; + } + return labelShow; + } } } \ No newline at end of file diff --git a/Runtime/Component/Label/LabelStyle.cs b/Runtime/Component/Label/LabelStyle.cs index 06a8cf69..762c6c24 100644 --- a/Runtime/Component/Label/LabelStyle.cs +++ b/Runtime/Component/Label/LabelStyle.cs @@ -74,6 +74,7 @@ namespace XCharts.Runtime [SerializeField] protected bool m_AutoOffset = false; [SerializeField] protected Vector3 m_Offset; [SerializeField] protected float m_Rotate; + [SerializeField][Since("v3.6.0")] protected bool m_AutoRotate = false; [SerializeField] protected float m_Distance; [SerializeField] protected string m_Formatter; [SerializeField] protected string m_NumericFormatter = ""; @@ -155,6 +156,15 @@ namespace XCharts.Runtime set { if (PropertyUtil.SetStruct(ref m_Rotate, value)) SetComponentDirty(); } } /// <summary> + /// auto rotate of label. + /// |是否自动旋转。 + /// </summary> + public bool autoRotate + { + get { return m_AutoRotate; } + set { if (PropertyUtil.SetStruct(ref m_AutoRotate, value)) SetComponentDirty(); } + } + /// <summary> /// 距离轴线的距离。 /// </summary> public float distance diff --git a/Runtime/Internal/Object/ChartLabel.cs b/Runtime/Internal/Object/ChartLabel.cs index d36114e0..89ff9ee3 100644 --- a/Runtime/Internal/Object/ChartLabel.cs +++ b/Runtime/Internal/Object/ChartLabel.cs @@ -169,6 +169,11 @@ namespace XCharts.Runtime if (m_LabelText != null) m_LabelText.SetColor(color); } + public void SetRotate(float rotate) + { + transform.localEulerAngles = new Vector3(0, 0, rotate); + } + public void SetTextRotate(float rotate) { if (m_LabelText != null) m_LabelText.SetLocalEulerAngles(new Vector3(0, 0, rotate)); @@ -196,16 +201,15 @@ namespace XCharts.Runtime public void SetActive(bool flag) { - if (m_Active != flag) - { - m_Active = flag; - ChartHelper.SetActive(gameObject, flag); - } + m_Active = flag; + ChartHelper.SetActive(gameObject, flag); } + public void SetTextActive(bool flag) { if (m_LabelText != null) m_LabelText.SetActive(flag); } + public void SetIconActive(bool flag) { isIconActive = flag; diff --git a/Runtime/Serie/Pie/PieHandler.cs b/Runtime/Serie/Pie/PieHandler.cs index f58b9aa2..45bf20cf 100644 --- a/Runtime/Serie/Pie/PieHandler.cs +++ b/Runtime/Serie/Pie/PieHandler.cs @@ -234,6 +234,7 @@ namespace XCharts.Runtime } var halfDegree = (serieData.context.toAngle - startDegree) / 2; serieData.context.halfAngle = startDegree + halfDegree; + serieData.context.angle = startDegree + halfDegree; serieData.context.offsetCenter = serie.context.center; serieData.context.insideRadius = serie.context.insideRadius; if (offset > 0) diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index 65762406..f7aab083 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -503,6 +503,13 @@ namespace XCharts.Runtime var labelPosition = GetSerieDataLabelPosition(serieData, currLabel); var offset = GetSerieDataLabelOffset(serieData, currLabel); serieData.labelObject.SetPosition(labelPosition + offset); + if (currLabel.autoRotate && serieData.context.angle != 0) + { + if (serieData.context.angle > 90 && serieData.context.angle < 270) + serieData.labelObject.SetRotate(180 - serieData.context.angle); + else + serieData.labelObject.SetRotate(-serieData.context.angle); + } } public virtual Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label) From 372ed1de58aa082a60dcc6193f6fe830cc0c58ba Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Sun, 12 Mar 2023 22:57:37 +0800 Subject: [PATCH 45/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`LabelStyle`=E7=9A=84`a?= =?UTF-8?q?utoRotate`=E5=8F=AF=E8=AE=BE=E7=BD=AE=E6=9C=89=E8=A7=92?= =?UTF-8?q?=E5=BA=A6=E7=9A=84=E7=AB=96=E7=89=88=E6=96=87=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=97=8B=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/en/api.md | 1 + Documentation~/en/configuration.md | 1 + Documentation~/zh/api.md | 1 + Documentation~/zh/configuration.md | 1 + 4 files changed, 4 insertions(+) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index 96268576..84728fa3 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -474,6 +474,7 @@ Inherits or Implemented: [Image](#image) |SetPadding()||public void SetPadding(float[] padding)| |SetPosition()||public void SetPosition(Vector3 position)| |SetRectPosition()||public void SetRectPosition(Vector3 position)| +|SetRotate()||public void SetRotate(float rotate)| |SetSize()||public void SetSize(float width, float height)| |SetText()||public bool SetText(string text)| |SetTextActive()||public void SetTextActive(bool flag)| diff --git a/Documentation~/en/configuration.md b/Documentation~/en/configuration.md index 82391778..02ca5c1b 100644 --- a/Documentation~/en/configuration.md +++ b/Documentation~/en/configuration.md @@ -771,6 +771,7 @@ Text label of chart, to explain some data information about graphic item like va |autoOffset|false||是否开启自动偏移。当开启时,Y的偏移会自动判断曲线的开口来决定向上还是向下偏移。 |offset|||offset to the host graphic element. |rotate|||Rotation of label. +|autoRotate|false|v3.6.0|auto rotate of label. |distance|||距离轴线的距离。 |formatter|||formatter of label. |numericFormatter|||Standard numeric format strings. diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 9a399ee4..67bf802f 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -474,6 +474,7 @@ Inherits or Implemented: [Image](#image) |SetPadding()||public void SetPadding(float[] padding)| |SetPosition()||public void SetPosition(Vector3 position)| |SetRectPosition()||public void SetRectPosition(Vector3 position)| +|SetRotate()||public void SetRotate(float rotate)| |SetSize()||public void SetSize(float width, float height)| |SetText()||public bool SetText(string text)| |SetTextActive()||public void SetTextActive(bool flag)| diff --git a/Documentation~/zh/configuration.md b/Documentation~/zh/configuration.md index 667d912c..34f8c1db 100644 --- a/Documentation~/zh/configuration.md +++ b/Documentation~/zh/configuration.md @@ -771,6 +771,7 @@ Inherits or Implemented: [ChildComponent](#childcomponent),[ISerieComponent](#is |autoOffset|false||是否开启自动偏移。当开启时,Y的偏移会自动判断曲线的开口来决定向上还是向下偏移。 |offset|||距离图形元素的偏移 |rotate|||文本的旋转。 +|autoRotate|false|v3.6.0|是否自动旋转。 |distance|||距离轴线的距离。 |formatter|||标签内容字符串模版格式器。支持用 \n 换行。 模板变量有: {.}:圆点标记。 {a}:系列名。 {a}:系列名。 {b}:类目值或数据名。 {c}:数据值。 {d}:百分比。 {e}:数据名。 {f}:数据和。 示例:“{b}:{c}” |numericFormatter|||标准数字格式字符串。用于将数值格式化显示为字符串。 使用Axx的形式:A是格式说明符的单字符,支持C货币、D十进制、E指数、F定点数、G常规、N数字、P百分比、R往返、X十六进制的。xx是精度说明,从0-99。 参考:https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-strings From 49e9066334fdc2b5ea94c12878051c4fdf41b048 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 13 Mar 2023 07:21:00 +0800 Subject: [PATCH 46/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0`LabelStyle`=E7=9A=84`a?= =?UTF-8?q?utoRotate`=E5=8F=AF=E8=AE=BE=E7=BD=AE=E6=9C=89=E8=A7=92?= =?UTF-8?q?=E5=BA=A6=E7=9A=84=E7=AB=96=E7=89=88=E6=96=87=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=97=8B=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Serie/SerieHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index f7aab083..37d39b04 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -506,9 +506,9 @@ namespace XCharts.Runtime if (currLabel.autoRotate && serieData.context.angle != 0) { if (serieData.context.angle > 90 && serieData.context.angle < 270) - serieData.labelObject.SetRotate(180 - serieData.context.angle); + serieData.labelObject.SetRotate(180 - serieData.context.angle + currLabel.rotate); else - serieData.labelObject.SetRotate(-serieData.context.angle); + serieData.labelObject.SetRotate(-serieData.context.angle + currLabel.rotate); } } From 3073926d73940eff141b4f8ab91674e6fe94c612 Mon Sep 17 00:00:00 2001 From: Ambitroc <18574152056@163.com> Date: Tue, 14 Mar 2023 13:29:50 +0800 Subject: [PATCH 47/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBarChart=E5=9C=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=BA0=E6=97=B6=EF=BC=8CBar=E8=83=8C?= =?UTF-8?q?=E6=99=AF=E4=B8=8D=E7=BB=98=E5=88=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Serie/Bar/BarHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/Serie/Bar/BarHandler.cs b/Runtime/Serie/Bar/BarHandler.cs index bde1fcc3..f3360129 100644 --- a/Runtime/Serie/Bar/BarHandler.cs +++ b/Runtime/Serie/Bar/BarHandler.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; @@ -259,7 +259,7 @@ namespace XCharts.Runtime continue; } - if (serie.show && currHig != 0 && !serie.placeHolder) + if (serie.show && !serie.placeHolder) { switch (serie.barType) { From 3dfa5487ee9eb12d4a188e48483c9f351ad5c3f4 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Wed, 15 Mar 2023 13:04:48 +0800 Subject: [PATCH 48/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Tooltip`=E7=9A=84`titl?= =?UTF-8?q?eFormater`=E8=AE=BE=E7=BD=AE`{b}`=E5=8F=AF=E8=83=BD=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Helper/FormatterHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/Helper/FormatterHelper.cs b/Runtime/Helper/FormatterHelper.cs index 45a5087e..5874c618 100644 --- a/Runtime/Helper/FormatterHelper.cs +++ b/Runtime/Helper/FormatterHelper.cs @@ -72,7 +72,7 @@ namespace XCharts.Runtime if (s_RegexN.IsMatch(args1Str)) bIndex = int.Parse(args1Str); } var color = string.IsNullOrEmpty(colorName) ? - (Color) chart.GetMarkColor(serie, serie.GetSerieData(bIndex)) : + (Color)chart.GetMarkColor(serie, serie.GetSerieData(bIndex)) : SeriesHelper.GetNameColor(chart, bIndex, colorName); if (p == '.') { @@ -99,7 +99,7 @@ namespace XCharts.Runtime var args1Str = args[1].ToString(); if (s_RegexN.IsMatch(args1Str)) bIndex = int.Parse(args1Str); } - var needCategory = (p != 'e' && p != 'E') && (serie is Line || serie is Bar); + var needCategory = (p != 'e' && p != 'E') && serie.defaultColorBy != SerieColorBy.Data; if (needCategory) { var category = chart.GetTooltipCategory(dataIndex, serie); From a0db57bdf2f86a90b3dfaefbe2a0441d6dedffdb Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 20 Mar 2023 21:38:58 +0800 Subject: [PATCH 49/55] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=9A=84=E5=BE=AA=E7=8E=AF=E5=8F=98=E6=9B=B4=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Internal/Utilities/ChartHelper.cs | 2 +- Runtime/Serie/SerieData.cs | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Runtime/Internal/Utilities/ChartHelper.cs b/Runtime/Internal/Utilities/ChartHelper.cs index 8578120e..d98ffa12 100644 --- a/Runtime/Internal/Utilities/ChartHelper.cs +++ b/Runtime/Internal/Utilities/ChartHelper.cs @@ -389,7 +389,7 @@ namespace XCharts.Runtime var alignment = textStyle.GetAlignment(autoAlignment); UpdateAnchorAndPivotByTextAlignment(alignment, out anchorMin, out anchorMax, out pivot); var labelObj = AddObject(name, parent, anchorMin, anchorMax, pivot, sizeDelta); - ChartHelper.RemoveComponent<Text>(labelObj); + //ChartHelper.RemoveComponent<Text>(labelObj); var label = EnsureComponent<ChartLabel>(labelObj); label.text = AddTextObject("Text", label.gameObject.transform, anchorMin, anchorMax, pivot, sizeDelta, textStyle, theme, autoColor, autoAlignment, label.text); diff --git a/Runtime/Serie/SerieData.cs b/Runtime/Serie/SerieData.cs index 226ee361..ca1492da 100644 --- a/Runtime/Serie/SerieData.cs +++ b/Runtime/Serie/SerieData.cs @@ -484,7 +484,7 @@ namespace XCharts.Runtime return GetCurrData(index, animationDuration, inverse, 0, 0, unscaledTime); } - public double GetCurrData(int index, float animationDuration, bool inverse, double min, double max, bool unscaledTime) + public double GetCurrData(int index, float animationDuration, bool inverse, double min, double max, bool unscaledTime, bool loop = false) { if (index < m_DataUpdateFlag.Count && m_DataUpdateFlag[index] && animationDuration > 0) { @@ -496,7 +496,13 @@ namespace XCharts.Runtime if (rate < 1) { CheckLastData(unscaledTime); - var curr = MathUtil.Lerp(GetPreviousData(index), GetData(index), rate); + var prev = GetPreviousData(index); + var next = GetData(index); + if (loop) + { + if (next <= min && prev != 0) next = max; + } + var curr = MathUtil.Lerp(prev, next, rate); if (min != 0 || max != 0) { if (inverse) From a50b58d48e71927727657e943131d953256363d7 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 20 Mar 2023 21:56:56 +0800 Subject: [PATCH 50/55] =?UTF-8?q?=E5=A2=9E=E5=8A=A0UI=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/MainComponents/UIComponentEditor.cs | 121 ++++++++++++++++++ .../MainComponents/UIComponentEditor.cs.meta | 11 ++ .../MainComponents/UIComponentThemeDrawer.cs | 23 ++++ .../UIComponentThemeDrawer.cs.meta | 11 ++ Runtime/Internal/UIComponent.cs | 92 +++++++++++++ Runtime/Internal/UIComponent.cs.meta | 11 ++ Runtime/Internal/UIComponentTheme.cs | 53 ++++++++ Runtime/Internal/UIComponentTheme.cs.meta | 11 ++ Runtime/Internal/Utilities/UIHelper.cs | 57 +++++++++ Runtime/Internal/Utilities/UIHelper.cs.meta | 11 ++ 10 files changed, 401 insertions(+) create mode 100644 Editor/MainComponents/UIComponentEditor.cs create mode 100644 Editor/MainComponents/UIComponentEditor.cs.meta create mode 100644 Editor/MainComponents/UIComponentThemeDrawer.cs create mode 100644 Editor/MainComponents/UIComponentThemeDrawer.cs.meta create mode 100644 Runtime/Internal/UIComponent.cs create mode 100644 Runtime/Internal/UIComponent.cs.meta create mode 100644 Runtime/Internal/UIComponentTheme.cs create mode 100644 Runtime/Internal/UIComponentTheme.cs.meta create mode 100644 Runtime/Internal/Utilities/UIHelper.cs create mode 100644 Runtime/Internal/Utilities/UIHelper.cs.meta diff --git a/Editor/MainComponents/UIComponentEditor.cs b/Editor/MainComponents/UIComponentEditor.cs new file mode 100644 index 00000000..b942a2bd --- /dev/null +++ b/Editor/MainComponents/UIComponentEditor.cs @@ -0,0 +1,121 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEngine.Assertions; +using XCharts.Runtime; + +namespace XCharts.Editor +{ + public class UIComponentEditor : UnityEditor.Editor + { + class Styles + { + public static readonly GUIContent btnAddComponent = new GUIContent("Add Main Component", ""); + public static readonly GUIContent btnRebuildChartObject = new GUIContent("Rebuild Object", ""); + public static readonly GUIContent btnSaveAsImage = new GUIContent("Save As Image", ""); + public static readonly GUIContent btnCheckWarning = new GUIContent("Check Warning", ""); + public static readonly GUIContent btnHideWarning = new GUIContent("Hide Warning", ""); + } + public UIComponent m_UIComponent; + + public static T AddUIComponent<T>(string chartName) where T : UIComponent + { + return XChartsEditor.AddGraph<T>(chartName); + } + + protected Dictionary<string, SerializedProperty> m_Properties = new Dictionary<string, SerializedProperty>(); + + protected virtual void OnEnable() + { + m_Properties.Clear(); + m_UIComponent = (UIComponent) target; + } + + public override void OnInspectorGUI() + { + serializedObject.Update(); + PropertyField("m_Script"); + + OnStartInspectorGUI(); + OnDebugInspectorGUI(); + serializedObject.ApplyModifiedProperties(); + } + + protected virtual void OnStartInspectorGUI() { } + + protected virtual void OnDebugInspectorGUI() + { + EditorGUILayout.Space(); + PropertyField("m_DebugModel"); + OnDebugStartInspectorGUI(); + if (GUILayout.Button(Styles.btnRebuildChartObject)) + { + m_UIComponent.RebuildChartObject(); + } + if (GUILayout.Button(Styles.btnSaveAsImage)) + { + m_UIComponent.SaveAsImage(); + } + OnDebugEndInspectorGUI(); + } + + protected virtual void OnDebugStartInspectorGUI() { } + protected virtual void OnDebugEndInspectorGUI() { } + + protected void PropertyField(string name) + { + if (!m_Properties.ContainsKey(name)) + { + var prop = serializedObject.FindProperty(name); + if (prop == null) + { + Debug.LogError("Property " + name + " not found!"); + return; + } + m_Properties.Add(name, prop); + } + EditorGUILayout.PropertyField(m_Properties[name]); + } + + protected void PropertyField(SerializedProperty property) + { + Assert.IsNotNull(property); + var title = ChartEditorHelper.GetContent(property.displayName); + PropertyField(property, title); + } + + protected void PropertyField(SerializedProperty property, GUIContent title) + { + EditorGUILayout.PropertyField(property, title); + } + + protected void PropertyListField(string relativePropName, bool showOrder = true, params HeaderMenuInfo[] menus) + { + var m_DrawRect = GUILayoutUtility.GetRect(1f, 17f); + var height = 0f; + var prop = FindProperty(relativePropName); + prop.isExpanded = ChartEditorHelper.MakeListWithFoldout(ref m_DrawRect, ref height, + prop, prop.isExpanded, showOrder, true, menus); + if (prop.isExpanded) + { + GUILayoutUtility.GetRect(1f, height - 17); + } + } + + protected void PropertyTwoFiled(string relativePropName) + { + var m_DrawRect = GUILayoutUtility.GetRect(1f, 17f); + var prop = FindProperty(relativePropName); + ChartEditorHelper.MakeTwoField(ref m_DrawRect, m_DrawRect.width, prop, prop.displayName); + } + + protected SerializedProperty FindProperty(string path) + { + if (!m_Properties.ContainsKey(path)) + { + m_Properties.Add(path, serializedObject.FindProperty(path)); + } + return m_Properties[path]; + } + } +} \ No newline at end of file diff --git a/Editor/MainComponents/UIComponentEditor.cs.meta b/Editor/MainComponents/UIComponentEditor.cs.meta new file mode 100644 index 00000000..72da37b3 --- /dev/null +++ b/Editor/MainComponents/UIComponentEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d226759112b0d463b8fba4830762893c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/MainComponents/UIComponentThemeDrawer.cs b/Editor/MainComponents/UIComponentThemeDrawer.cs new file mode 100644 index 00000000..d06d6140 --- /dev/null +++ b/Editor/MainComponents/UIComponentThemeDrawer.cs @@ -0,0 +1,23 @@ +using UnityEditor; +using UnityEngine; +using XCharts.Runtime; + +namespace XCharts.Editor +{ + [CustomPropertyDrawer(typeof(UIComponentTheme), true)] + public class UIComponentThemeDrawer : BasePropertyDrawer + { + public override string ClassName { get { return "Theme"; } } + public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label) + { + base.OnGUI(pos, prop, label); + if (MakeComponentFoldout(prop, "m_Show", true)) + { + ++EditorGUI.indentLevel; + PropertyField(prop, "m_SharedTheme"); + PropertyField(prop, "m_TransparentBackground"); + --EditorGUI.indentLevel; + } + } + } +} \ No newline at end of file diff --git a/Editor/MainComponents/UIComponentThemeDrawer.cs.meta b/Editor/MainComponents/UIComponentThemeDrawer.cs.meta new file mode 100644 index 00000000..75ad5abd --- /dev/null +++ b/Editor/MainComponents/UIComponentThemeDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dca2d7a2ed994420182384c2efa48c0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Internal/UIComponent.cs b/Runtime/Internal/UIComponent.cs new file mode 100644 index 00000000..8a1266e6 --- /dev/null +++ b/Runtime/Internal/UIComponent.cs @@ -0,0 +1,92 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +namespace XCharts.Runtime +{ + /// <summary> + /// UI组件基类。 + /// </summary> + [ExecuteInEditMode] + [RequireComponent(typeof(RectTransform))] + [DisallowMultipleComponent] + public class UIComponent : BaseGraph + { + [SerializeField] private bool m_DebugModel = false; + [SerializeField] protected UIComponentTheme m_Theme = new UIComponentTheme(); + [SerializeField] private ImageStyle m_Background = new ImageStyle() { show = false }; + protected bool m_DataDirty; + public override HideFlags chartHideFlags { get { return m_DebugModel ? HideFlags.None : HideFlags.HideInHierarchy; } } + public UIComponentTheme theme { get { return m_Theme; } set { m_Theme = value; } } + /// <summary> + /// 背景样式。 + /// </summary> + public ImageStyle background { get { return m_Background; } set { m_Background = value; color = Color.white; } } + /// <summary> + /// Update chart theme. + /// |切换内置主题。 + /// </summary> + /// <param name="theme">theme</param> + public bool UpdateTheme(ThemeType theme) + { + if (theme == ThemeType.Custom) + { + Debug.LogError("UpdateTheme: not support switch to Custom theme."); + return false; + } + if (m_Theme.sharedTheme == null) + m_Theme.sharedTheme = XCThemeMgr.GetTheme(ThemeType.Default); + m_Theme.sharedTheme.CopyTheme(theme); + m_Theme.SetAllDirty(); + return true; + } + + protected override void InitComponent() + { + base.InitComponent(); + if (m_Theme.sharedTheme == null) + m_Theme.sharedTheme = XCThemeMgr.GetTheme(ThemeType.Default); + UIHelper.InitBackground(this); + } + + protected override void CheckComponent() + { + base.CheckComponent(); + if (m_Theme.anyDirty) + { + if (m_Theme.componentDirty) + { + SetAllComponentDirty(); + } + if (m_Theme.vertsDirty) RefreshGraph(); + m_Theme.ClearDirty(); + } + } + + protected override void SetAllComponentDirty() + { + base.SetAllComponentDirty(); + InitComponent(); + } + + protected override void OnDrawPainterBase(VertexHelper vh, Painter painter) + { + vh.Clear(); + UIHelper.DrawBackground(vh, this); + } + + protected override void Update() + { + base.Update(); + if (m_DataDirty) + { + m_DataDirty = false; + DataDirty(); + } + } + + protected virtual void DataDirty() + { + } + } +} \ No newline at end of file diff --git a/Runtime/Internal/UIComponent.cs.meta b/Runtime/Internal/UIComponent.cs.meta new file mode 100644 index 00000000..9c155b18 --- /dev/null +++ b/Runtime/Internal/UIComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bb30814b19a9d4c1d800ae89e4537a8a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Internal/UIComponentTheme.cs b/Runtime/Internal/UIComponentTheme.cs new file mode 100644 index 00000000..ad51eed3 --- /dev/null +++ b/Runtime/Internal/UIComponentTheme.cs @@ -0,0 +1,53 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +namespace XCharts.Runtime +{ + [Serializable] + public class UIComponentTheme : ChildComponent + { + [SerializeField] private bool m_Show = true; + [SerializeField] private Theme m_SharedTheme; + [SerializeField] private bool m_TransparentBackground = false; + + public bool show { get { return m_Show; } } + /// <summary> + /// the theme of chart. + /// |主题类型。 + /// </summary> + public ThemeType themeType + { + get { return sharedTheme.themeType; } + } + /// <summary> + /// theme name. + /// |主题名字。 + /// </summary> + public string themeName + { + get { return sharedTheme.themeName; } + } + /// <summary> + /// the asset of theme. + /// |主题配置。 + /// </summary> + public Theme sharedTheme + { + get { return m_SharedTheme; } + set { m_SharedTheme = value; SetAllDirty(); } + } + /// <summary> + /// the background color of chart. + /// |背景颜色。 + /// </summary> + public Color32 backgroundColor + { + get + { + if (m_TransparentBackground) return ColorUtil.clearColor32; + else return sharedTheme.backgroundColor; + } + } + } +} \ No newline at end of file diff --git a/Runtime/Internal/UIComponentTheme.cs.meta b/Runtime/Internal/UIComponentTheme.cs.meta new file mode 100644 index 00000000..c4032b0f --- /dev/null +++ b/Runtime/Internal/UIComponentTheme.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 259f5ef4039524e15a7f88578635e907 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Internal/Utilities/UIHelper.cs b/Runtime/Internal/Utilities/UIHelper.cs new file mode 100644 index 00000000..a5598f30 --- /dev/null +++ b/Runtime/Internal/Utilities/UIHelper.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; +using XUGL; + +namespace XCharts.Runtime +{ + /// <summary> + /// UI帮助类。 + /// </summary> + public static class UIHelper + { + internal static void DrawBackground(VertexHelper vh, UIComponent component) + { + if (component.background.show == false || + (component.background.sprite == null && ChartHelper.IsClearColor(component.background.color))) + { + var p1 = new Vector3(component.graphX, component.graphY); + var p2 = new Vector3(component.graphX + component.graphWidth, component.graphY); + var p3 = new Vector3(component.graphX + component.graphWidth, component.graphY + component.graphHeight); + var p4 = new Vector3(component.graphX, component.graphY + component.graphHeight); + UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, GetBackgroundColor(component)); + } + } + + internal static void InitBackground(UIComponent table) + { + if (table.background.show == false || + (table.background.sprite == null && ChartHelper.IsClearColor(table.background.color))) + { + ChartHelper.DestoryGameObject(table.transform, "Background"); + return; + } + var sizeDelta = table.background.width > 0 && table.background.height > 0 ? + new Vector2(table.background.width, table.background.height) : + table.graphSizeDelta; + var backgroundObj = ChartHelper.AddObject("Background", table.transform, table.graphMinAnchor, + table.graphMaxAnchor, table.graphPivot, sizeDelta); + backgroundObj.hideFlags = table.chartHideFlags; + + var backgroundImage = ChartHelper.EnsureComponent<Image>(backgroundObj); + ChartHelper.UpdateRectTransform(backgroundObj, table.graphMinAnchor, + table.graphMaxAnchor, table.graphPivot, sizeDelta); + ChartHelper.SetBackground(backgroundImage, table.background); + backgroundObj.transform.SetSiblingIndex(0); + } + + public static Color32 GetBackgroundColor(UIComponent component) + { + if (component.background.show && !ChartHelper.IsClearColor(component.background.color)) + return component.background.color; + else + return component.theme.backgroundColor; + } + } +} \ No newline at end of file diff --git a/Runtime/Internal/Utilities/UIHelper.cs.meta b/Runtime/Internal/Utilities/UIHelper.cs.meta new file mode 100644 index 00000000..029495c6 --- /dev/null +++ b/Runtime/Internal/Utilities/UIHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3be0399ecf6194793aa056e45ebfe20a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From d7223f67907cf9b8f83283f90880c6579a0951de Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 20 Mar 2023 21:59:12 +0800 Subject: [PATCH 51/55] 3.6.0 --- Documentation~/zh/changelog.md | 3 +++ Runtime/Internal/XChartsMgr.cs | 2 +- package.json | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index b584a2b8..17e537e4 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -65,7 +65,10 @@ slug: /changelog ## master +* (2023.03.14) 修复`Tooltip`的`titleFormater`设置`{b}`可能不生效的问题 +* (2023.03.14) 修复`BarChart`在数据为0时不绘制柱条背景的问题 (#250) (by __Ambitroc__) * (2023.03.12) 增加`LabelStyle`的`autoRotate`可设置有角度的竖版文本的自动旋转 +* (2023.03.10) 增加`VR`等其他非鼠标输入方式的Point位置获取 (#248) (by __Ambitroc__) * (2023.03.09) 增加`Chart`的`onSerieClick`,`onSerieDown`,`onSerieEnter`和`onSerieExit`回调 * (2023.03.09) 修复`Pie`的点击选中偏移不生效的问题 * (2023.03.04) 增加`Legend`的`Positions`可自定义图例的位置 diff --git a/Runtime/Internal/XChartsMgr.cs b/Runtime/Internal/XChartsMgr.cs index ae647124..661e35b7 100644 --- a/Runtime/Internal/XChartsMgr.cs +++ b/Runtime/Internal/XChartsMgr.cs @@ -22,7 +22,7 @@ namespace XCharts.Runtime public static class XChartsMgr { public static readonly string version = "3.6.0"; - public static readonly int versionDate = 20230201; + public static readonly int versionDate = 20230401; public static string fullVersion { get { return version + "-" + versionDate; } } internal static List<BaseChart> chartList = new List<BaseChart>(); diff --git a/package.json b/package.json index 2ac8569b..967bd128 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "com.monitor1394.xcharts", "displayName": "XCharts", "version": "3.6.0", - "date": "20230201", - "checkdate": "20230201", + "date": "20230401", + "checkdate": "20230401", "desc": "如果 XCharts 对您有帮助,希望您能在 Github 上点 Star 支持,非常感谢!", "unity": "2018.3", "description": "A charting and data visualization library for Unity.", From d1965517569a03bd5fe8d1c43443be79d9f741de Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Mon, 20 Mar 2023 22:00:02 +0800 Subject: [PATCH 52/55] 3.6.0 --- Documentation~/en/api.md | 16 ++++++++++++++++ Documentation~/en/configuration.md | 12 ++++++++++++ Documentation~/zh/api.md | 16 ++++++++++++++++ Documentation~/zh/configuration.md | 12 ++++++++++++ 4 files changed, 56 insertions(+) diff --git a/Documentation~/en/api.md b/Documentation~/en/api.md index 84728fa3..e939a50c 100644 --- a/Documentation~/en/api.md +++ b/Documentation~/en/api.md @@ -95,6 +95,8 @@ slug: /api - [UGL](#ugl) - [UGLExample](#uglexample) - [UGLHelper](#uglhelper) +- [UIComponent](#uicomponent) +- [UIHelper](#uihelper) - [VisualMapContext](#visualmapcontext) - [VisualMapHelper](#visualmaphelper) - [XChartsMgr](#xchartsmgr) @@ -1182,6 +1184,20 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) |IsZeroVector()||public static bool IsZeroVector(Vector3 pos)| |RotateRound()||public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| +## UIComponent + +Inherits or Implemented: [BaseGraph](#basegraph) + +|public method|since|description| +|--|--|--| +|UpdateTheme()||public bool UpdateTheme(ThemeType theme)<br/>Update chart theme. | + +## UIHelper + +|public method|since|description| +|--|--|--| +|GetBackgroundColor()||public static Color32 GetBackgroundColor(UIComponent component)| + ## VisualMapContext Inherits or Implemented: [MainComponentContext](#maincomponentcontext) diff --git a/Documentation~/en/configuration.md b/Documentation~/en/configuration.md index 02ca5c1b..550a26a9 100644 --- a/Documentation~/en/configuration.md +++ b/Documentation~/en/configuration.md @@ -41,6 +41,7 @@ slug: /configuration - [ThemeStyle](#themestyle) - [TitleTheme](#titletheme) - [TooltipTheme](#tooltiptheme) +- [UIComponentTheme](#uicomponenttheme) - [VisualMapTheme](#visualmaptheme) @@ -129,6 +130,7 @@ slug: /configuration - [TitleStyle](#titlestyle) - [TitleTheme](#titletheme) - [TooltipTheme](#tooltiptheme) +- [UIComponentTheme](#uicomponenttheme) - [VisualMapRange](#visualmaprange) - [VisualMapTheme](#visualmaptheme) @@ -1507,6 +1509,16 @@ Inherits or Implemented: [ComponentTheme](#componenttheme) |labelTextColor|||the text color of tooltip cross indicator's axis label. |labelBackgroundColor|||the background color of tooltip cross indicator's axis label. +## UIComponentTheme + +Inherits or Implemented: [ChildComponent](#childcomponent) + +|field|default|since|comment| +|--|--|--|--| +|show|true|| +|sharedTheme|||the asset of theme. [Theme](#theme)| +|transparentBackground|false|| + ## VisualMap Inherits or Implemented: [MainComponent](#maincomponent) diff --git a/Documentation~/zh/api.md b/Documentation~/zh/api.md index 67bf802f..0b1b60b7 100644 --- a/Documentation~/zh/api.md +++ b/Documentation~/zh/api.md @@ -95,6 +95,8 @@ slug: /api - [UGL](#ugl) - [UGLExample](#uglexample) - [UGLHelper](#uglhelper) +- [UIComponent](#uicomponent) +- [UIHelper](#uihelper) - [VisualMapContext](#visualmapcontext) - [VisualMapHelper](#visualmaphelper) - [XChartsMgr](#xchartsmgr) @@ -1182,6 +1184,20 @@ Inherits or Implemented: [MaskableGraphic](#maskablegraphic) |IsZeroVector()||public static bool IsZeroVector(Vector3 pos)| |RotateRound()||public static Vector3 RotateRound(Vector3 position, Vector3 center, Vector3 axis, float angle)| +## UIComponent + +Inherits or Implemented: [BaseGraph](#basegraph) + +|public method|since|description| +|--|--|--| +|UpdateTheme()||public bool UpdateTheme(ThemeType theme)<br/>切换内置主题。 | + +## UIHelper + +|public method|since|description| +|--|--|--| +|GetBackgroundColor()||public static Color32 GetBackgroundColor(UIComponent component)| + ## VisualMapContext Inherits or Implemented: [MainComponentContext](#maincomponentcontext) diff --git a/Documentation~/zh/configuration.md b/Documentation~/zh/configuration.md index 34f8c1db..1e89c1b8 100644 --- a/Documentation~/zh/configuration.md +++ b/Documentation~/zh/configuration.md @@ -41,6 +41,7 @@ slug: /configuration - [ThemeStyle](#themestyle) - [TitleTheme](#titletheme) - [TooltipTheme](#tooltiptheme) +- [UIComponentTheme](#uicomponenttheme) - [VisualMapTheme](#visualmaptheme) @@ -129,6 +130,7 @@ slug: /configuration - [TitleStyle](#titlestyle) - [TitleTheme](#titletheme) - [TooltipTheme](#tooltiptheme) +- [UIComponentTheme](#uicomponenttheme) - [VisualMapRange](#visualmaprange) - [VisualMapTheme](#visualmaptheme) @@ -1507,6 +1509,16 @@ Inherits or Implemented: [ComponentTheme](#componenttheme) |labelTextColor|||十字指示器坐标轴标签的文本颜色。 |labelBackgroundColor|||十字指示器坐标轴标签的背景颜色。 +## UIComponentTheme + +Inherits or Implemented: [ChildComponent](#childcomponent) + +|field|default|since|comment| +|--|--|--|--| +|show|true|| +|sharedTheme|||主题配置。 [Theme](#theme)| +|transparentBackground|false|| + ## VisualMap Inherits or Implemented: [MainComponent](#maincomponent) From 5757049e748b236a7092267e6753f8a386243075 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Tue, 21 Mar 2023 08:12:20 +0800 Subject: [PATCH 53/55] =?UTF-8?q?=E5=AE=8C=E5=96=84Pyramid=E7=9A=84Tooltip?= =?UTF-8?q?=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Serie/Line/LineHandler.GridCoord.cs | 2 +- Runtime/Serie/SerieData.cs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index 615c574c..d5699de2 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -34,7 +34,6 @@ namespace XCharts.Runtime { if (m_SerieGrid == null) return; - var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); var needCheck = (chart.isPointerInChart && m_SerieGrid.IsPointerEnter()) || m_LegendEnter; if (!needCheck) { @@ -55,6 +54,7 @@ namespace XCharts.Runtime return; } m_LastCheckContextFlag = needCheck; + var lineWidth = serie.lineStyle.GetWidth(chart.theme.serie.lineWidth); var themeSymbolSize = chart.theme.serie.lineSymbolSize; var needInteract = false; serie.ResetDataIndex(); diff --git a/Runtime/Serie/SerieData.cs b/Runtime/Serie/SerieData.cs index ca1492da..2f448df8 100644 --- a/Runtime/Serie/SerieData.cs +++ b/Runtime/Serie/SerieData.cs @@ -668,6 +668,12 @@ namespace XCharts.Runtime if (labelObject != null) labelObject.SetActive(flag); } + public void SetPolygon(params Vector2[] points) + { + m_PolygonPoints.Clear(); + m_PolygonPoints.AddRange(points); + } + public void SetPolygon(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4) { m_PolygonPoints.Clear(); @@ -676,6 +682,7 @@ namespace XCharts.Runtime m_PolygonPoints.Add(p3); m_PolygonPoints.Add(p4); } + public void SetPolygon(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, Vector2 p5) { SetPolygon(p1, p2, p3, p4); From 8b320e9bc958266a5e29605a786fcbeb49ec6b4a Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Fri, 31 Mar 2023 07:12:42 +0800 Subject: [PATCH 54/55] =?UTF-8?q?=E8=B0=83=E6=95=B4Serie=E7=9A=84smoothLim?= =?UTF-8?q?it=E9=BB=98=E8=AE=A4=E4=B8=BAfalse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/Serie/Serie.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index 31b9b02d..2f5e9ec4 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -247,7 +247,7 @@ namespace XCharts.Runtime [SerializeField] private float m_SampleAverage = 0; [SerializeField] private LineType m_LineType = LineType.Normal; - [SerializeField][Since("v3.4.0")] private bool m_SmoothLimit = true; + [SerializeField][Since("v3.4.0")] private bool m_SmoothLimit = false; [SerializeField] private BarType m_BarType = BarType.Normal; [SerializeField] private bool m_BarPercentStack = false; [SerializeField] private float m_BarWidth = 0; From c53be4b5f976ba31136ed514b39560fc3f522987 Mon Sep 17 00:00:00 2001 From: monitor1394 <monitor1394@gmail.com> Date: Sat, 1 Apr 2023 23:05:47 +0800 Subject: [PATCH 55/55] 3.6.0 --- Documentation~/en/changelog.md | 36 +++++++++++++++++++ Documentation~/en/configuration.md | 2 +- Documentation~/zh/changelog.md | 22 ++++++++++++ Documentation~/zh/configuration.md | 2 +- Documentation~/zh/support.md | 26 +++++++------- README-en.md | 2 +- README.md | 56 ++++++++++-------------------- 7 files changed, 92 insertions(+), 54 deletions(-) diff --git a/Documentation~/en/changelog.md b/Documentation~/en/changelog.md index d8b1a28a..89ae3019 100644 --- a/Documentation~/en/changelog.md +++ b/Documentation~/en/changelog.md @@ -2,6 +2,7 @@ # 更新日志 [master](#master) +[v3.6.0](#v360) [v3.5.0](#v350) [v3.4.0](#v340) [v3.3.0](#v330) @@ -60,6 +61,41 @@ ## master +## v3.6.0 + +* (2023.04.01) Release `v3.6.0` version +* (2023.03.14) Fix for Tooltip's `titleFormater` setting `{b}` may not take effect +* (2023.03.14) Fix for `BarChart` not drawing bar background when data is 0 (#250) (by __Ambitroc__) +* (2023.03.12) Added `LabelStyle` `autoRotate` to set automatic rotation of angled vertical text +* (2023.03.10) Added `VR` and other non-mouse input for Point location acquisition (#248) (by __Ambitroc__) +* (2023.03.09) Adds callbacks to Chart's `onSerieClick`, `onSerieDown`, `onSerieEnter` and `onSerieExit` +* (2023.03.09) Fixed click-check offset for `Pie` not taking effect +* (2023.03.04) Added Positions for Legend to customize legend positions +* (2023.03.03) Fixed `Animation` changing animation that might not work +* (2023.02.28) Fixed issue with Serie's Label not refreshing when `Legend` is clicked +* (2023.02.26) Adds DataZoom's `startEndFunction` delegate +* (2023.02.12) Refactor the Component code and adjust the API +* (2023.02.10) Fix `Axis` with incorrect minimum in `Log` axis in some cases +* (2023.02.10) Optimizes the default display format of Axis's value Label +* (2023.02.08) Added startLock and endLock for DataZoom +* (2023.02.02) Fixed bug where datazoom xaxis label could be displayed off-chart when datazoom is turned on +* (2023.02.02) Optimizes the `ignore` setting of `SerieData` to ignore data +* (2023.02.01) Fix `XChartsMgr.ContainsChart()` interface exception +* (2023.01.31) Added support for `InputSystem` (#242) (by __Bian-Sh__) +* (2023.01.11) Fixed chart not refreshing after removing Component from Inspector (#241) +* (2023.01.06) Fixed bug with `Pie` displaying abnormal Label when the last few values are 0 (#240) +* (2023.01.03) deletes serie `MarkColor` and adds ItemStyle `MarkColor` +* (2022.12.29) Added `+` to list editor +* (2022.12.29) Fixed `UpdateXYData()` interface affecting data accuracy (#238) +* (2022.12.28) Fixed abnormal display when setting `border` when `Pie` has only one data (#237) +* (2022.12.22) Adjust `Covert` rename to `Convert`, involving interfaces such as: `ConvertXYAxis()`, `CovertSerie()`, etc +* (2022.12.22) Fixed abnormal display of `Label` after `Convert XY Axis` +* (2022.12.12) Fixed an issue where the `Value` Axis of `axis` calculated the value range incorrectly in some cases +* (2022.12.12) Optimized legend's formatter to support `{h}` wildcards +* (2022.12.12) Fixed abnormal display of Legend's formatter when set to a fixed value +* (2022.12.08) Added `AreaStyle` `toTop` parameter to set whether the line graph gradient goes to the top or to the actual position +* (2022.12.07) Adds text wildcard `{h}` for `Formatter` to support setting current color values + ## v3.5.0 Highlights: diff --git a/Documentation~/en/configuration.md b/Documentation~/en/configuration.md index 550a26a9..450da862 100644 --- a/Documentation~/en/configuration.md +++ b/Documentation~/en/configuration.md @@ -1129,7 +1129,7 @@ Inherits or Implemented: [BaseSerie](#baseserie),[IComparable](#icomparable) |sampleType|||the type of sample.<br/>`SampleType`:<br/>- `Peak`: Take a peak. When the average value of the filter point is greater than or equal to 'sampleAverage', take the maximum value; If you do it the other way around, you get the minimum.<br/>- `Average`: Take the average of the filter points.<br/>- `Max`: Take the maximum value of the filter point.<br/>- `Min`: Take the minimum value of the filter point.<br/>- `Sum`: Take the sum of the filter points.<br/>| |sampleAverage|0||设定的采样平均值。当sampleType 为 Peak 时,用于和过滤数据的平均值做对比是取最大值还是最小值。默认为0时会实时计算所有数据的平均值。 |lineType|||The type of line chart.<br/>`LineType`:<br/>- `Normal`: the normal line chart,<br/>- `Smooth`: the smooth line chart,<br/>- `StepStart`: step line.<br/>- `StepMiddle`: step line.<br/>- `StepEnd`: step line.<br/>| -|smoothLimit|true|v3.4.0|Whether to restrict the curve. When true, the curve between two continuous data of the same value is restricted to not exceed the data point, and is flat to the data point. +|smoothLimit|false|v3.4.0|Whether to restrict the curve. When true, the curve between two continuous data of the same value is restricted to not exceed the data point, and is flat to the data point. |barType|||柱形图类型。<br/>`BarType`:<br/>- `Normal`: normal bar.<br/>- `Zebra`: zebra bar.<br/>- `Capsule`: capsule bar.<br/>| |barPercentStack|false||柱形图是否为百分比堆积。相同stack的serie只要有一个barPercentStack为true,则就显示成百分比堆叠柱状图。 |barWidth|0||The width of the bar. Adaptive when default 0. diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 17e537e4..7df3f802 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -6,6 +6,7 @@ slug: /changelog # 更新日志 [master](#master) +[v3.6.0](#v360) [v3.5.0](#v350) [v3.4.0](#v340) [v3.3.0](#v330) @@ -65,6 +66,27 @@ slug: /changelog ## master +## v3.6.0 + +版本要点: + +* 增加`InputSystem`支持 (by __Bian-Sh__) +* 增加官网[在线示例](https://xcharts-team.github.io/examples/)多版本支持 (by __SHL-COOL__) +* 完善对`VR`的支持 (by __Ambitroc__) +* 增加`UITable`,`UIStatistic`等[扩展UI组件](https://xcharts-team.github.io/docs/ui) +* 增加`ItemStyle`的`MarkColor` +* 增加通配符`{h}`的支持 +* 优化`Tooltip`,`Legend`,`DataZoom`,`Axis`等组件 +* 重构相关`API`接口,完善回调接口 +* 修复若干问题 + +升级注意: + +* 部分接口有调整,可根据提示更换下接口即可。 + +日志详情: + +* (2023.04.01) 发布`v3.6.0`版本 * (2023.03.14) 修复`Tooltip`的`titleFormater`设置`{b}`可能不生效的问题 * (2023.03.14) 修复`BarChart`在数据为0时不绘制柱条背景的问题 (#250) (by __Ambitroc__) * (2023.03.12) 增加`LabelStyle`的`autoRotate`可设置有角度的竖版文本的自动旋转 diff --git a/Documentation~/zh/configuration.md b/Documentation~/zh/configuration.md index 1e89c1b8..959eb8ad 100644 --- a/Documentation~/zh/configuration.md +++ b/Documentation~/zh/configuration.md @@ -1129,7 +1129,7 @@ Inherits or Implemented: [BaseSerie](#baseserie),[IComparable](#icomparable) |sampleType|||采样类型。当sampleDist大于0时有效。<br/>`SampleType`:<br/>- `Peak`: 取峰值。<br/>- `Average`: 取过滤点的平均值。<br/>- `Max`: 取过滤点的最大值。<br/>- `Min`: 取过滤点的最小值。<br/>- `Sum`: 取过滤点的和。<br/>| |sampleAverage|0||设定的采样平均值。当sampleType 为 Peak 时,用于和过滤数据的平均值做对比是取最大值还是最小值。默认为0时会实时计算所有数据的平均值。 |lineType|||折线图样式类型。<br/>`LineType`:<br/>- `Normal`: 普通折线图。<br/>- `Smooth`: 平滑曲线。<br/>- `StepStart`: 阶梯线图:当前点。<br/>- `StepMiddle`: 阶梯线图:当前点和下一个点的中间。<br/>- `StepEnd`: 阶梯线图:下一个拐点。<br/>| -|smoothLimit|true|v3.4.0|是否限制曲线。当为true时,两个连续相同数值的数据间的曲线会限制为不超出数据点,和数据点是平直的。 +|smoothLimit|false|v3.4.0|是否限制曲线。当为true时,两个连续相同数值的数据间的曲线会限制为不超出数据点,和数据点是平直的。 |barType|||柱形图类型。<br/>`BarType`:<br/>- `Normal`: 普通柱形图。<br/>- `Zebra`: 斑马柱形图。<br/>- `Capsule`: 胶囊柱形图。<br/>| |barPercentStack|false||柱形图是否为百分比堆积。相同stack的serie只要有一个barPercentStack为true,则就显示成百分比堆叠柱状图。 |barWidth|0||柱条的宽度,不设时自适应。支持设置成相对于类目宽度的百分比。 diff --git a/Documentation~/zh/support.md b/Documentation~/zh/support.md index e6a7c0e3..c7bdbe71 100644 --- a/Documentation~/zh/support.md +++ b/Documentation~/zh/support.md @@ -11,17 +11,18 @@ slug: /support ## 订阅VIP服务 -订阅服务分个人订阅和企业订阅: +订阅服务分`个人订阅`和`企业订阅`: -- `个人`订阅:`个人VIP`属于个人,不可转让,`XCharts`团队只服务于订阅当事人。 -- `企业`订阅:`企业VIP`属于企业,席位内可安排固定职员,职员离职后席位可重新安排,`XCharts`团队通过专属企业群为企业服务。 +- `个人订阅`:`个人VIP`属于个人,不可转让,`XCharts`团队只服务于订阅当事人。 +- `企业订阅`:`企业VIP`属于企业,席位内可安排固定职员,职员离职后席位可重新安排,`XCharts`团队通过专属企业群为企业服务。 -订阅服务的优势? +订阅服务有哪些优势? -- 提高工作效率,节省时间成本。一方面,`XCharts`功能强大,相关配置项非常多,`VIP`服务可快速帮您定位,节省去查找和核对的时间;另一方面,`VIP`的即时回答服务可快速为您答疑解惑,避免中断开发流程。总之,订阅`VIP`可让您能快速上手,快速处理问题,至少能提高`10`倍以上的工作效率。 +- 提高工作效率,节省时间成本。一方面,`XCharts`功能强大,相关配置项非常多,`VIP`服务可快速帮您定位,节省去查找和核对的时间;另一方面,`VIP`的即时回答服务可快速为您答疑解惑,避免中断开发流程,快速上手,快速处理问题,至少能提高`10`倍以上的工作效率。 - 更多技术交流,更多经验交流。`XCharts`团队成员从业多年,有丰富的技术和工作经验。`VIP`服务不仅可以交流`XCharts`相关的内容,也可以咨询其他方面的技术。`VIP`群也有更多的交流。 -- 扩展图表的需要订阅`VIP`服务后才能购买,扩展图表超过1年后的更新支持也需要持续订阅`VIP`服务。 -- `VIP`用户可加入`XCharts`的`GitHub`组织,参与`XCharts`社区构建,访问专有仓库。 +- 扩展图表需要订阅`VIP`服务后才能购买,扩展图表超过1年后的更新支持也需要持续订阅`VIP`服务。 +- `VIP`用户可加入`XCharts`的`GitHub`组织,参与`XCharts`的社区构建,访问专有仓库。拥有`扩展UI组件`等专属功能。 +- 在`XCharts交流群`里拥有`VIP`专属标识,问题会第一时间得到响应,有问即答。 | |免费用户|付费咨询|个人`VIP` | 个人`SVIP` | 企业`VIP` | | ----- |--|--|--|--|--| @@ -35,8 +36,7 @@ slug: /support | __`服务内容:`__| | 可商用 | √ | √ | √ | √ | √ | | 可二次开发 | √ | √ | √ | √ | √ | -| 有问必答 | | √ | √ | √ | √ | -| 即时回答 | | √ | √ | √ | √ | +| 有问即答 | | √ | √ | √ | √ | | 新手指导 | | √ | √ | √ | √ | | 开发指导 | | √ | √ | √ | √ | | 优化指导 | | √ | √ | √ | √ | @@ -45,7 +45,7 @@ slug: /support | 需求优先考虑 | | | √ | √ | √ | | 可另付费定制 | | | √ | √ | √ | | 可另付费加急 | | | √ | √ | √ | -| VIP专有功能教程和文档 | | | √待开放 | √待开放 | √待开放 | +| 扩展UI组件 | | | √ | √ | √ | | 扩展图表购买 | | | 按需购买 | __全部免费__ | __全部免费__ | | 扩展图表源码 | | | 永久持有 | 永久持有 | 永久持有 | | 扩展图表更新 | | | 1年更新支持 | 1年更新支持 | 1年更新支持 | @@ -54,7 +54,7 @@ slug: /support 扩展图表为另付费购买图表,只对订阅了`VIP`服务的用户开放购买。对于`SVIP`的订阅用户,所有扩展图表仓库可免费使用,不用再单独购买。 -对所有已购买的扩展图表,源码可永久持有,并获得持续一年的更新支持,一年后如需更新支持服务,需再继续订阅`VIP`服务。 +对所有已购买的扩展图表,源码可永久持有,并获得持续一年的更新支持,一年后如需更新支持服务,可再继续订阅`VIP`服务。 |编号|扩展图表|价格|备注| |--|--|--|--| @@ -73,11 +73,11 @@ slug: /support 1. __`付费定制`__ 是指用户可根据自己的需求定制不同的图表或新功能,只有`VIP`用户才享有`付费定制`权利。 2. __`付费加急`__ 是指用户可对自己非常紧急的需求进行付费,将开发优先级提到最高,并可要求在指定`截止日期`内交付,只有`VIP`用户才享有`付费加急`权利。 3. __`付费咨询`__ 付费咨询有效期`7`天,且总咨询时长不超过`7`个小时。 -4. __`扩展图表`__ 购买后代码可永久持有和商用,1年的更新支持。 +4. __`扩展图表`__ 购买后代码可永久持有和商用,1年的更新和技术支持。 ## 捐助支持 -如果这个项目对您有帮助,请右上方点 `Star` 予以支持!也欢迎任意金额的捐助,非常您的支持! +如果这个项目对您有帮助,请右上方点 `Star` 予以支持!也欢迎任意金额的捐助,非常感谢您的支持! ## 二维码 diff --git a/README-en.md b/README-en.md index 3d8045ee..3438bdd1 100644 --- a/README-en.md +++ b/README-en.md @@ -110,7 +110,7 @@ A powerful, easy-to-use, configurable charting and data visualization library fo ![extendchart](Documentation~/en/img/readme_extendchart.png) -For more examples, see [XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo), You can also go to [Online Demo](https://xcharts-team.github.io/demo/) to see the running effect of `WebGL`. +For more examples, see [XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo), You can also go to [Online Demo](https://xcharts-team.github.io/examples/) to see the running effect of `WebGL`. ## Use diff --git a/README.md b/README.md index 4bf30cd0..53fc5420 100644 --- a/README.md +++ b/README.md @@ -46,13 +46,14 @@ 一款基于`UGUI`的功能强大、简单易用的数据可视化图表插件。支持`折线图`、`柱状图`、`饼图`、`雷达图`、`散点图`、`热力图`、`环形图`、`K线图`、`极坐标`、`平行坐标`等十多种内置图表,以及`3D饼图`、`3D柱图`、`3D金字塔`、`漏斗图`、`仪表盘`、`水位图`、`象形柱图`、`甘特图`、`矩形树图`等扩展图表。 [XCharts3.0 官方主页](https://xcharts-team.github.io) +[XCharts3.0 在线示例](https://xcharts-team.github.io/examples) -[XCharts3.0 教程](Documentation~/zh/tutorial01.md) -[XCharts3.0 API](Documentation~/zh/api.md) -[XCharts3.0 问答](Documentation~/zh/faq.md) -[XCharts3.0 配置项手册](Documentation~/zh/configuration.md) -[XCharts3.0 更新日志](Documentation~/zh/changelog.md) -[XCharts3.0 订阅服务](Documentation~/zh/support.md) +[XCharts3.0 教程](Documentation~/zh/tutorial01.md) +[XCharts3.0 API](Documentation~/zh/api.md) +[XCharts3.0 问答](Documentation~/zh/faq.md) +[XCharts3.0 配置项手册](Documentation~/zh/configuration.md) +[XCharts3.0 更新日志](Documentation~/zh/changelog.md) +[XCharts3.0 订阅服务](Documentation~/zh/support.md) ## 特性 @@ -78,40 +79,14 @@ ![扩展图表](Documentation~/zh/img/readme_extendchart.png) -XCharts不再内置Demo,Demo已独立出单独的仓库 [XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo),也可以在浏览器查看`WebGL`下的运行效果 [在线Demo](https://xcharts-team.github.io/demo/) 。 - -## `XCharts3.0` - -- 增加`Time`时间轴。 -- 增加`SingleAxis`单轴。 -- 增加多种坐标系:`Grid`、`Polar`、`Radar`、`SingleAxis`。 -- 增加多种动画方式。 -- 增加多种图表交互。 -- 增加国际化支持。 -- 增加`Widgets`小组件。 -- 增加多种扩展图表。 - -## `XCharts3.0` 相比 `XCharts2.0` - -- 更健壮的底层框架。 -- 更强大的性能。 -- 更小的序列化文件。 -- 更好的交互体验。 -- 更多的组件支持。 -- 更强大的文本自述能力。 -- 更合理的组件调整。 -- 更灵活的组件插拔。 -- 更高效的二次开发。 -- 更丰富的Demo示例。 - ![XCharts 3.0和2.0的对比](Documentation~/zh/img/readme_xcharts3.png) ## 注意 -- `XCharts3.0` 不完全兼容 `XCharts2.0` 版本,升级`3.0`可能需要调整部分代码和配置。建议旧项目可以继续使用`XCharts2.0`,新项目推荐使用`XCharts3.0`。 -- `XCharts2.0` 进入维护阶段,后续只修复严重`bug`,理论上不再加新功能。 +- `XCharts3.0` 不完全兼容 `XCharts2.0` 版本,升级`3.0`可能需要调整部分代码,图表部分配置需要重新调整。建议旧项目可以继续使用`XCharts2.0`,新项目推荐使用`XCharts3.0`。 +- `XCharts2.0` 进入维护阶段,后续只修复严重`bug`,原则上不再加新功能。 - `XCharts` 理论上支持`Unity 5.6`及以上版本,但由于版本测试有限难免疏漏,发现版本兼容问题可提`Issue`。 -- 本仓库只包含`XCharts`源码,不包含`Demo`示例部分。需要查看`Demo`请到[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo)仓库。 +- 本仓库只包含`XCharts`源码,不包含`Demo`示例部分。需要查看`Demo`示例源码请到[XCharts-Demo](https://github.com/XCharts-Team/XCharts-Demo)仓库。也可以在浏览器查看`WebGL`下的运行效果 [在线Demo](https://xcharts-team.github.io/examples/) 。 ## 使用 @@ -119,7 +94,7 @@ XCharts不再内置Demo,Demo已独立出单独的仓库 [XCharts-Demo](https:/ 2. 在`Hierarchy`视图下右键选择`XCharts->LineChart`,即可创建一个默认的折线图。 3. 在`Inspector`视图可以调整各个组件的参数,`Game`视图可看到实时效果。 -- 更多使用细节,请看:[XCharts教程:5分钟上手教程](Documentation~/zh/tutorial01.md) +- 更多细节,请看:[XCharts教程:5分钟上手教程](Documentation~/zh/tutorial01.md) - 首次使用,建议先认真看一遍教程。 ## 分支 @@ -131,13 +106,18 @@ XCharts不再内置Demo,Demo已独立出单独的仓库 [XCharts-Demo](https:/ - `1.0`:XCharts 1.0的稳定分支。带Demo,不再维护。 - `1.0-upm`:XCharts 1.0的稳定UMP分支。不带Demo,不再维护。 +## 扩展 + +- [扩展图表](https://xcharts-team.github.io/docs/extra) 扩展图表订阅`VIP`后再按需购买,订阅详情请查看[☞ 看这里](Documentation~/zh/support.md) +- [扩展组件](https://xcharts-team.github.io/docs/ui) 扩展组件订阅`VIP`后即可免费使用。 + ## FAQ 1. `XCharts`可以免费使用吗? 答:`XCharts`使用`MIT`协议,可以免费使用。也可以订阅`VIP`享受更多增值服务。 2. `XCharts`支持代码动态添加和修改数据吗?支持从`Excel`或数据库中获取数据吗? - 答:`XCharts`提供了各种数据操作的接口,支持代码动态修改配置,添加和修改数据,但数据来源需要自己解析或获取,再调用`XCharts`的接口添加到`XCharts`。 + 答:`XCharts`提供了各种数据操作的接口,支持代码动态修改配置,添加和修改数据,但数据来源需要自己解析和获取,再调用`XCharts`的接口添加到图表。 3. 这个插件除了用在`Unity`,还能用在其他平台(如`Winform`或`WPF`)吗? 答:目前只支持在`Unity`平台使用。理论上任何支持`UGUI`的`Unity`版本都能运行`XCharts`。 @@ -161,4 +141,4 @@ XCharts不再内置Demo,Demo已独立出单独的仓库 [XCharts-Demo](https:/ - 邮箱:`monitor1394@gmail.com` - QQ群:XCharts交流群(`202030963`) - VIP群:XCharts技术支持VIP群(`867291970`) -- 捐助、合作和技术支持:[☞ 看这里](Documentation~/zh/support.md) +- 捐助、合作、订阅和技术支持:[☞ 看这里](Documentation~/zh/support.md)