mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-14 20:00:09 +00:00
[add][VisualMap] add workOnLine and workOnArea (#191)
This commit is contained in:
@@ -50,6 +50,8 @@
|
|||||||
|
|
||||||
## master
|
## master
|
||||||
|
|
||||||
|
* (2022.04.13) 增加`VisualMap`的`workOnLine`和`workOnArea`以支持是对折线还是区域映射的功能 #191
|
||||||
|
* (2022.04.12) 优化`Radar`支持`Area`区域触发`Tooltip`
|
||||||
* (2022.04.09) 优化`VisualMap`
|
* (2022.04.09) 优化`VisualMap`
|
||||||
* (2022.04.09) 优化`Tooltip`
|
* (2022.04.09) 优化`Tooltip`
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ namespace XCharts.Editor
|
|||||||
PropertyField("m_Max");
|
PropertyField("m_Max");
|
||||||
PropertyField("m_SplitNumber");
|
PropertyField("m_SplitNumber");
|
||||||
PropertyField("m_Dimension");
|
PropertyField("m_Dimension");
|
||||||
|
PropertyField("m_WorkOnLine");
|
||||||
|
PropertyField("m_WorkOnArea");
|
||||||
PropertyField("m_ShowUI");
|
PropertyField("m_ShowUI");
|
||||||
if (baseProperty.FindPropertyRelative("m_ShowUI").boolValue)
|
if (baseProperty.FindPropertyRelative("m_ShowUI").boolValue)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -98,6 +98,9 @@ namespace XCharts.Runtime
|
|||||||
[SerializeField] private bool m_AutoMinMax = true;
|
[SerializeField] private bool m_AutoMinMax = true;
|
||||||
[SerializeField] private Orient m_Orient = Orient.Horizonal;
|
[SerializeField] private Orient m_Orient = Orient.Horizonal;
|
||||||
[SerializeField] private Location m_Location = Location.defaultLeft;
|
[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_InRange = new List<Color32>();
|
||||||
[SerializeField] private List<Color32> m_OutOfRange = new List<Color32>() { Color.gray };
|
[SerializeField] private List<Color32> m_OutOfRange = new List<Color32>() { Color.gray };
|
||||||
[SerializeField] private List<VisualMapPieces> m_Pieces = new List<VisualMapPieces>();
|
[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(); }
|
set { if (PropertyUtil.SetClass(ref m_Location, value)) SetVerticesDirty(); }
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <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.
|
/// Defines the visual color in the selected range.
|
||||||
/// |定义 在选中范围中 的视觉颜色。
|
/// |定义 在选中范围中 的视觉颜色。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -147,12 +147,30 @@ namespace XCharts.Runtime
|
|||||||
{
|
{
|
||||||
if (visualMap == null)
|
if (visualMap == null)
|
||||||
return false;
|
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;
|
return false;
|
||||||
|
|
||||||
if (visualMap.inRange.Count <= 0 && visualMap.pieces.Count <= 0)
|
if (visualMap.inRange.Count <= 0 && visualMap.pieces.Count <= 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -349,7 +349,7 @@ namespace XCharts.Runtime
|
|||||||
|
|
||||||
VisualMapHelper.AutoSetLineMinMax(visualMap, serie, isY, axis, relativedAxis);
|
VisualMapHelper.AutoSetLineMinMax(visualMap, serie, isY, axis, relativedAxis);
|
||||||
LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, visualMap, lineWidth, isY);
|
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);
|
LineHelper.DrawSerieLine(vh, chart.theme, serie, visualMap, m_SerieGrid, axis, relativedAxis, lineWidth);
|
||||||
|
|
||||||
serie.context.vertCount = vh.currentVertCount;
|
serie.context.vertCount = vh.currentVertCount;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ namespace XCharts.Runtime
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void DrawSerieLineArea(VertexHelper vh, Serie serie, Serie lastStackSerie,
|
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)
|
if (serie.areaStyle == null || !serie.areaStyle.show)
|
||||||
return;
|
return;
|
||||||
@@ -33,26 +33,32 @@ namespace XCharts.Runtime
|
|||||||
var gridXY = (isY ? grid.context.x : grid.context.y);
|
var gridXY = (isY ? grid.context.x : grid.context.y);
|
||||||
if (lastStackSerie == null)
|
if (lastStackSerie == null)
|
||||||
{
|
{
|
||||||
LineHelper.DrawSerieLineNormalArea(vh, serie, isY,
|
DrawSerieLineNormalArea(vh, serie, isY,
|
||||||
gridXY + relativedAxis.context.offset,
|
gridXY + relativedAxis.context.offset,
|
||||||
gridXY,
|
gridXY,
|
||||||
gridXY + (isY ? grid.context.width : grid.context.height),
|
gridXY + (isY ? grid.context.width : grid.context.height),
|
||||||
srcAreaColor,
|
srcAreaColor,
|
||||||
srcAreaToColor);
|
srcAreaToColor,
|
||||||
|
visualMap,
|
||||||
|
axis,
|
||||||
|
relativedAxis,
|
||||||
|
grid);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LineHelper.DrawSerieLineStackArea(vh, serie, lastStackSerie, isY,
|
DrawSerieLineStackArea(vh, serie, lastStackSerie, isY,
|
||||||
gridXY + relativedAxis.context.offset,
|
gridXY + relativedAxis.context.offset,
|
||||||
gridXY,
|
gridXY,
|
||||||
gridXY + (isY ? grid.context.width : grid.context.height),
|
gridXY + (isY ? grid.context.width : grid.context.height),
|
||||||
srcAreaColor,
|
srcAreaColor,
|
||||||
srcAreaToColor);
|
srcAreaToColor,
|
||||||
|
visualMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void DrawSerieLineNormalArea(VertexHelper vh, Serie serie, bool isY,
|
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 points = serie.context.drawPoints;
|
||||||
var count = points.Count;
|
var count = points.Count;
|
||||||
@@ -61,7 +67,8 @@ namespace XCharts.Runtime
|
|||||||
|
|
||||||
var isBreak = false;
|
var isBreak = false;
|
||||||
var lp = Vector3.zero;
|
var lp = Vector3.zero;
|
||||||
var lerp = !ChartHelper.IsValueEqualsColor(color, toColor);
|
var isVisualMapGradient = VisualMapHelper.IsNeedAreaGradient(visualMap);
|
||||||
|
var areaLerp = !ChartHelper.IsValueEqualsColor(areaColor, areaToColor);
|
||||||
var zsp = isY
|
var zsp = isY
|
||||||
? new Vector3(zero, points[0].position.y)
|
? new Vector3(zero, points[0].position.y)
|
||||||
: new Vector3(points[0].position.x, zero);
|
: new Vector3(points[0].position.x, zero);
|
||||||
@@ -74,6 +81,9 @@ namespace XCharts.Runtime
|
|||||||
{
|
{
|
||||||
var tp = points[i].position;
|
var tp = points[i].position;
|
||||||
var isIgnore = points[i].isIgnoreBreak;
|
var isIgnore = points[i].isIgnoreBreak;
|
||||||
|
var color = areaColor;
|
||||||
|
var toColor = areaToColor;
|
||||||
|
var lerp = areaLerp;
|
||||||
|
|
||||||
if (serie.animation.CheckDetailBreak(tp, isY))
|
if (serie.animation.CheckDetailBreak(tp, isY))
|
||||||
{
|
{
|
||||||
@@ -87,6 +97,12 @@ namespace XCharts.Runtime
|
|||||||
if (UGLHelper.GetIntersection(lp, tp, axisStartPos, axisEndPos, ref ip))
|
if (UGLHelper.GetIntersection(lp, tp, axisStartPos, axisEndPos, ref ip))
|
||||||
tp = 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);
|
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,
|
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)
|
if (lastStackSerie == null)
|
||||||
return;
|
return;
|
||||||
@@ -243,7 +259,7 @@ namespace XCharts.Runtime
|
|||||||
|
|
||||||
var isBreak = false;
|
var isBreak = false;
|
||||||
var isY = axis is YAxis;
|
var isY = axis is YAxis;
|
||||||
var isVisualMapGradient = VisualMapHelper.IsNeedGradient(visualMap);
|
var isVisualMapGradient = VisualMapHelper.IsNeedLineGradient(visualMap);
|
||||||
var isLineStyleGradient = serie.lineStyle.IsNeedGradient();
|
var isLineStyleGradient = serie.lineStyle.IsNeedGradient();
|
||||||
|
|
||||||
//var highlight = serie.highlight || serie.context.pointerEnter;
|
//var highlight = serie.highlight || serie.context.pointerEnter;
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ namespace XCharts.Runtime
|
|||||||
serie.animation.InitProgress(serie.context.dataPoints, isY);
|
serie.animation.InitProgress(serie.context.dataPoints, isY);
|
||||||
|
|
||||||
LineHelper.UpdateSerieDrawPoints(serie, chart.settings, chart.theme, null, lineWidth, 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);
|
LineHelper.DrawSerieLine(vh, chart.theme, serie, null, m_SerieGrid, axis, relativedAxis, lineWidth);
|
||||||
|
|
||||||
serie.context.vertCount = vh.currentVertCount;
|
serie.context.vertCount = vh.currentVertCount;
|
||||||
|
|||||||
Reference in New Issue
Block a user