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 相关文章推荐
node.js 一个简单的页面输出实现代码
Mar 07 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
Jan 07 Javascript
图解prototype、proto和constructor的三角关系
Jul 31 Javascript
JavaScript递归操作实例浅析
Oct 31 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
Apr 24 Javascript
JS正则表达式验证中文字符
May 08 Javascript
jQuery实现一个简单的验证码功能
Jun 26 jQuery
常见的浏览器Hack技巧整理
Jun 29 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 Javascript
使用js在layui中实现上传图片压缩
Jun 18 Javascript
vue的滚动条插件实现代码
Sep 07 Javascript
浅析Vue下的components模板使用及应用
Nov 27 Javascript
如何在CocosCreator里画个炫酷的雷达图
jquery插件实现图片悬浮
详解CocosCreator消息分发机制
Apr 16 #Javascript
CocosCreator入门教程之网络通信
Apr 16 #Javascript
JavaScript嵌入百度地图API的最详细方法
用javascript制作qq注册动态页面
利用javaScript处理常用事件详解
Apr 14 #Javascript
You might like
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
jquery实现带单选按钮的表格行选中时高亮显示
2013/08/01 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
基于Python实现文件大小输出
2016/01/11 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
python和opencv实现抠图
2018/07/18 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
荷兰手表网站:Watch2Day
2018/07/02 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
一套英文Java笔试题面试题
2016/04/21 面试题
2014年信用社工作总结
2014/11/25 职场文书
给老师的一封感谢信
2015/01/20 职场文书
可怜妈妈观后感
2015/06/09 职场文书
村官2015年度工作总结
2015/10/14 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
JavaScript实现简单的音乐播放器
2022/08/14 Javascript