效果演示
组件
里面对应两个图片资源,panelBackground_red.png 和 panelBackground_green.png,请前往百度网盘进行下载。如果喜欢其他颜色,可以使用.psd来修改导出就行。
链接: https://pan.baidu.com/s/1BmupspRch3aPcqY7l01WYA 提取码: t3ur
在使用组件之前,记得引入echart组件,可以参考echart组件引入
<template>
<!-- <div class="titleDiv">占用率</div> -->
<div id="customGaugeContainer" ref="panel" style="height: 100%;"></div>
</template>
<script>
import * as echarts from 'echarts'
var app = {};
var ROOT_PATH = 'https://echarts.apache.org/examples';
// var _panelImageURL = ROOT_PATH + '/data/asset/img/custom-gauge-panel.png';
var _panelImageURL = require("@/assets/panel/panelBackground_green.png");
var _animationDuration = 1000;
var _animationDurationUpdate = 1000;
var _animationEasingUpdate = 'quarticInOut';
//这个不改
var _valOnRadianMax = 100;
//这个不改
var _pointerInnerRadius = 60;
//外轮廓半径
var _outerRadius = 110;
//内轮廓半径
var _innerRadius = 100;
//里面白色远的半径
var _insidePanelRadius = 100;
var _fontSize = 50;
var _currentDataIndex = 0;
var _shadowColor = '#20A53A';
var _textColor = '#20A53A';
var _shadowBlur = 20;
export default {
name: 'SmartSchedulingSystemCustomGauge',
props: {
rate: {
type: Number
},
timeChange: {
type: Number
}
},
watch: {
rate: {
handler(newValue, oldValue) {
// console.log("刷新表盘数据")
// console.log("oldValue:" + oldValue)
// console.log("newValue:" + newValue)
// console.log("rate:" + this.rate)
//刷新表盘数据
this.setOptions();
},
deep: true
},
},
data() {
return {
myChart: undefined,
scheduledTask: undefined,
};
},
mounted() {
this.$nextTick(() => {
this.initChart();
window.addEventListener('resize', this.myChart.resize());
// this.setScheduledTask();
})
},
methods: {
initChart() {
let dom = document.getElementById('customGaugeContainer');
let clientHeight = dom.clientHeight;
// console.log("clientHeight:" + clientHeight)
_outerRadius = (clientHeight / 2) * 0.9;
_innerRadius = (clientHeight / 2) * 0.8;
_insidePanelRadius = (clientHeight / 2) * 0.8;
_fontSize = (clientHeight / 2) * 0.3;
_shadowBlur = (clientHeight / 2) * 0.2;
// this.myChart = echarts.init(dom, null, {
// renderer: 'canvas',
// useDirtyRect: false
// });
this.myChart = echarts.init(this.$refs.panel);
this.setOptions();
},
setOptions() {
if (this.rate > 80) {
_shadowColor = '#F33333';
_textColor = '#F33333';
_panelImageURL = require("@/assets/panel/panelBackground_red.png");
} else {
_shadowColor = '#20A53A';
_textColor = '#20A53A';
_panelImageURL = require("@/assets/panel/panelBackground_green.png");
}
let option = {
animationEasing: _animationEasingUpdate,
animationDuration: _animationDuration,
animationDurationUpdate: _animationDurationUpdate,
animationEasingUpdate: _animationEasingUpdate,
//数据展示
dataset: {
//100可以看成是百分比
source: [[1, this.rate]]
},
tooltip: {},
angleAxis: {
type: 'value',
startAngle: 0,
show: false,
min: 0,
max: _valOnRadianMax
},
radiusAxis: {
type: 'value',
show: false
},
polar: {},
series: [
{
type: 'custom',
coordinateSystem: 'polar',
renderItem: renderItem
}
]
};
if (option && typeof option === 'object') {
this.myChart.setOption(option);
}
},
setScheduledTask() {
this.scheduledTask = setInterval(function () {
console.log("rate:" + this.rate)
}, 2000);
}
},
};
function renderItem(params, api) {
var valOnRadian = api.value(1);
var coords = api.coord([api.value(0), valOnRadian]);
var polarEndRadian = coords[3];
var imageStyle = {
image: _panelImageURL,
x: params.coordSys.cx - _outerRadius,
y: params.coordSys.cy - _outerRadius,
width: _outerRadius * 2,
height: _outerRadius * 2
};
return {
type: 'group',
children: [
{
type: 'image',
style: imageStyle,
clipPath: {
type: 'sector',
shape: {
cx: params.coordSys.cx,
cy: params.coordSys.cy,
r: _outerRadius,
r0: _innerRadius,
startAngle: 0,
endAngle: -polarEndRadian,
transition: 'endAngle',
enterFrom: { endAngle: 0 }
}
}
},
// {
// type: 'image',
// style: imageStyle,
// clipPath: {
// type: 'polygon',
// shape: {
// points: makePionterPoints(params, polarEndRadian)
// },
// extra: {
// polarEndRadian: polarEndRadian,
// transition: 'polarEndRadian',
// enterFrom: { polarEndRadian: 0 }
// },
// during: function (apiDuring) {
// apiDuring.setShape(
// 'points',
// makePionterPoints(params, apiDuring.getExtra('polarEndRadian'))
// );
// }
// }
// },
//白色中心圆
{
type: 'circle',
shape: {
cx: params.coordSys.cx,
cy: params.coordSys.cy,
r: _insidePanelRadius
},
style: {
fill: '#fff',
shadowBlur: _shadowBlur,
shadowOffsetX: 0,
shadowOffsetY: 0,
//轮廓阴影颜色
shadowColor: _shadowColor
}
},
{
type: 'text',
extra: {
valOnRadian: valOnRadian,
transition: 'valOnRadian',
enterFrom: { valOnRadian: 0 }
},
style: {
text: makeText(valOnRadian),
fontSize: _fontSize,
fontWeight: 700,
x: params.coordSys.cx,
y: params.coordSys.cy,
//字体颜色
fill: _textColor,
align: 'center',
verticalAlign: 'middle',
enterFrom: { opacity: 0 }
},
during: function (apiDuring) {
apiDuring.setStyle(
'text',
makeText(apiDuring.getExtra('valOnRadian'))
);
}
}
]
};
}
function convertToPolarPoint(renderItemParams, radius, radian) {
return [
Math.cos(radian) * radius + renderItemParams.coordSys.cx,
-Math.sin(radian) * radius + renderItemParams.coordSys.cy
];
}
function makePionterPoints(renderItemParams, polarEndRadian) {
return [
convertToPolarPoint(renderItemParams, _outerRadius, polarEndRadian),
convertToPolarPoint(
renderItemParams,
_outerRadius,
polarEndRadian + Math.PI * 0.03
),
convertToPolarPoint(renderItemParams, _pointerInnerRadius, polarEndRadian)
];
}
function makeText(valOnRadian) {
// Validate additive animation calc.
if (valOnRadian < -10) {
alert('illegal during val: ' + valOnRadian);
}
return ((valOnRadian / _valOnRadianMax) * 100).toFixed(1) + '%';
}
</script>
<style lang="scss" scoped>
#customGaugeContainer {
// height: calc(100% - 20px);
height: 100%;
}
</style>
使用方式
在页面引入组件
使用组件
<customGauge style="height: 150px;" :rate="server.jvm.usage">
</customGauge>
- height设置组件的高度
- rate属性设置利用率
到此这篇关于Vue+Echart实现利用率表盘效果的示例代码的文章就介绍到这了,更多相关Vue Echart利用率表盘效果内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!