From 73af4bf764d284de9c2b5d1eb53df6d2cf1da10c Mon Sep 17 00:00:00 2001 From: sushuang Date: Sun, 30 Dec 2018 05:00:47 +0800 Subject: [PATCH] Fix #9657 (label is not always at center when pie label position 'center') --- src/chart/pie/labelLayout.js | 33 ++++---- test/pie-label.html | 148 +++++++++++++++++++++++++++++++++++ test/tmp-base.html | 4 +- 3 files changed, 168 insertions(+), 17 deletions(-) create mode 100644 test/pie-label.html diff --git a/src/chart/pie/labelLayout.js b/src/chart/pie/labelLayout.js index e0b69b8f49..324467363b 100644 --- a/src/chart/pie/labelLayout.js +++ b/src/chart/pie/labelLayout.js @@ -26,7 +26,6 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) { return a.y - b.y; }); - // 压 function shiftDown(start, end, delta, dir) { for (var j = start; j < end; j++) { list[j].y += delta; @@ -42,7 +41,6 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) { shiftUp(end - 1, delta / 2); } - // 弹 function shiftUp(end, delta) { for (var j = end; j >= 0; j--) { list[j].y -= delta; @@ -56,18 +54,14 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) { function changeX(list, isDownList, cx, cy, r, dir) { var lastDeltaX = dir > 0 - ? isDownList // 右侧 - ? Number.MAX_VALUE // 下 - : 0 // 上 - : isDownList // 左侧 - ? Number.MAX_VALUE // 下 - : 0; // 上 + ? isDownList // right-side + ? Number.MAX_VALUE // down + : 0 // up + : isDownList // left-side + ? Number.MAX_VALUE // down + : 0; // up for (var i = 0, l = list.length; i < l; i++) { - // Not change x for center label - if (list[i].position === 'center') { - continue; - } var deltaY = Math.abs(list[i].y - cy); var length = list[i].len; var length2 = list[i].len2; @@ -78,11 +72,11 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) { ) : Math.abs(list[i].x - cx); if (isDownList && deltaX >= lastDeltaX) { - // 右下,左下 + // right-down, left-down deltaX = lastDeltaX - 10; } if (!isDownList && deltaX <= lastDeltaX) { - // 右上,左上 + // right-up, left-up deltaX = lastDeltaX + 10; } @@ -122,6 +116,9 @@ function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) { var leftList = []; var rightList = []; for (var i = 0; i < labelLayoutList.length; i++) { + if (isPositionCenter(labelLayoutList[i])) { + continue; + } if (labelLayoutList[i].x < cx) { leftList.push(labelLayoutList[i]); } @@ -134,6 +131,9 @@ function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) { adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight); for (var i = 0; i < labelLayoutList.length; i++) { + if (isPositionCenter(labelLayoutList[i])) { + continue; + } var linePoints = labelLayoutList[i].linePoints; if (linePoints) { var dist = linePoints[1][0] - linePoints[2][0]; @@ -149,6 +149,11 @@ function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) { } } +function isPositionCenter(layout) { + // Not change x for center label + return layout.position === 'center'; +} + export default function (seriesModel, r, viewWidth, viewHeight) { var data = seriesModel.getData(); var labelLayoutList = []; diff --git a/test/pie-label.html b/test/pie-label.html new file mode 100644 index 0000000000..332b53ea8b --- /dev/null +++ b/test/pie-label.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/test/tmp-base.html b/test/tmp-base.html index 3f3693c87d..fb3a3ba75e 100644 --- a/test/tmp-base.html +++ b/test/tmp-base.html @@ -44,8 +44,6 @@