增加DataZoomminZoomRatio替换旧的minShowNum (#350)

This commit is contained in:
monitor1394
2026-01-08 08:58:12 +08:00
parent 880a6b1885
commit b311d17d94
6 changed files with 65 additions and 36 deletions

View File

@@ -80,6 +80,7 @@ slug: /changelog
## master ## master
* (2026.01.08) 增加`DataZoom``minZoomRatio`替换旧的`minShowNum` (#350)
* (2025.11.05) 修复`Axis``indicatorLabel`无法隐藏的问题 * (2025.11.05) 修复`Axis``indicatorLabel`无法隐藏的问题
* (2025.11.03) 增加`Tooltip``Title`可通过`TitleLabelStyle``numericFormatter`格式化时间显示 (#353) * (2025.11.03) 增加`Tooltip``Title`可通过`TitleLabelStyle``numericFormatter`格式化时间显示 (#353)
* (2025.10.30) 增加`Chart``useUtc`参数设置显示时间是否用UTC时间 * (2025.10.30) 增加`Chart``useUtc`参数设置显示时间是否用UTC时间

View File

@@ -13,7 +13,7 @@ namespace XCharts.Editor
var m_SupportMarquee = baseProperty.FindPropertyRelative("m_SupportMarquee"); var m_SupportMarquee = baseProperty.FindPropertyRelative("m_SupportMarquee");
var m_Start = baseProperty.FindPropertyRelative("m_Start"); var m_Start = baseProperty.FindPropertyRelative("m_Start");
var m_End = baseProperty.FindPropertyRelative("m_End"); var m_End = baseProperty.FindPropertyRelative("m_End");
var m_MinShowNum = baseProperty.FindPropertyRelative("m_MinShowNum"); var m_MinZoomRatio = baseProperty.FindPropertyRelative("m_MinZoomRatio");
++EditorGUI.indentLevel; ++EditorGUI.indentLevel;
PropertyField("m_Orient"); PropertyField("m_Orient");
PropertyField("m_SupportInside"); PropertyField("m_SupportInside");
@@ -31,10 +31,11 @@ namespace XCharts.Editor
PropertyField(m_End); PropertyField(m_End);
PropertyField("m_StartLock"); PropertyField("m_StartLock");
PropertyField("m_EndLock"); PropertyField("m_EndLock");
PropertyField(m_MinShowNum); PropertyField(m_MinZoomRatio);
if (m_Start.floatValue < 0) m_Start.floatValue = 0; if (m_Start.floatValue < 0) m_Start.floatValue = 0;
if (m_End.floatValue > 100) m_End.floatValue = 100; if (m_End.floatValue > 100) m_End.floatValue = 100;
if (m_MinShowNum.intValue < 0) m_MinShowNum.intValue = 0; if (m_MinZoomRatio.floatValue < 0) m_MinZoomRatio.floatValue = 0;
if (m_MinZoomRatio.floatValue > 1) m_MinZoomRatio.floatValue = 1;
if (m_SupportSlider.boolValue) if (m_SupportSlider.boolValue)
{ {
PropertyField("m_ShowDataShadow"); PropertyField("m_ShowDataShadow");

View File

@@ -120,24 +120,25 @@ namespace XCharts.Runtime
if (end > data.Count) end = data.Count; if (end > data.Count) end = data.Count;
} }
var minZoomRatio = (int)(data.Count * dataZoom.minZoomRatio);
if (start != filterStart || if (start != filterStart ||
end != filterEnd || end != filterEnd ||
dataZoom.minShowNum != filterMinShow || minZoomRatio != filterMinShow ||
isNeedUpdateFilterData) isNeedUpdateFilterData)
{ {
filterStart = start; filterStart = start;
filterEnd = end; filterEnd = end;
filterMinShow = dataZoom.minShowNum; filterMinShow = minZoomRatio;
isNeedUpdateFilterData = false; isNeedUpdateFilterData = false;
if (data.Count > 0) if (data.Count > 0)
{ {
if (range < dataZoom.minShowNum) if (range < minZoomRatio)
{ {
if (dataZoom.minShowNum > data.Count) if (dataZoom.minZoomRatio > data.Count)
range = data.Count; range = data.Count;
else else
range = dataZoom.minShowNum; range = minZoomRatio;
} }
if (range > data.Count - start) if (range > data.Count - start)
start = data.Count - range; start = data.Count - range;

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
@@ -81,7 +82,7 @@ namespace XCharts.Runtime
[SerializeField] private RangeMode m_RangeMode; [SerializeField] private RangeMode m_RangeMode;
[SerializeField] private float m_Start; [SerializeField] private float m_Start;
[SerializeField] private float m_End; [SerializeField] private float m_End;
[SerializeField] private int m_MinShowNum = 2; [SerializeField] private float m_MinZoomRatio = 0.2f;
[Range(1f, 20f)] [Range(1f, 20f)]
[SerializeField] private float m_ScrollSensitivity = 1.1f; [SerializeField] private float m_ScrollSensitivity = 1.1f;
[SerializeField] private Orient m_Orient = Orient.Horizonal; [SerializeField] private Orient m_Orient = Orient.Horizonal;
@@ -336,10 +337,19 @@ namespace XCharts.Runtime
/// Minimum number of display data. Minimum number of data displayed when DataZoom is enlarged to maximum. /// Minimum number of display data. Minimum number of data displayed when DataZoom is enlarged to maximum.
/// ||最小显示数据个数。当DataZoom放大到最大时最小显示的数据个数。 /// ||最小显示数据个数。当DataZoom放大到最大时最小显示的数据个数。
/// </summary> /// </summary>
public int minShowNum [Obsolete("Use \"minZoomRatio\" instead", true)]
public float minShowNum
{ {
get { return m_MinShowNum; } set;get;
set { if (PropertyUtil.SetStruct(ref m_MinShowNum, value)) SetVerticesDirty(); } }
/// <summary>
/// The minimum zoom ratio of dataZoom. Range 0f-1f.
/// ||缩放区域组件的最小缩放比例范围0f-1f。
/// </summary>
public float minZoomRatio
{
get { return m_MinZoomRatio; }
set { if (PropertyUtil.SetStruct(ref m_MinZoomRatio, value)) SetVerticesDirty(); }
} }
/// <summary> /// <summary>
/// The sensitivity of dataZoom scroll. /// The sensitivity of dataZoom scroll.

View File

@@ -215,7 +215,7 @@ namespace XCharts.Runtime
var grid = chart.GetGridOfDataZoom(dataZoom); var grid = chart.GetGridOfDataZoom(dataZoom);
var start = (dataZoom.context.marqueeRect.x - grid.context.x) / grid.context.width * 100; var start = (dataZoom.context.marqueeRect.x - grid.context.x) / grid.context.width * 100;
var end = (dataZoom.context.marqueeRect.x - grid.context.x + dataZoom.context.marqueeRect.width) / grid.context.width * 100; var end = (dataZoom.context.marqueeRect.x - grid.context.x + dataZoom.context.marqueeRect.width) / grid.context.width * 100;
UpdateDataZoomRange(dataZoom, start, end); UpdateDataZoomRange(dataZoom, start, end, grid);
} }
if (dataZoom.marqueeStyle.onEnd != null) if (dataZoom.marqueeStyle.onEnd != null)
{ {
@@ -271,7 +271,7 @@ namespace XCharts.Runtime
} }
var start = (startX - grid.context.x) / grid.context.width * 100; var start = (startX - grid.context.x) / grid.context.width * 100;
var end = (endX - grid.context.x) / grid.context.width * 100; var end = (endX - grid.context.x) / grid.context.width * 100;
UpdateDataZoomRange(dataZoom, start, end); UpdateDataZoomRange(dataZoom, start, end, grid);
} }
} }
@@ -294,7 +294,7 @@ namespace XCharts.Runtime
if ((dataZoom.supportInside && dataZoom.supportInsideScroll && grid.Contains(pos)) || if ((dataZoom.supportInside && dataZoom.supportInsideScroll && grid.Contains(pos)) ||
dataZoom.IsInZoom(pos)) dataZoom.IsInZoom(pos))
{ {
ScaleDataZoom(dataZoom, eventData.scrollDelta.y * dataZoom.scrollSensitivity); ScaleDataZoom(dataZoom, eventData.scrollDelta.y * dataZoom.scrollSensitivity, grid);
} }
} }
@@ -375,25 +375,27 @@ namespace XCharts.Runtime
} }
} }
private void ScaleDataZoom(DataZoom dataZoom, float delta) private void ScaleDataZoom(DataZoom dataZoom, float delta, GridCoord grid = null)
{ {
var grid = chart.GetGridOfDataZoom(dataZoom); if (grid == null) grid = chart.GetGridOfDataZoom(dataZoom);
var deltaPercent = dataZoom.orient == Orient.Horizonal ? var range = dataZoom.orient == Orient.Horizonal ? grid.context.width : grid.context.height;
Mathf.Abs(delta / grid.context.width * 100) : var deltaPercent = Mathf.Abs(delta / range * 100);
Mathf.Abs(delta / grid.context.height * 100); float start, end;
if (delta > 0) if (delta > 0)
{ {
if (dataZoom.end <= dataZoom.start) if (dataZoom.end <= dataZoom.start) return;
return; start = dataZoom.start + deltaPercent;
UpdateDataZoomRange(dataZoom, dataZoom.start + deltaPercent, dataZoom.end - deltaPercent); end = dataZoom.end - deltaPercent;
} }
else else
{ {
UpdateDataZoomRange(dataZoom, dataZoom.start - deltaPercent, dataZoom.end + deltaPercent); start = dataZoom.start - deltaPercent;
end = dataZoom.end + deltaPercent;
} }
UpdateDataZoomRange(dataZoom, start, end, grid);
} }
public void UpdateDataZoomRange(DataZoom dataZoom, float start, float end) public void UpdateDataZoomRange(DataZoom dataZoom, float start, float end, GridCoord grid = null)
{ {
if (end > 100) if (end > 100)
end = 100; end = 100;
@@ -403,13 +405,26 @@ namespace XCharts.Runtime
if (end < start) if (end < start)
end = start; end = start;
if (dataZoom.startEndFunction != null)
dataZoom.startEndFunction(ref start, ref end); if(dataZoom.minZoomRatio > 0)
{
if(grid == null) grid = chart.GetGridOfDataZoom(dataZoom);
var range = dataZoom.orient == Orient.Horizonal ? grid.context.width : grid.context.height;
var minRange = dataZoom.minZoomRatio * range;
if (end - start < minRange / range * 100)
{
return;
}
}
if (!dataZoom.startLock) if (!dataZoom.startLock)
dataZoom.start = start; dataZoom.start = start;
if (!dataZoom.endLock) if (!dataZoom.endLock)
dataZoom.end = end; dataZoom.end = end;
if (dataZoom.startEndFunction != null)
dataZoom.startEndFunction(ref start, ref end);
m_LastStart = dataZoom.start; m_LastStart = dataZoom.start;
m_LastEnd = dataZoom.end; m_LastEnd = dataZoom.end;
if (dataZoom.realtime) if (dataZoom.realtime)
@@ -444,7 +459,7 @@ namespace XCharts.Runtime
var tempPos1 = touch1.position; var tempPos1 = touch1.position;
var currDist = Vector2.Distance(tempPos0, tempPos1); var currDist = Vector2.Distance(tempPos0, tempPos1);
var lastDist = Vector2.Distance(m_LastTouchPos0, m_LastTouchPos1); var lastDist = Vector2.Distance(m_LastTouchPos0, m_LastTouchPos1);
var delta = (currDist - lastDist); var delta = currDist - lastDist;
ScaleDataZoom(dataZoom, delta / dataZoom.scrollSensitivity); ScaleDataZoom(dataZoom, delta / dataZoom.scrollSensitivity);
m_LastTouchPos0 = tempPos0; m_LastTouchPos0 = tempPos0;
m_LastTouchPos1 = tempPos1; m_LastTouchPos1 = tempPos1;
@@ -492,7 +507,6 @@ namespace XCharts.Runtime
} }
else if (xAxis.IsTime()) else if (xAxis.IsTime())
{ {
//TODO:
dataZoom.SetStartLabelText(""); dataZoom.SetStartLabelText("");
dataZoom.SetEndLabelText(""); dataZoom.SetEndLabelText("");
} }

