Canvas实现波浪进度图(附demo)


本文摘自PHP中文网,作者php中世界最好的语言,侵删。

这次给大家带来Canvas实现波浪进度图(附demo),Canvas实现波浪进度图的注意事项有哪些,下面就是实战案例,一起来看一下。

本文介绍了HTML5 Canvas玩转酷炫大波浪进度图效果,具体如下:

如上图所见,本文就是要实现上面那种效果。

由于最近AlloyTouch要写一个下拉刷新的酷炫loading效果。所以首选大波浪进度图。

首先要封装一下大波浪图片进度组件。基本的原理是利用Canvas绘制矢量图和图片素材合成出波浪特效。

了解quadraticCurveTo

quadraticCurveTo() 方法通过使用表示二次贝塞尔曲线的指定控制点,向当前路径添加一个点。

JavaScript 语法:

1

context.quadraticCurveTo(cpx,cpy,x,y);

参数值

cpx 贝塞尔控制点的 x 坐标

cpy 贝塞尔控制点的 y 坐标

x 结束点的 x 坐标

y 结束点的 y 坐标

如:

1

2

3

ctx.moveTo(20,20);

ctx.quadraticCurveTo(20,100,200,20);

ctx.stroke();

通过上面代码可以绘制一条二次贝塞尔曲线,具体原理效果看下图:

尝试绘制波浪

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

var waveWidth = 300,

    offset = 0,

    waveHeight = 8,

    waveCount = 5,

    startX = -100,

    startY = 208,

    progress = 0,

    progressStep = 1,

    d2 = waveWidth / waveCount,

    d = d2 / 2,

    hd = d / 2,

    c = document.getElementById("myCanvas"),

    ctx = c.getContext("2d");

function tick() {

    offset -= 5;

    progress += progressStep;

    if (progress > 220 || progress < 0) progressStep *= -1;

    if (-1 * offset === d2) offset = 0;

    ctx.clearRect(0, 0, c.width, c.height);

    ctx.beginPath();

    var offsetY = startY - progress;

    ctx.moveTo(startX - offset, offsetY);

    for (var i = 0; i < waveCount; i++) {

        var dx = i * d2;

        var offsetX = dx + startX - offset;

        ctx.quadraticCurveTo(offsetX + hd, offsetY + waveHeight, offsetX + d, offsetY);

        ctx.quadraticCurveTo(offsetX + hd + d, offsetY - waveHeight, offsetX + d2, offsetY);

    }

    ctx.lineTo(startX + waveWidth, 300);

    ctx.lineTo(startX, 300);

    ctx.fill();

    requestAnimationFrame(tick);

}

tick();

可以看到无限运动的波浪:

这里需要主要,绘制的区域要比Canvas大来隐藏摇摆校正的图像,上面使用了200200的Canvas。

大家把代码clone下来可以试试把它绘制到一个大的Canvas上就可以明白。

这里通过if (-1 offset === d2) offset = 0;来实现无限循环。

d2就是一个波峰+波谷的长度。一个波峰+一个波谷之后又开始同样的生命周期和从0开始一样,所以可以重置为0。

了解globalCompositeOperation

globalCompositeOperation 属性说明了绘制到画布上的颜色是如何与画布上已有的颜色组合起来的。

绘制大波浪进度图会用到:

1

ctx.globalCompositeOperation = "destination-atop";

destination-atop意义:画布上已有的内容只会在它和新图形重叠的地方保留。新图形绘制于内容之后。

当然,globalCompositeOperation还有很多选项,这里不一一列举,大家可以试试设置其他的属性来调整出很酷炫的叠加特效。

整体实现

1

2

3

4

5

6

7

8

9

10

11

12

13

var img = new Image();

function tick() {

    ...

    ...

    ctx.fill();

    ctx.globalCompositeOperation = "destination-atop";

    ctx.drawImage(img, 0, 0);

    requestAnimationFrame(tick);

}

img.onload = function () {

    tick();

};

img.src = "asset/alloy.png";

为了代码简单直接,这里免去了封装一个加载器的代码,直接通过new Image来设置src来加载图片。

在绘制完矢量图之后,设置globalCompositeOperation,然后再绘制企鹅图片,绘制顺序不能搞错。

最后

实例下载:demo

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

分页查询的使用详解

字符与数学函数之间的关系

以上就是Canvas实现波浪进度图(附demo)的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

html5 canvas 图形组合是如何实现的?附代码

html5 canvas平铺的代码详解

canvas跨域的解决方案介绍

canvas渐变色:canvas如何实现渐变色的效果?

使用html5的canvas和javascript创建一个绘图程序的示例代码

html5如何使用canvas画空心圆与实心圆

每天一个js 小demo之滑屏幻灯片。主要知识点:event

canvas绘制工作流之绘制节点

html5canvas save如何保存恢复状态?

html5利用canvas绘画二级树形结构图

更多相关阅读请进入《canvas》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...