打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
10分钟,利用canvas画一个小的loading界面
首先利用定义下canvas得样式
  1. <canvas width="1024" height="720" id="canvas" style="border: 1px solid #808080;display: block;margin: 100px auto;>你的游览器不支持canvas</canvas>
复制代码

这里主要要说的就是宽高,不要在style里面定义,不然会被拉伸。(对于这点,建议大家看下W3c文档,不是很懂)


高度和宽度属性确定画布的宽度和高度的坐标系统,而CSS属性只确定大小的盒子,它会显示。
  1. var canvas = document.getElementById('canvas');     
  2. var ctx = canvas.getContext('2d');
复制代码

获取对象,然后获取上下文进行画图。


好的,接下来来个小例子(画弧)


  1. //设置线宽,颜色(我喜欢通俗的称他为空心画法)
  2.         ctx.lineWidth = 2;
  3.         ctx.strokeStyle = '#17**5';
  4.        //arc是花弧形,如果用fill的画法的话,会把他封闭起来。
  5.         ctx.beginPath();
  6.         ctx.arc(512, 360, 100, 0.5 * Math.PI, 1 * Math.PI);
  7.         ctx.stroke();
  8.         ctx.closePath();
复制代码

对于ctx.beginPath();和 ctx.closePath();我觉得是canvas灵魂,一些好的canvas的引擎之所以效率高,他们有很大程度的关系。

1.比如,有些人画的感觉画出来的canvas是带有锯齿状,就是在画布上,绘制了同样一件事情N次之后的效果。

看下面一个例子
  1. ctx.beginPath();
  2.         ctx.arc(512, 360, 100, 0.5 * Math.PI, 1 * Math.PI);
  3.         ctx.closePath();
  4.         ctx.stroke();

复制代码

这就是ctx.closePath();的作用,闭合那些线,但是fill的画法默认是带有ctx.closePath();这个功能的,而ctx.beginPath();的作用就是相当于函数中的分割了,分割作用域。

2.例子就举上面的,如果将上面两段代码何必,去掉ctx.beginPath();,那么那段弧形会被绘制两次,而第二个则绘制一次。言下之意就是,假如没有ctx.beginPath();的话,代码中要绘制100个图片,第一个就会绘制100次,第一个99次,总而言之是100+99+98+。。。。。

3.接下来两个小例子。
      
  1. //定义一个渐变的颜色,其实坐标,x,y,w,h
  2.         var color = ctx.createLinearGradient(512, 460, 512, 260);
  3.       // 开始颜色,和结束的颜色
  4.         color.addColorStop(0, '#499989');
  5.         color.addColorStop(1, '#17**5');

  6.         ctx.beginPath();
  7.         ctx.fillStyle = color;
  8.         ctx.arc(512, 360, 99, 0, 2 * Math.PI);
  9.         ctx.fill();
  10.         ctx.closePath();

  11.         //绘制文本
  12.         var a = 12;
  13.         ctx.font="50px Arial";
  14.         ctx.fillStyle = "#fff";
  15.       //居中
  16.         ctx.textAlign = "center";
  17.         ctx.beginPath();
  18.    //文字内容, 起始坐标,宽度
  19.         ctx.fillText(a, 510, 375 , 64);
  20.         ctx.closePath();
复制代码


4.接下来我们把上面内容结合起来。

  1. //定时器
  2.         var timeClear;
  3.         //定义一些数字
  4.         var arcNum = 0.02,
  5.                 textNum = 1;

  6.         function load1(){

  7.             if(textNum >= 101){
  8.                 return 0;
  9.             }

  10.             ctx.lineWidth = 2;
  11.             ctx.strokeStyle = '#17**5';

  12.             ctx.beginPath();
  13.             ctx.arc(512, 360, 100, (0.5 + arcNum - 0.02) * Math.PI, (0.5 + arcNum) * Math.PI);
  14.             ctx.stroke();
  15.             ctx.closePath();

  16.             //绘制里面的渐变颜色
  17.             var color = ctx.createLinearGradient(512, 460, 512, 260);
  18.             color.addColorStop(0, '#499989');
  19.             color.addColorStop(1, '#17**5');

  20.             ctx.beginPath();
  21.             ctx.fillStyle = color;
  22.             ctx.arc(512, 360, 99, (0.5 - arcNum/2)* Math.PI, (0.5 + arcNum/2) * Math.PI);
  23.             ctx.fill();
  24.             ctx.closePath();

  25.             //绘制文本
  26.             ctx.font="80px Arial";
  27.             ctx.fillStyle = "#fff";
  28.             ctx.textAlign = "center";
  29.             ctx.beginPath();
  30.             ctx.fillText(textNum, 510, 385 , 124);
  31.             ctx.closePath();
  32.             //ctx.clearRect(0,0,1024,720);


  33.             arcNum = arcNum + 0.02;
  34.             textNum = textNum + 1;

  35.         }

  36.         timeClear = setInterval(load1, 60);

复制代码

看起来不太舒服,建议自己在电脑上测试

http://www.gbtags.com/gb/debug/7400a9ba-51a7-409b-b1f4-b01363b9c625.htm

一个简单的loading写完了,但是里面有很多问题,比如那个fill和text都是有部分重复的绘制,绘制了99次的,其实我主要想用fill那个圆来取代每次画好的文本还要clear。如果你把文字换种颜色可能明白我的意思了。然后这会导致底部绘制100次,导致底部出现锯齿的样子。

而且,绘制圆放在前面,就是相当于clearRect的作用,去清除文字。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
HTML5 Canvas中绘制椭圆的4种方法
JavaScript图形实例:SierPinski三角形
191127_01 JS之Canvas绘制教程
微信小程序|动态时钟
高级动画
JavaScript图形实例:Canvas API
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服