View File

@@ -833,13 +833,14 @@ namespace XCharts.Runtime
var data = serie.data; var data = serie.data;
var startValue = min; var startValue = min;
var endValue = max; var endValue = max;
var minZoomRatio = (int)((max-min) * dataZoom.minZoomRatio);
if (endValue < startValue) endValue = startValue; if (endValue < startValue) endValue = startValue;
if (startValue != serie.m_FilterStartValue || endValue != serie.m_FilterEndValue || if (startValue != serie.m_FilterStartValue || endValue != serie.m_FilterEndValue ||
dataZoom.minShowNum != serie.m_FilterMinShow || serie.m_NeedUpdateFilterData) dataZoom.minZoomRatio != serie.m_FilterMinShow || serie.m_NeedUpdateFilterData)
{ {
serie.m_FilterStartValue = startValue; serie.m_FilterStartValue = startValue;
serie.m_FilterEndValue = endValue; serie.m_FilterEndValue = endValue;
serie.m_FilterMinShow = dataZoom.minShowNum; serie.m_FilterMinShow = minZoomRatio;
serie.m_NeedUpdateFilterData = false; serie.m_NeedUpdateFilterData = false;
if (ReferenceEquals(serie.m_FilterData, data)) if (ReferenceEquals(serie.m_FilterData, data))
@@ -883,19 +884,20 @@ namespace XCharts.Runtime
end = start + range; end = start + range;
if (end > data.Count) end = data.Count; if (end > data.Count) end = data.Count;
} }
var minZoomRatio = (int)(data.Count * dataZoom.minZoomRatio);
if (start != serie.m_FilterStart || end != serie.m_FilterEnd || if (start != serie.m_FilterStart || end != serie.m_FilterEnd ||
dataZoom.minShowNum != serie.m_FilterMinShow || serie.m_NeedUpdateFilterData) minZoomRatio != serie.m_FilterMinShow || serie.m_NeedUpdateFilterData)
{ {
serie.m_FilterStart = start; serie.m_FilterStart = start;
serie.m_FilterEnd = end; serie.m_FilterEnd = end;
serie.m_FilterMinShow = dataZoom.minShowNum; serie.m_FilterMinShow = minZoomRatio;
serie.m_NeedUpdateFilterData = false; serie.m_NeedUpdateFilterData = false;
if (data.Count > 0) if (data.Count > 0)
{ {
if (range < dataZoom.minShowNum) if (range < minZoomRatio)
{ {
if (dataZoom.minShowNum > data.Count) range = data.Count; if (minZoomRatio > data.Count) range = data.Count;
else range = dataZoom.minShowNum; else range = minZoomRatio;
} }
if (range > data.Count - start) if (range > data.Count - start)
start = data.Count - range; start = data.Count - range;