使用canvas绘制一个圆形进度条

751 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

前言

hi,all~ ,上次我们基于canvas实现了一个柱状图,虽说看着有点丑,但看着确实是那么回事。有静必有动,今整个动态的,来用canvas实现一个圆形进度条吧。

第一步

既然是canvas实现,第一步必不可少的就是绘制一个画布了。

// 获取canvas元素并指明2d环境
let canvas = document.getElementById('canvas');
let context = canvas.getContext('2d');

// 获取中心点坐标
let centerX = canvas.width / 2;
let centerY = canvas.height / 2;

// 每一次加载1%,那就需要把360度等分为100份
let rad = Math.PI * 2 / 100;

// 加载速度
ley speed = 0.1;

第二步

绘制完画布并确定一些基本信息,我们需要绘制一个圆。

function circle() {
    context.save();
    context.beginPath();
    context.strokeStyle = 'white';
    context.arc(centerX, centerY, 100, 0, Math.PI*2, false);
    context.stroke();
    context.closePath();
    context.restore();
}

image.png

第三步

嗯,绘制出来了,看着也没问题,那就进行下一步。外边进度圆的绘制。

function outCircle(n) {
    context.save();
    context.strokeStyle = 'pink';
    context.lineWidth = 5;
    context.beginPath();
    context.arc(centerX, centerY, 100, -Math.PI / 2, -Math.PI / 2 + n * rad, false);
    context.stroke();
    context.closePath();
    context.restore();
}

image.png

第四步

有点进度条那味了哦!再来绘制文字显示。

function text(n) {
    context.save();
    context.strokeStyle = 'pink';
    context.font = '40px Arial';
    context.strokeText(n.toFixed(0) + '%', centerX - 25, centerY + 10);
    context.stroke();
    context.restore();
}

image.png

第五步

嗯,感觉来了,问题也来了,怎么动起来?来看看这个方法window.requestAnimationFrame

window.requestAnimationFrame()  告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行 -MDN

那就写个让他动起来的函数吧。

function drawFrame() {
    window.requestAnimationFrame(drawFrame, canvas);
    context.clearRect(0, 0, canvas.width, canvas.height);
    circle();
    text(speed);
    outCircle(speed);
    if (speed > 100) {
        speed = 0;
    }
    speed += 0.1;
}

来看看最终效果吧。

总结

本文利用canvas实现了一个圆形进度条。不知大家发现问题了没有,出现了图层混乱的情况。外圈的粉色使内圈的白色受到了影响。怎么解决就交给各位啦!bye~