Canvas三种动态画圆实现方法说明(小结)


Posted in Javascript onApril 16, 2021

前言

canvas是HTML5出来的绘图API容器,对于图形的处理非常强大,下面使用canvas配合JavaScript来做一下动态画圆效果。可以用它来做圆形进度条来使用。
这里我个人总结了3种实现方法,大家可以参考一下。

方法一:arc()实现画圆

代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <style type="text/css">
    #myCanvas{
        margin: 0 auto;
        display: block;
    }
    </style>
</head>
<body>
  <canvas id="myCanvas">当前浏览器不支持canvas组件请升级!</canvas>

  <script type="text/javascript">
  //方法一:arc 动态画圆
  var c = document.getElementById('myCanvas');
  var ctx = c.getContext('2d');

  var mW = c.width = 300;
  var mH = c.height = 300;
  var lineWidth = 5;
  var r = mW / 2; //中间位置
  var cR = r - 4 * lineWidth; //圆半径
  var startAngle = -(1 / 2 * Math.PI); //开始角度
  var endAngle = startAngle + 2 * Math.PI; //结束角度
  var xAngle = 1 * (Math.PI / 180); //偏移角度量
  var fontSize = 35; //字号大小
  var tmpAngle = startAngle; //临时角度变量

  //渲染函数
  var rander = function(){
    if(tmpAngle >= endAngle){
      return;
    }else if(tmpAngle + xAngle > endAngle){
      tmpAngle = endAngle;
    }else{
      tmpAngle += xAngle;
    }
    ctx.clearRect(0, 0, mW, mH);

    //画圈
    ctx.beginPath();
    ctx.lineWidth = lineWidth;
    ctx.strokeStyle = '#1c86d1';
    ctx.arc(r, r, cR, startAngle, tmpAngle);
    ctx.stroke();
    ctx.closePath();

    //写字
    ctx.fillStyle = '#1d89d5';
    ctx.font= fontSize + 'px Microsoft Yahei';
    ctx.textAlign='center';
    ctx.fillText( Math.round((tmpAngle -  startAngle) / (endAngle - startAngle) * 100) + '%', r, r + fontSize / 2);

    requestAnimationFrame(rander);
  };

  rander();
  </script>
</body>
</html>

思路:

通过设置的开始角度和结束角度来做限定,然后通过累加临时的角度变量实现动画效果。

相关函数:

context.arc(x,y,r,sAngle,eAngle,counterclockwise);

Canvas三种动态画圆实现方法说明(小结)

方法二:rotate() 动态画圆

代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <style type="text/css">
    #myCanvas{
        margin: 0 auto;
        display: block;
    }
    </style>
</head>
<body>
  <canvas id="myCanvas">当前浏览器不支持canvas组件请升级!</canvas>

  <script type="text/javascript">
  //方法二:rotate() 动态画圆
  var c = document.getElementById('myCanvas');
  var ctx = c.getContext('2d');

  var mW = c.width = 300;
  var mH = c.height = 300;
  var lineWidth = 5;
  var r = mW / 2; //中间位置
  var cR = r - 4 * lineWidth; //圆半径
  var startAngle = -(1 / 2 * Math.PI); //开始角度
  var endAngle = startAngle + 2 * Math.PI; //结束角度
  var xAngle = 1 * (Math.PI / 180); //偏移角度量
  var fontSize = 35; //字号大小
  var tmpAngle = startAngle; //临时角度变量

  //渲染函数
  var rander = function(){
    if(tmpAngle >= endAngle){
      return;
    }else if(tmpAngle + xAngle > endAngle){
      tmpAngle = endAngle;
    }else{
      tmpAngle += xAngle;
    }
    ctx.clearRect(0, 0, mW, mH);

    //画圈
    ctx.save();
    ctx.beginPath();
    ctx.lineWidth = lineWidth;
    ctx.strokeStyle = '#1c86d1';
    ctx.translate(r, r); //重定义圆点
    ctx.rotate(-Math.PI); //最上方为起点
    for(var i = 0; i <= tmpAngle - startAngle; i += xAngle){ //绘图
      ctx.moveTo(0, cR - lineWidth);
      ctx.lineTo(0, cR);
      ctx.rotate(xAngle); //通过旋转角度和画点的方式绘制圆
    }
    ctx.stroke();
    ctx.closePath();
    ctx.restore();

    //写字
    ctx.fillStyle = '#1d89d5';
    ctx.font= fontSize + 'px Microsoft Yahei';
    ctx.textAlign='center';
    ctx.fillText( Math.round((tmpAngle -  startAngle) / (endAngle - startAngle) * 100) + '%', r, r + fontSize / 2);

    requestAnimationFrame(rander);
  };

  rander();
  </script>
