GaugeView.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. /**
  20. * AUTO-GENERATED FILE. DO NOT MODIFY.
  21. */
  22. /*
  23. * Licensed to the Apache Software Foundation (ASF) under one
  24. * or more contributor license agreements. See the NOTICE file
  25. * distributed with this work for additional information
  26. * regarding copyright ownership. The ASF licenses this file
  27. * to you under the Apache License, Version 2.0 (the
  28. * "License"); you may not use this file except in compliance
  29. * with the License. You may obtain a copy of the License at
  30. *
  31. * http://www.apache.org/licenses/LICENSE-2.0
  32. *
  33. * Unless required by applicable law or agreed to in writing,
  34. * software distributed under the License is distributed on an
  35. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  36. * KIND, either express or implied. See the License for the
  37. * specific language governing permissions and limitations
  38. * under the License.
  39. */
  40. import { __extends } from "tslib";
  41. import PointerPath from './PointerPath.js';
  42. import * as graphic from '../../util/graphic.js';
  43. import { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';
  44. import { createTextStyle, setLabelValueAnimation, animateLabelValue } from '../../label/labelStyle.js';
  45. import ChartView from '../../view/Chart.js';
  46. import { parsePercent, round, linearMap, DEFAULT_PRECISION_FOR_ROUNDING_ERROR } from '../../util/number.js';
  47. import Sausage from '../../util/shape/sausage.js';
  48. import { createSymbol } from '../../util/symbol.js';
  49. import ZRImage from 'zrender/lib/graphic/Image.js';
  50. import { extend, isFunction, isString, isNumber, each } from 'zrender/lib/core/util.js';
  51. import { setCommonECData } from '../../util/innerStore.js';
  52. import { normalizeArcAngles } from 'zrender/lib/core/PathProxy.js';
  53. function parsePosition(seriesModel, api) {
  54. var center = seriesModel.get('center');
  55. var width = api.getWidth();
  56. var height = api.getHeight();
  57. var size = Math.min(width, height);
  58. var cx = parsePercent(center[0], api.getWidth());
  59. var cy = parsePercent(center[1], api.getHeight());
  60. var r = parsePercent(seriesModel.get('radius'), size / 2);
  61. return {
  62. cx: cx,
  63. cy: cy,
  64. r: r
  65. };
  66. }
  67. function formatLabel(value, labelFormatter) {
  68. var label = value == null ? '' : value + '';
  69. if (labelFormatter) {
  70. if (isString(labelFormatter)) {
  71. label = labelFormatter.replace('{value}', label);
  72. } else if (isFunction(labelFormatter)) {
  73. label = labelFormatter(value);
  74. }
  75. }
  76. return label;
  77. }
  78. var GaugeView = /** @class */function (_super) {
  79. __extends(GaugeView, _super);
  80. function GaugeView() {
  81. var _this = _super !== null && _super.apply(this, arguments) || this;
  82. _this.type = GaugeView.type;
  83. return _this;
  84. }
  85. GaugeView.prototype.render = function (seriesModel, ecModel, api) {
  86. this.group.removeAll();
  87. var colorList = seriesModel.get(['axisLine', 'lineStyle', 'color']);
  88. var posInfo = parsePosition(seriesModel, api);
  89. this._renderMain(seriesModel, ecModel, api, colorList, posInfo);
  90. this._data = seriesModel.getData();
  91. };
  92. GaugeView.prototype.dispose = function () {};
  93. GaugeView.prototype._renderMain = function (seriesModel, ecModel, api, colorList, posInfo) {
  94. var group = this.group;
  95. var clockwise = seriesModel.get('clockwise');
  96. var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI;
  97. var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI;
  98. var axisLineModel = seriesModel.getModel('axisLine');
  99. var roundCap = axisLineModel.get('roundCap');
  100. var MainPath = roundCap ? Sausage : graphic.Sector;
  101. var showAxis = axisLineModel.get('show');
  102. var lineStyleModel = axisLineModel.getModel('lineStyle');
  103. var axisLineWidth = lineStyleModel.get('width');
  104. var angles = [startAngle, endAngle];
  105. normalizeArcAngles(angles, !clockwise);
  106. startAngle = angles[0];
  107. endAngle = angles[1];
  108. var angleRangeSpan = endAngle - startAngle;
  109. var prevEndAngle = startAngle;
  110. var sectors = [];
  111. for (var i = 0; showAxis && i < colorList.length; i++) {
  112. // Clamp
  113. var percent = Math.min(Math.max(colorList[i][0], 0), 1);
  114. endAngle = startAngle + angleRangeSpan * percent;
  115. var sector = new MainPath({
  116. shape: {
  117. startAngle: prevEndAngle,
  118. endAngle: endAngle,
  119. cx: posInfo.cx,
  120. cy: posInfo.cy,
  121. clockwise: clockwise,
  122. r0: posInfo.r - axisLineWidth,
  123. r: posInfo.r
  124. },
  125. silent: true
  126. });
  127. sector.setStyle({
  128. fill: colorList[i][1]
  129. });
  130. sector.setStyle(lineStyleModel.getLineStyle(
  131. // Because we use sector to simulate arc
  132. // so the properties for stroking are useless
  133. ['color', 'width']));
  134. sectors.push(sector);
  135. prevEndAngle = endAngle;
  136. }
  137. sectors.reverse();
  138. each(sectors, function (sector) {
  139. return group.add(sector);
  140. });
  141. var getColor = function (percent) {
  142. // Less than 0
  143. if (percent <= 0) {
  144. return colorList[0][1];
  145. }
  146. var i;
  147. for (i = 0; i < colorList.length; i++) {
  148. if (colorList[i][0] >= percent && (i === 0 ? 0 : colorList[i - 1][0]) < percent) {
  149. return colorList[i][1];
  150. }
  151. }
  152. // More than 1
  153. return colorList[i - 1][1];
  154. };
  155. this._renderTicks(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth);
  156. this._renderTitleAndDetail(seriesModel, ecModel, api, getColor, posInfo);
  157. this._renderAnchor(seriesModel, posInfo);
  158. this._renderPointer(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth);
  159. };
  160. GaugeView.prototype._renderTicks = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) {
  161. var group = this.group;
  162. var cx = posInfo.cx;
  163. var cy = posInfo.cy;
  164. var r = posInfo.r;
  165. var minVal = +seriesModel.get('min');
  166. var maxVal = +seriesModel.get('max');
  167. var splitLineModel = seriesModel.getModel('splitLine');
  168. var tickModel = seriesModel.getModel('axisTick');
  169. var labelModel = seriesModel.getModel('axisLabel');
  170. var splitNumber = seriesModel.get('splitNumber');
  171. var subSplitNumber = tickModel.get('splitNumber');
  172. var splitLineLen = parsePercent(splitLineModel.get('length'), r);
  173. var tickLen = parsePercent(tickModel.get('length'), r);
  174. var angle = startAngle;
  175. var step = (endAngle - startAngle) / splitNumber;
  176. var subStep = step / subSplitNumber;
  177. var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();
  178. var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();
  179. var splitLineDistance = splitLineModel.get('distance');
  180. var unitX;
  181. var unitY;
  182. for (var i = 0; i <= splitNumber; i++) {
  183. unitX = Math.cos(angle);
  184. unitY = Math.sin(angle);
  185. // Split line
  186. if (splitLineModel.get('show')) {
  187. var distance = splitLineDistance ? splitLineDistance + axisLineWidth : axisLineWidth;
  188. var splitLine = new graphic.Line({
  189. shape: {
  190. x1: unitX * (r - distance) + cx,
  191. y1: unitY * (r - distance) + cy,
  192. x2: unitX * (r - splitLineLen - distance) + cx,
  193. y2: unitY * (r - splitLineLen - distance) + cy
  194. },
  195. style: splitLineStyle,
  196. silent: true
  197. });
  198. if (splitLineStyle.stroke === 'auto') {
  199. splitLine.setStyle({
  200. stroke: getColor(i / splitNumber)
  201. });
  202. }
  203. group.add(splitLine);
  204. }
  205. // Label
  206. if (labelModel.get('show')) {
  207. var distance = labelModel.get('distance') + splitLineDistance;
  208. var label = formatLabel(
  209. // multiply firstly to avoid rounding error.
  210. round(i * (maxVal - minVal) / splitNumber + minVal, DEFAULT_PRECISION_FOR_ROUNDING_ERROR), labelModel.get('formatter'));
  211. var autoColor = getColor(i / splitNumber);
  212. var textStyleX = unitX * (r - splitLineLen - distance) + cx;
  213. var textStyleY = unitY * (r - splitLineLen - distance) + cy;
  214. var rotateType = labelModel.get('rotate');
  215. var rotate = 0;
  216. if (rotateType === 'radial') {
  217. rotate = -angle + 2 * Math.PI;
  218. if (rotate > Math.PI / 2) {
  219. rotate += Math.PI;
  220. }
  221. } else if (rotateType === 'tangential') {
  222. rotate = -angle - Math.PI / 2;
  223. } else if (isNumber(rotateType)) {
  224. rotate = rotateType * Math.PI / 180;
  225. }
  226. if (rotate === 0) {
  227. group.add(new graphic.Text({
  228. style: createTextStyle(labelModel, {
  229. text: label,
  230. x: textStyleX,
  231. y: textStyleY,
  232. verticalAlign: unitY < -0.8 ? 'top' : unitY > 0.8 ? 'bottom' : 'middle',
  233. align: unitX < -0.4 ? 'left' : unitX > 0.4 ? 'right' : 'center'
  234. }, {
  235. inheritColor: autoColor
  236. }),
  237. silent: true
  238. }));
  239. } else {
  240. group.add(new graphic.Text({
  241. style: createTextStyle(labelModel, {
  242. text: label,
  243. x: textStyleX,
  244. y: textStyleY,
  245. verticalAlign: 'middle',
  246. align: 'center'
  247. }, {
  248. inheritColor: autoColor
  249. }),
  250. silent: true,
  251. originX: textStyleX,
  252. originY: textStyleY,
  253. rotation: rotate
  254. }));
  255. }
  256. }
  257. // Axis tick
  258. if (tickModel.get('show') && i !== splitNumber) {
  259. var distance = tickModel.get('distance');
  260. distance = distance ? distance + axisLineWidth : axisLineWidth;
  261. for (var j = 0; j <= subSplitNumber; j++) {
  262. unitX = Math.cos(angle);
  263. unitY = Math.sin(angle);
  264. var tickLine = new graphic.Line({
  265. shape: {
  266. x1: unitX * (r - distance) + cx,
  267. y1: unitY * (r - distance) + cy,
  268. x2: unitX * (r - tickLen - distance) + cx,
  269. y2: unitY * (r - tickLen - distance) + cy
  270. },
  271. silent: true,
  272. style: tickLineStyle
  273. });
  274. if (tickLineStyle.stroke === 'auto') {
  275. tickLine.setStyle({
  276. stroke: getColor((i + j / subSplitNumber) / splitNumber)
  277. });
  278. }
  279. group.add(tickLine);
  280. angle += subStep;
  281. }
  282. angle -= subStep;
  283. } else {
  284. angle += step;
  285. }
  286. }
  287. };
  288. GaugeView.prototype._renderPointer = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) {
  289. var group = this.group;
  290. var oldData = this._data;
  291. var oldProgressData = this._progressEls;
  292. var progressList = [];
  293. var showPointer = seriesModel.get(['pointer', 'show']);
  294. var progressModel = seriesModel.getModel('progress');
  295. var showProgress = progressModel.get('show');
  296. var data = seriesModel.getData();
  297. var valueDim = data.mapDimension('value');
  298. var minVal = +seriesModel.get('min');
  299. var maxVal = +seriesModel.get('max');
  300. var valueExtent = [minVal, maxVal];
  301. var angleExtent = [startAngle, endAngle];
  302. function createPointer(idx, angle) {
  303. var itemModel = data.getItemModel(idx);
  304. var pointerModel = itemModel.getModel('pointer');
  305. var pointerWidth = parsePercent(pointerModel.get('width'), posInfo.r);
  306. var pointerLength = parsePercent(pointerModel.get('length'), posInfo.r);
  307. var pointerStr = seriesModel.get(['pointer', 'icon']);
  308. var pointerOffset = pointerModel.get('offsetCenter');
  309. var pointerOffsetX = parsePercent(pointerOffset[0], posInfo.r);
  310. var pointerOffsetY = parsePercent(pointerOffset[1], posInfo.r);
  311. var pointerKeepAspect = pointerModel.get('keepAspect');
  312. var pointer;
  313. // not exist icon type will be set 'rect'
  314. if (pointerStr) {
  315. pointer = createSymbol(pointerStr, pointerOffsetX - pointerWidth / 2, pointerOffsetY - pointerLength, pointerWidth, pointerLength, null, pointerKeepAspect);
  316. } else {
  317. pointer = new PointerPath({
  318. shape: {
  319. angle: -Math.PI / 2,
  320. width: pointerWidth,
  321. r: pointerLength,
  322. x: pointerOffsetX,
  323. y: pointerOffsetY
  324. }
  325. });
  326. }
  327. pointer.rotation = -(angle + Math.PI / 2);
  328. pointer.x = posInfo.cx;
  329. pointer.y = posInfo.cy;
  330. return pointer;
  331. }
  332. function createProgress(idx, endAngle) {
  333. var roundCap = progressModel.get('roundCap');
  334. var ProgressPath = roundCap ? Sausage : graphic.Sector;
  335. var isOverlap = progressModel.get('overlap');
  336. var progressWidth = isOverlap ? progressModel.get('width') : axisLineWidth / data.count();
  337. var r0 = isOverlap ? posInfo.r - progressWidth : posInfo.r - (idx + 1) * progressWidth;
  338. var r = isOverlap ? posInfo.r : posInfo.r - idx * progressWidth;
  339. var progress = new ProgressPath({
  340. shape: {
  341. startAngle: startAngle,
  342. endAngle: endAngle,
  343. cx: posInfo.cx,
  344. cy: posInfo.cy,
  345. clockwise: clockwise,
  346. r0: r0,
  347. r: r
  348. }
  349. });
  350. isOverlap && (progress.z2 = linearMap(data.get(valueDim, idx), [minVal, maxVal], [100, 0], true));
  351. return progress;
  352. }
  353. if (showProgress || showPointer) {
  354. data.diff(oldData).add(function (idx) {
  355. var val = data.get(valueDim, idx);
  356. if (showPointer) {
  357. var pointer = createPointer(idx, startAngle);
  358. // TODO hide pointer on NaN value?
  359. graphic.initProps(pointer, {
  360. rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2)
  361. }, seriesModel);
  362. group.add(pointer);
  363. data.setItemGraphicEl(idx, pointer);
  364. }
  365. if (showProgress) {
  366. var progress = createProgress(idx, startAngle);
  367. var isClip = progressModel.get('clip');
  368. graphic.initProps(progress, {
  369. shape: {
  370. endAngle: linearMap(val, valueExtent, angleExtent, isClip)
  371. }
  372. }, seriesModel);
  373. group.add(progress);
  374. // Add data index and series index for indexing the data by element
  375. // Useful in tooltip
  376. setCommonECData(seriesModel.seriesIndex, data.dataType, idx, progress);
  377. progressList[idx] = progress;
  378. }
  379. }).update(function (newIdx, oldIdx) {
  380. var val = data.get(valueDim, newIdx);
  381. if (showPointer) {
  382. var previousPointer = oldData.getItemGraphicEl(oldIdx);
  383. var previousRotate = previousPointer ? previousPointer.rotation : startAngle;
  384. var pointer = createPointer(newIdx, previousRotate);
  385. pointer.rotation = previousRotate;
  386. graphic.updateProps(pointer, {
  387. rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2)
  388. }, seriesModel);
  389. group.add(pointer);
  390. data.setItemGraphicEl(newIdx, pointer);
  391. }
  392. if (showProgress) {
  393. var previousProgress = oldProgressData[oldIdx];
  394. var previousEndAngle = previousProgress ? previousProgress.shape.endAngle : startAngle;
  395. var progress = createProgress(newIdx, previousEndAngle);
  396. var isClip = progressModel.get('clip');
  397. graphic.updateProps(progress, {
  398. shape: {
  399. endAngle: linearMap(val, valueExtent, angleExtent, isClip)
  400. }
  401. }, seriesModel);
  402. group.add(progress);
  403. // Add data index and series index for indexing the data by element
  404. // Useful in tooltip
  405. setCommonECData(seriesModel.seriesIndex, data.dataType, newIdx, progress);
  406. progressList[newIdx] = progress;
  407. }
  408. }).execute();
  409. data.each(function (idx) {
  410. var itemModel = data.getItemModel(idx);
  411. var emphasisModel = itemModel.getModel('emphasis');
  412. var focus = emphasisModel.get('focus');
  413. var blurScope = emphasisModel.get('blurScope');
  414. var emphasisDisabled = emphasisModel.get('disabled');
  415. var autoColor = getColor(linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true));
  416. if (showPointer) {
  417. var pointer = data.getItemGraphicEl(idx);
  418. var symbolStyle = data.getItemVisual(idx, 'style');
  419. var visualColor = symbolStyle.fill;
  420. if (pointer instanceof ZRImage) {
  421. var pathStyle = pointer.style;
  422. pointer.useStyle(extend({
  423. image: pathStyle.image,
  424. x: pathStyle.x,
  425. y: pathStyle.y,
  426. width: pathStyle.width,
  427. height: pathStyle.height
  428. }, symbolStyle));
  429. } else {
  430. pointer.useStyle(symbolStyle);
  431. pointer.type !== 'pointer' && pointer.setColor(visualColor);
  432. }
  433. pointer.setStyle(itemModel.getModel(['pointer', 'itemStyle']).getItemStyle());
  434. if (pointer.style.fill === 'auto') {
  435. pointer.setStyle('fill', autoColor);
  436. }
  437. pointer.z2EmphasisLift = 0;
  438. setStatesStylesFromModel(pointer, itemModel);
  439. toggleHoverEmphasis(pointer, focus, blurScope, emphasisDisabled);
  440. }
  441. if (showProgress) {
  442. var progress = progressList[idx];
  443. progress.useStyle(data.getItemVisual(idx, 'style'));
  444. progress.setStyle(itemModel.getModel(['progress', 'itemStyle']).getItemStyle());
  445. if (progress.style.fill === 'auto') {
  446. progress.setStyle('fill', autoColor);
  447. }
  448. progress.z2EmphasisLift = 0;
  449. setStatesStylesFromModel(progress, itemModel);
  450. toggleHoverEmphasis(progress, focus, blurScope, emphasisDisabled);
  451. }
  452. });
  453. this._progressEls = progressList;
  454. }
  455. };
  456. GaugeView.prototype._renderAnchor = function (seriesModel, posInfo) {
  457. var anchorModel = seriesModel.getModel('anchor');
  458. var showAnchor = anchorModel.get('show');
  459. if (showAnchor) {
  460. var anchorSize = anchorModel.get('size');
  461. var anchorType = anchorModel.get('icon');
  462. var offsetCenter = anchorModel.get('offsetCenter');
  463. var anchorKeepAspect = anchorModel.get('keepAspect');
  464. var anchor = createSymbol(anchorType, posInfo.cx - anchorSize / 2 + parsePercent(offsetCenter[0], posInfo.r), posInfo.cy - anchorSize / 2 + parsePercent(offsetCenter[1], posInfo.r), anchorSize, anchorSize, null, anchorKeepAspect);
  465. anchor.z2 = anchorModel.get('showAbove') ? 1 : 0;
  466. anchor.setStyle(anchorModel.getModel('itemStyle').getItemStyle());
  467. this.group.add(anchor);
  468. }
  469. };
  470. GaugeView.prototype._renderTitleAndDetail = function (seriesModel, ecModel, api, getColor, posInfo) {
  471. var _this = this;
  472. var data = seriesModel.getData();
  473. var valueDim = data.mapDimension('value');
  474. var minVal = +seriesModel.get('min');
  475. var maxVal = +seriesModel.get('max');
  476. var contentGroup = new graphic.Group();
  477. var newTitleEls = [];
  478. var newDetailEls = [];
  479. var hasAnimation = seriesModel.isAnimationEnabled();
  480. var showPointerAbove = seriesModel.get(['pointer', 'showAbove']);
  481. data.diff(this._data).add(function (idx) {
  482. newTitleEls[idx] = new graphic.Text({
  483. silent: true
  484. });
  485. newDetailEls[idx] = new graphic.Text({
  486. silent: true
  487. });
  488. }).update(function (idx, oldIdx) {
  489. newTitleEls[idx] = _this._titleEls[oldIdx];
  490. newDetailEls[idx] = _this._detailEls[oldIdx];
  491. }).execute();
  492. data.each(function (idx) {
  493. var itemModel = data.getItemModel(idx);
  494. var value = data.get(valueDim, idx);
  495. var itemGroup = new graphic.Group();
  496. var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true));
  497. var itemTitleModel = itemModel.getModel('title');
  498. if (itemTitleModel.get('show')) {
  499. var titleOffsetCenter = itemTitleModel.get('offsetCenter');
  500. var titleX = posInfo.cx + parsePercent(titleOffsetCenter[0], posInfo.r);
  501. var titleY = posInfo.cy + parsePercent(titleOffsetCenter[1], posInfo.r);
  502. var labelEl = newTitleEls[idx];
  503. labelEl.attr({
  504. z2: showPointerAbove ? 0 : 2,
  505. style: createTextStyle(itemTitleModel, {
  506. x: titleX,
  507. y: titleY,
  508. text: data.getName(idx),
  509. align: 'center',
  510. verticalAlign: 'middle'
  511. }, {
  512. inheritColor: autoColor
  513. })
  514. });
  515. itemGroup.add(labelEl);
  516. }
  517. var itemDetailModel = itemModel.getModel('detail');
  518. if (itemDetailModel.get('show')) {
  519. var detailOffsetCenter = itemDetailModel.get('offsetCenter');
  520. var detailX = posInfo.cx + parsePercent(detailOffsetCenter[0], posInfo.r);
  521. var detailY = posInfo.cy + parsePercent(detailOffsetCenter[1], posInfo.r);
  522. var width = parsePercent(itemDetailModel.get('width'), posInfo.r);
  523. var height = parsePercent(itemDetailModel.get('height'), posInfo.r);
  524. var detailColor = seriesModel.get(['progress', 'show']) ? data.getItemVisual(idx, 'style').fill : autoColor;
  525. var labelEl = newDetailEls[idx];
  526. var formatter_1 = itemDetailModel.get('formatter');
  527. labelEl.attr({
  528. z2: showPointerAbove ? 0 : 2,
  529. style: createTextStyle(itemDetailModel, {
  530. x: detailX,
  531. y: detailY,
  532. text: formatLabel(value, formatter_1),
  533. width: isNaN(width) ? null : width,
  534. height: isNaN(height) ? null : height,
  535. align: 'center',
  536. verticalAlign: 'middle'
  537. }, {
  538. inheritColor: detailColor
  539. })
  540. });
  541. setLabelValueAnimation(labelEl, {
  542. normal: itemDetailModel
  543. }, value, function (value) {
  544. return formatLabel(value, formatter_1);
  545. });
  546. hasAnimation && animateLabelValue(labelEl, idx, data, seriesModel, {
  547. getFormattedLabel: function (labelDataIndex, status, dataType, labelDimIndex, fmt, extendParams) {
  548. return formatLabel(extendParams ? extendParams.interpolatedValue : value, formatter_1);
  549. }
  550. });
  551. itemGroup.add(labelEl);
  552. }
  553. contentGroup.add(itemGroup);
  554. });
  555. this.group.add(contentGroup);
  556. this._titleEls = newTitleEls;
  557. this._detailEls = newDetailEls;
  558. };
  559. GaugeView.type = 'gauge';
  560. return GaugeView;
  561. }(ChartView);
  562. export default GaugeView;