增加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

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using UnityEngine;
@@ -81,7 +82,7 @@ namespace XCharts.Runtime
[SerializeField] private RangeMode m_RangeMode;
[SerializeField] private float m_Start;
[SerializeField] private float m_End;
[SerializeField] private int m_MinShowNum = 2;
[SerializeField] private float m_MinZoomRatio = 0.2f;
[Range(1f, 20f)]
[SerializeField] private float m_ScrollSensitivity = 1.1f;
[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.
/// ||最小显示数据个数。当DataZoom放大到最大时最小显示的数据个数。
/// </summary>
public int minShowNum
[Obsolete("Use \"minZoomRatio\" instead", true)]
public float minShowNum
{
get { return m_MinShowNum; }
set { if (PropertyUtil.SetStruct(ref m_MinShowNum, value)) SetVerticesDirty(); }
set;get;
}
/// <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>
/// The sensitivity of dataZoom scroll.

View File

@@ -215,7 +215,7 @@ namespace XCharts.Runtime
var grid = chart.GetGridOfDataZoom(dataZoom);
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;
UpdateDataZoomRange(dataZoom, start, end);
UpdateDataZoomRange(dataZoom, start, end, grid);
}
if (dataZoom.marqueeStyle.onEnd != null)
{
@@ -271,7 +271,7 @@ namespace XCharts.Runtime
}
var start = (startX - 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)) ||
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);
var deltaPercent = dataZoom.orient == Orient.Horizonal ?
Mathf.Abs(delta / grid.context.width * 100) :
Mathf.Abs(delta / grid.context.height * 100);
if (grid == null) grid = chart.GetGridOfDataZoom(dataZoom);
var range = dataZoom.orient == Orient.Horizonal ? grid.context.width : grid.context.height;
var deltaPercent = Mathf.Abs(delta / range * 100);
float start, end;
if (delta > 0)
{
if (dataZoom.end <= dataZoom.start)
return;
UpdateDataZoomRange(dataZoom, dataZoom.start + deltaPercent, dataZoom.end - deltaPercent);
if (dataZoom.end <= dataZoom.start) return;
start = dataZoom.start + deltaPercent;
end = dataZoom.end - deltaPercent;
}
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)
end = 100;
@@ -403,13 +405,26 @@ namespace XCharts.Runtime
if (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)
dataZoom.start = start;
if (!dataZoom.endLock)
dataZoom.end = end;
if (dataZoom.startEndFunction != null)
dataZoom.startEndFunction(ref start, ref end);
m_LastStart = dataZoom.start;
m_LastEnd = dataZoom.end;
if (dataZoom.realtime)
@@ -444,7 +459,7 @@ namespace XCharts.Runtime
var tempPos1 = touch1.position;
var currDist = Vector2.Distance(tempPos0, tempPos1);
var lastDist = Vector2.Distance(m_LastTouchPos0, m_LastTouchPos1);
var delta = (currDist - lastDist);
var delta = currDist - lastDist;
ScaleDataZoom(dataZoom, delta / dataZoom.scrollSensitivity);
m_LastTouchPos0 = tempPos0;
m_LastTouchPos1 = tempPos1;
@@ -492,7 +507,6 @@ namespace XCharts.Runtime
}
else if (xAxis.IsTime())
{
//TODO:
dataZoom.SetStartLabelText("");
dataZoom.SetEndLabelText("");
}