canvas-环形倒计时(解决毛刺)

问题一

canvas 有锯齿毛刺的情况

1,循环路径 如进度条增长的过程 没清除前一步路径 会 有毛刺

2,本身没有毛刺 ,或者线条 在像素点中间位置

解决方案 :

手动开启HTML5 Canvas的抗锯齿可以用

canvas.getContext('2d').imageSmoothingEnabled = true;

或者直接把整个画布偏移0.5像素:

canvas.getContext('2d').translate(0.5, 0.5);

ps  这只对 canvas 本身的毛刺有效果,如果是重复路径画的你自己造成的毛刺无效  

重复路径造成的 毛刺 再每次绘画路径先清除路径或者情况画布

 

canvas 画圆形进度条、倒计时demo

  //canvas 倒计时
    var canvas2 = document.getElementById("canvas");
    c2 = canvas2.getContext("2d");
    //起始一条路径 底部不动的环
    c2.beginPath();
    c2.lineWidth = 14;
    c2.strokeStyle = '#ffffff4d';
    c2.arc(68, 68, 60, 0, 2 * Math.PI);
    c2.stroke();
//绘制当前进度
function jdt(x) {
    // 进度条

   // c2.save();
    c2.clearRect(0, 0, 146, 146);
    //
    //起始一条路径
    c2.beginPath();
    c2.lineWidth = 14;
    c2.strokeStyle = '#ffffff4d';
    c2.arc(68, 68, 60, 0, 2 * Math.PI);
    c2.stroke();
    //
    c2.beginPath();
    c2.lineWidth = 14;
    c2.strokeStyle = '#FEAD43';
    c2.lineCap = "round";
    c2.arc(68, 68, 60, -90 * Math.PI / 180, (x * 3.6 - 90) * Math.PI / 180);
    c2.stroke();
}
//倒计时部分最好用div 不是用canvas

function djs(y) {
    $(".canvas-djs").html(y)
}


//进度条方法参数 秒
function f1(x) {
    clearInterval(a);
    clearInterval(b);
    var x1 = x;
    var t1 = 0;
    totalTime = x;
     a = setInterval(function () {
        t1 = t1 + 0.1;
        if (t1 >= 100) {
            clearInterval(a);
            clearInterval(b);
            djs("00:00");
            jdt(100);
        } else {
            jdt(t1)
        }
    }, x1);
    var text = x;
    tm = leftTimer(text);
    djs(tm)
     b = setInterval(function () {
        text = text - 1;
        if (text <= 0) {
            clearInterval(b);
            clearInterval(a);
            jdt(100);
            djs("00:00");

        } else {
            tm = leftTimer(text);
            djs(tm)
        }
    }, 1000);

}

//时间格式转化
function leftTimer(t) {
    var leftTime = (t); //计算剩余的秒数
    var minutes = parseInt(leftTime / 60 % 60, 10);//计算剩余的分钟
    var seconds = parseInt(leftTime % 60, 10);//计算剩余的秒数
    minutes = checkTime(minutes);
    seconds = checkTime(seconds);
    function checkTime(i) { //将0-9的数字前面加上0,例1变为01
        if (i < 10) {
            i = "0" + i;
        }
        return i;
    }
    return minutes + ":" + seconds;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 uni-app 小程序中实现环形计时,可以使用 uni-canvas 组件结合 JavaScript 实现。以下是一个简单的实现过程: 1. 在页面中添加一个 uni-canvas 组件,设置宽度和高度,并设置 canvas-id 属性,例如: ``` <uni-canvas canvas-id="countdown" style="width: 200px; height: 200px;"></uni-canvas> ``` 2. 在页面的 JavaScript 中,获取到 canvas 绘图上下文对象,并设置绘图相关属性,例如: ``` const ctx = uni.createCanvasContext('countdown', this); const radius = 80; // 环形半径 const lineWidth = 10; // 环形线宽 const countDownTime = 60; // 计时时间,单位为秒 let remainingTime = countDownTime; // 剩余时间 const timer = setInterval(() => { remainingTime--; drawCountDown(remainingTime); if (remainingTime <= 0) { clearInterval(timer); } }, 1000); function drawCountDown(remainingTime) { const angle = (2 * Math.PI / countDownTime) * (countDownTime - remainingTime); ctx.clearRect(0, 0, 200, 200); // 清空画布 ctx.beginPath(); ctx.arc(100, 100, radius, -Math.PI / 2, angle - Math.PI / 2, false); ctx.setStrokeStyle('#ff0000'); ctx.setLineWidth(lineWidth); ctx.stroke(); ctx.closePath(); ctx.draw(); } ``` 3. 在 drawCountDown 函数中,根据剩余时间计算出当前的环形绘制角度,并绘制环形。其中,使用 arc 方法绘制环形,设置起始角度为 -Math.PI / 2,结束角度为当前角度减去 -Math.PI / 2,圆心坐标为 (100, 100)。 4. 使用 setInterval 方法每隔 1 秒钟更新一次剩余时间,并重新绘制环形,直到计时结束。 以上是一个简单的 uni-app 小程序中实现环形计时的过程,你可以根据需要进行进一步的优化和美化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值