</body>
</html>

思路:

通过重新定义圆点坐标为(0,0),然后通过在规定范围内旋转图形,进行单点绘制。

相关函数:

context.translate(x,y);

Canvas三种动态画圆实现方法说明(小结)

context.rotate(angle);

Canvas三种动态画圆实现方法说明(小结)

方法三:获取圆坐标方式 动态画圆

代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <style type="text/css">
    #myCanvas{
        margin: 0 auto;
        display: block;
    }
    </style>
</head>
<body>
  <canvas id="myCanvas">当前浏览器不支持canvas组件请升级!</canvas>

  <script type="text/javascript">
  //方法三:获取圆坐标方式 动态画圆
  var c = document.getElementById('myCanvas');
  var ctx = c.getContext('2d');

  var mW = c.width = 300;
  var mH = c.height = 300;
  var lineWidth = 5;
  var r = mW / 2; //中间位置
  var cR = r - 4 * lineWidth; //圆半径
  var startAngle = -(1 / 2 * Math.PI); //开始角度
  var endAngle = startAngle + 2 * Math.PI; //结束角度
  var xAngle = 2 * (Math.PI / 180); //偏移角度量
  var cArr = []; //圆坐标数组

  //初始化圆坐标数组
  for(var i = startAngle; i <= endAngle; i += xAngle){
    //通过sin()和cos()获取每个角度对应的坐标
    var x = r + cR * Math.cos(i);
    var y = r + cR * Math.sin(i);

    cArr.push([x, y]);
  }

  //移动到开始点
  var startPoint = cArr.shift();
  ctx.beginPath();
  ctx.moveTo(startPoint[0], startPoint[1]);

  //渲染函数
  var rander = function(){
    //画圈
    if(cArr.length){
      ctx.lineWidth = lineWidth;
      ctx.strokeStyle = '#1c86d1';    

      var tmpPoint = cArr.shift();
      ctx.lineTo(tmpPoint[0], tmpPoint[1]);

      ctx.stroke();      
    }else{
      cArr = null;
      return;
    }

    requestAnimationFrame(rander);
  };

  rander();
  </script>
</body>
</html>

思路:

通过sin()cos()按一定的角度偏移量,将开始角度和结束角度之间的坐标位置存于数组中,然后按照数组中的坐标点进行绘制。

关于坐标点的计算,设计到了一些数学知识,这里我做了一张说明图:

Canvas三种动态画圆实现方法说明(小结)

效果

Canvas三种动态画圆实现方法说明(小结)

后记

通过上面的绘画方法,大家可以稍加修改制作成进度条插件。

到此这篇关于Canvas三种动态画圆实现方法说明(小结)的文章就介绍到这了,更多相关Canvas动态画圆内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
Javascript 相关文章推荐
ExtJS 简介 让你知道extjs是什么
Dec 29 Javascript
Jquery 一次处理多个ajax请求的代码
Sep 02 Javascript
JavaScript中两个感叹号的作用说明
Dec 28 Javascript
js给onclick事件赋值,动态传参数实例解说
Mar 28 Javascript
将Datatable转化成json发送前台实现思路
Sep 06 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
Apr 02 Javascript
jquery对table中各数据的增加、保存、删除操作示例
May 14 Javascript
JavaScript常用小技巧小结
Dec 29 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
Mar 03 Javascript
七个不允许错过的jQuery小技巧
Dec 21 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
Sep 14 Javascript
Postman无法正常返回结果问题解决
Aug 28 Javascript
如何在CocosCreator里画个炫酷的雷达图
jquery插件实现图片悬浮
详解CocosCreator消息分发机制
Apr 16 #Javascript
CocosCreator入门教程之网络通信
Apr 16 #Javascript
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
You might like
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
php函数与传递参数实例分析
2014/11/15 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
python实现简单的计时器功能函数
2015/03/14 Python
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
浅谈Python 参数与变量
2020/06/20 Python
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
如何进行Linux分区优化
2013/02/12 面试题
物业保安主管岗位职责
2013/12/25 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
三八节标语
2014/06/27 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL