[add][VisualMap] add workOnLine and workOnArea (#191)

This commit is contained in:
monitor1394
2022-04-13 22:03:23 +08:00
parent ad273cf1b1
commit d44bf55a87
7 changed files with 73 additions and 14 deletions

View File

@@ -50,6 +50,8 @@
## master
* (2022.04.13) 增加`VisualMap``workOnLine``workOnArea`以支持是对折线还是区域映射的功能 #191
* (2022.04.12) 优化`Radar`支持`Area`区域触发`Tooltip`
* (2022.04.09) 优化`VisualMap`
* (2022.04.09) 优化`Tooltip`

View File

@@ -20,6 +20,8 @@ namespace XCharts.Editor
PropertyField("m_Max");
PropertyField("m_SplitNumber");
PropertyField("m_Dimension");
PropertyField("m_WorkOnLine");
PropertyField("m_WorkOnArea");
PropertyField("m_ShowUI");
if (baseProperty.FindPropertyRelative("m_ShowUI").boolValue)
{

View File

@@ -98,6 +98,9 @@ namespace XCharts.Runtime
[SerializeField] private bool m_AutoMinMax = true;
[SerializeField] private Orient m_Orient = Orient.Horizonal;
[SerializeField] private Location m_Location = Location.defaultLeft;
[SerializeField] private bool m_WorkOnLine = true;
[SerializeField] private bool m_WorkOnArea = false;
[SerializeField] private List<Color32> m_InRange = new List<Color32>();
[SerializeField] private List<Color32> m_OutOfRange = new List<Color32>() { Color.gray };
[SerializeField] private List<VisualMapPieces> m_Pieces = new List<VisualMapPieces>();
@@ -310,6 +313,24 @@ namespace XCharts.Runtime
set { if (PropertyUtil.SetClass(ref m_Location, value)) SetVerticesDirty(); }
}
/// <summary>
/// Whether the visualmap is work on linestyle of linechart.
/// |组件是否对LineChart的LineStyle有效。
/// </summary>
public bool workOnLine
{
get { return m_WorkOnLine; }
set { if (PropertyUtil.SetStruct(ref m_WorkOnLine, value)) SetVerticesDirty(); }
}
/// <summary>
/// Whether the visualmap is work on areaStyle of linechart.
/// |组件是否对LineChart的AreaStyle有效。
/// </summary>
public bool workOnArea
{
get { return m_WorkOnArea; }
set { if (PropertyUtil.SetStruct(ref m_WorkOnArea, value)) SetVerticesDirty(); }
}
/// <summary>
/// Defines the visual color in the selected range.
/// |定义 在选中范围中 的视觉颜色。
/// </summary>

View File

@@ -147,12 +147,30 @@ namespace XCharts.Runtime
{
if (visualMap == null)
return false;
if (!visualMap.show)
if (!visualMap.show || (!visualMap.workOnLine && !visualMap.workOnArea))
return false;
if (visualMap.inRange.Count <= 0 && visualMap.pieces.Count <= 0)
return false;
return true;
}
public static bool IsNeedLineGradient(VisualMap visualMap)
{
if (visualMap == null)
return false;
if (!visualMap.show || !visualMap.workOnLine)
return false;
if (visualMap.inRange.Count <= 0 && visualMap.pieces.Count <= 0)
return false;
return true;
}
public static bool IsNeedAreaGradient(VisualMap visualMap)
{
if (visualMap == null)
return false;
if (!visualMap.show || !visualMap.workOnArea)
return false;
if (visualMap.inRange.Count <= 0 && visualMap.pieces.Count <= 0)
return false;
return true;
}

View File

@@ -349,7 +349,7 @@ namespace XCharts.Runtime
VisualMapHelper.AutoSetLineMinMax(visualMap, serie, isY, axis, relativedAxis);
LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, visualMap, lineWidth, isY);
LineHelper.DrawSerieLineArea(vh, serie, lastSerie, chart.theme, isY, axis, relativedAxis, m_SerieGrid);
LineHelper.DrawSerieLineArea(vh, serie, lastSerie, chart.theme, visualMap, isY, axis, relativedAxis, m_SerieGrid);
LineHelper.DrawSerieLine(vh, chart.theme, serie, visualMap, m_SerieGrid, axis, relativedAxis, lineWidth);
serie.context.vertCount = vh.currentVertCount;

View File

@@ -23,7 +23,7 @@ namespace XCharts.Runtime
}
public static void DrawSerieLineArea(VertexHelper vh, Serie serie, Serie lastStackSerie,
ThemeStyle theme, bool isY, Axis axis, Axis relativedAxis, GridCoord grid)
ThemeStyle theme, VisualMap visualMap, bool isY, Axis axis, Axis relativedAxis, GridCoord grid)
{
if (serie.areaStyle == null || !serie.areaStyle.show)
return;
@@ -33,26 +33,32 @@ namespace XCharts.Runtime
var gridXY = (isY ? grid.context.x : grid.context.y);
if (lastStackSerie == null)
{
LineHelper.DrawSerieLineNormalArea(vh, serie, isY,
DrawSerieLineNormalArea(vh, serie, isY,
gridXY + relativedAxis.context.offset,
gridXY,
gridXY + (isY ? grid.context.width : grid.context.height),
srcAreaColor,
srcAreaToColor);
srcAreaToColor,
visualMap,
axis,
relativedAxis,
grid);
}
else
{
LineHelper.DrawSerieLineStackArea(vh, serie, lastStackSerie, isY,
DrawSerieLineStackArea(vh, serie, lastStackSerie, isY,
gridXY + relativedAxis.context.offset,
gridXY,
gridXY + (isY ? grid.context.width : grid.context.height),
srcAreaColor,
srcAreaToColor);
srcAreaToColor,
visualMap);
}
}
private static void DrawSerieLineNormalArea(VertexHelper vh, Serie serie, bool isY,
float zero, float min, float max, Color32 color, Color32 toColor)
float zero, float min, float max, Color32 areaColor, Color32 areaToColor,
VisualMap visualMap, Axis axis, Axis relativedAxis, GridCoord grid)
{
var points = serie.context.drawPoints;
var count = points.Count;
@@ -61,7 +67,8 @@ namespace XCharts.Runtime
var isBreak = false;
var lp = Vector3.zero;
var lerp = !ChartHelper.IsValueEqualsColor(color, toColor);
var isVisualMapGradient = VisualMapHelper.IsNeedAreaGradient(visualMap);
var areaLerp = !ChartHelper.IsValueEqualsColor(areaColor, areaToColor);
var zsp = isY
? new Vector3(zero, points[0].position.y)
: new Vector3(points[0].position.x, zero);
@@ -74,6 +81,9 @@ namespace XCharts.Runtime
{
var tp = points[i].position;
var isIgnore = points[i].isIgnoreBreak;
var color = areaColor;
var toColor = areaToColor;
var lerp = areaLerp;
if (serie.animation.CheckDetailBreak(tp, isY))
{
@@ -87,6 +97,12 @@ namespace XCharts.Runtime
if (UGLHelper.GetIntersection(lp, tp, axisStartPos, axisEndPos, ref ip))
tp = ip;
}
if (isVisualMapGradient)
{
color = VisualMapHelper.GetLineGradientColor(visualMap, tp, grid, axis, relativedAxis, areaColor);
toColor = color;
lerp = false;
}
var zp = isY ? new Vector3(zero, tp.y) : new Vector3(tp.x, zero);
@@ -133,7 +149,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)
float zero, float min, float max, Color32 color, Color32 toColor, VisualMap visualMap)
{
if (lastStackSerie == null)
return;
@@ -243,7 +259,7 @@ namespace XCharts.Runtime
var isBreak = false;
var isY = axis is YAxis;
var isVisualMapGradient = VisualMapHelper.IsNeedGradient(visualMap);
var isVisualMapGradient = VisualMapHelper.IsNeedLineGradient(visualMap);
var isLineStyleGradient = serie.lineStyle.IsNeedGradient();
//var highlight = serie.highlight || serie.context.pointerEnter;

View File

@@ -239,7 +239,7 @@ namespace XCharts.Runtime
serie.animation.InitProgress(serie.context.dataPoints, isY);
LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, null, lineWidth, isY);
LineHelper.DrawSerieLineArea(vh, serie, null, chart.theme, isY, axis, relativedAxis, m_SerieGrid);
LineHelper.DrawSerieLineArea(vh, serie, null, chart.theme, null, isY, axis, relativedAxis, m_SerieGrid);
LineHelper.DrawSerieLine(vh, chart.theme, serie, null, m_SerieGrid, axis, relativedAxis, lineWidth);
serie.context.vertCount = vh.currentVertCount;