0%

ECharts源码解析之focusNodeAdjacency

版本:V4.6.0

API介绍

[focusNodeAdjacency](https://echarts.apache.org/zh/option.html# series-graph.focusNodeAdjacency):主要在关系图及桑基图中应用,表示是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点。具体操作为修改其余节点的透明度。

背景

设计师认为突出节点时其余点透明度过低,使用该API发现无法修改被忽略节点及连线的透明度。

源码

Path: /src/chart/sankey/SankeyView.js/src/chart/graph/GraphView.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/**
*
* 隐藏对象
* @param {*} item 要隐藏的对象
* @param {*} opacityPath 获取透明度属性的路径
* @param {*} opacityRatio 透明度比例
*/
function fadeOutItem(item, opacityPath, opacityRatio) {
var el = item.getGraphicEl();
// 根据路径获取透明度
var opacity = getItemOpacity(item, opacityPath);

// 计算新的透明度
if (opacityRatio != null) {
opacity == null && (opacity = 1);
opacity *= opacityRatio;
}

el.downplay && el.downplay();
// 写入样式
el.traverse(function (child) {
if (!child.isGroup) {
var opct = child.lineLabelOriginalOpacity;
if (opct == null || opacityRatio != null) {
opct = opacity;
}
child.setStyle('opacity', opct);
}
});
}
/**
*
* 显示对象
* @param {*} item 要显示的对象
* @param {*} opacityPath 获取透明度属性的路径
*/
function fadeInItem(item, opacityPath) {
// 这里获取了对象原本的透明度
var opacity = getItemOpacity(item, opacityPath);
var el = item.getGraphicEl();
// Should go back to normal opacity first, consider hoverLayer,
// where current state is copied to elMirror, and support
// emphasis opacity here.
el.traverse(function (child) {
!child.isGroup && child.setStyle('opacity', opacity);
});
el.highlight && el.highlight();
}
/**
* 聚焦节点及邻接
*
* @param {*} seriesModel:ExtendedClass
* @param {*} ecModel:ExtendedClass
* @param {*} api:ExtensionAPI
* @param {*} payload:Object
* @returns
*/
focusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
var data = seriesModel.getData();
var graph = data.graph;
var dataIndex = payload.dataIndex;
var edgeDataIndex = payload.edgeDataIndex;

var node = graph.getNodeByIndex(dataIndex);
var edge = graph.getEdgeByIndex(edgeDataIndex);

if (!node && !edge) {
return;
}

// 隐藏所有Node对象
graph.eachNode(function (node) {
// 这里调了一个 MagicNumber 0.1 所以真的无法修改
fadeOutItem(node, nodeOpacityPath, 0.1);
});
// 隐藏所有Edge对象
graph.eachEdge(function (edge) {
fadeOutItem(edge, lineOpacityPath, 0.1);
});


if (node) {
fadeInItem(node, hoverNodeOpacityPath);
var focusNodeAdj = itemModel.get('focusNodeAdjacency');
// 这里根据输入的参数分了几种情况 对 选中的节点恢复原本的透明度
if (focusNodeAdj === 'outEdges') {
zrUtil.each(node.outEdges, function (edge) {
if (edge.dataIndex < 0) {
return;
}
// 显示对象
fadeInItem(edge, hoverLineOpacityPath);
fadeInItem(edge.node2, hoverNodeOpacityPath);
});
}
else if (focusNodeAdj === 'inEdges') {
zrUtil.each(node.inEdges, function (edge) {
if (edge.dataIndex < 0) {
return;
}
fadeInItem(edge, hoverLineOpacityPath);
fadeInItem(edge.node1, hoverNodeOpacityPath);
});
}
else if (focusNodeAdj === 'allEdges') {
zrUtil.each(node.edges, function (edge) {
if (edge.dataIndex < 0) {
return;
}
fadeInItem(edge, hoverLineOpacityPath);
(edge.node1 !== node) && fadeInItem(edge.node1, hoverNodeOpacityPath);
(edge.node2 !== node) && fadeInItem(edge.node2, hoverNodeOpacityPath);
});
}
}
if (edge) {
fadeInItem(edge, hoverLineOpacityPath);
fadeInItem(edge.node1, hoverNodeOpacityPath);
fadeInItem(edge.node2, hoverNodeOpacityPath);
}
}

小结

由于魔数的存在所以真的无法修改。