饼图动效echarts linear配置项内容和展示

配置项如下
      const series = [
    {
        name: 'One',
        value: 230
    },
    {
        name: 'Two',
        value: 48
    },
    {
        name: 'Three',
        value: 111
    },
    {
        name: 'Four',
        value: 150
    }
]
const ringC = ['#66ccff', '#ffec8c', '#33ffbb', '#ffab66', '#7cff33', '#5470c6']
const color = [
    setColor('#9fe8ff', '#66ccff'),
    setColor('#fff7c0', '#ffec8c'),
    setColor('#62ffdf', '#33ffbb'),
    setColor('#ffd59f', '#ffab66'),
    '#7cff33',
    '#5470c6'
]
const centerX = '50%'

function setColor(start, end) {
    return {
        type: 'linear',
        x: 0,
        y: 0,
        x2: 0,
        y2: 1,
        colorStops: [
            {
                offset: 0,
                color: start // 0% 处的颜色
            },
            {
                offset: 1,
                color: end // 100% 处的颜色
            }
        ]
    }
}

let inter = null
let timer = null
let dataIndex = 0
let countToNum = series
.map(item => item.value)
.reduce((prev, next) => {
    return prev + next
}, 0)

let oldAllRate = 0
series.forEach((o, index) => {
    o.oldAllRate = oldAllRate.toFixed(1)
    if (index === series.length - 1) {
        o.rate = oldAllRate === 0 && o.value === 0 ? 0 : (100 - oldAllRate).toFixed(1)
    } else {
        o.rate = countToNum > 0 ? ((o.value / countToNum) * 100).toFixed(1) : 0
        oldAllRate += Number(o.rate)
    }
})

function setRing() {
    dataIndex = series.length
    clearInterval(inter)
    setPieData(100, 5, 100)
    timer = setTimeout(() => {
        setPieData(0, 5, 100)
        setCarousel()
    }, 2000)
}

function setCarousel(val = 0) {
    clearInterval(inter)
    dataIndex = val
    inter = setInterval(() => {
        if (dataIndex !== series.length) {
            setPieData(series[dataIndex].rate, dataIndex, series[dataIndex].oldAllRate)
            const i = dataIndex === series.length ? 0 : dataIndex
            const timeCar = setTimeout(() => {
                setPieData(0, i, Number(series[i].oldAllRate))

                const timeReset = setTimeout(() => {
                    setPieData(0, i, Number(series[i].rate) + Number(series[i].oldAllRate))
                    clearTimeout(timeReset)
                }, 500)

                clearTimeout(timeCar)
            }, 2000)
        }
        if (dataIndex === series.length) {
            setPieData(0, 0, 100)
            setRing()
        } else {
            dataIndex++
        }
    }, 3000)
}
function setPieData(v, i, start) {
    myChart.setOption({
        series: [
            {
                data: series
            },
            {
                startAngle:90 - start * 3.6,
                clockwise: true,
                data: [
                    {
                        value: v,
                        name: '',
                        // animationTypeUpdate: 'expansion',
                        itemStyle: {
                            color: color[i]
                        }
                    },
                    {
                        value: 100 - v,
                        name: '',
                        itemStyle: {
                            color: 'rgba(0,0,0,0)'
                        }
                    }
                ]
            }
        ]
    })
}

setCarousel()

option = {
    backgroundColor: '#0E1327',
    fontSize: 16,
    tooltip: {
        trigger: 'item',
        textStyle: {
            color: '#fff'
        },
        backgroundColor: 'rgba(16, 32, 40, 0.88)',
        borderRadius: 4,
        borderColor: '#20749e',
        formatter: params => {
            return params.marker + params.name + ': ' + params.value
        }
    },
    legend: {
        right: '0%',
        width: '10%',
        itemGap: 10,
        itemWidth: 14,
        itemHeight: 14,
        top: 'center',
        textStyle: {
            color: '#fff',
            rich: {
                a: {
                    fontSize: 12,
                    padding: [1, 0, 0, 0],
                    width: 85
                },
                b: {
                    fontSize: 10,
                    width: 55
                }
            }
        },
        data: series.map((o, i) => {
            o.itemStyle = {
                color: color[i]
            }
            return o
        })
    },
    series: [
        {
            type: 'pie',
            hoverAnimation: false,
            color: color,
            center: [centerX, '50%'],
            radius: ['43%', '70%'],
            startAngle: 90,
            avoidLabelOverlap: false,
            label: null,
            emphasis: null,
            labelLine: null,
            itemStyle: {
                borderWidth: 5, // 间距的宽度
                borderColor: 'rgba(0, 0, 0, 0.6)' //背景色
            },
            data: series
        },
        {
            type: 'pie',
            clockWise: true,
            hoverAnimation: false,
            center: [centerX, '50%'],
            radius: ['75%', '80%'],
            startAngle: 90,
            label: null,
            emphasis: null,
            labelLine: null,
            data: [
                {
                    value: 0,
                    name: ''
                },
                {
                    value: 100,
                    name: '',
                    itemStyle: {
                        color: 'rgba(0,0,0,0)'
                    }
                }
            ]
        }
    ]
};

    
截图如下