天行有常,不为尧存,不为桀亡
← DEVELOPER

用canvas绘制复杂图形

在闪吧看见一棵树,移植到canvas+javascript里来。

用setInterval让它动起来

补充: 除了setTimeout/setInterval这两个函数控制动画外。现在很多浏览器还提供了另一个函数requestAnimationFrame,这个函数接口所拥有的优势是:

对于一个侦中对DOM的所有操作,只进行一次Layout和Paint。 如果发生动画的元素被隐藏了,那么就不再去Paint。

不过这个方法的使用只类似于递归调用,并没有一个时间停顿,所以我们一般要根据记录时间间隔来决定动画的每一帧的绘制情况。 下面用requestAnimationFrame来完成上面的动画。由于requestAnimationFrame的兼容性,我们需要先写一个兼容性的方法(来自three.js):

(function() {
    /* 兼容requestAnimationFrame */
    var lastTime = 0;
    var vendors = ['ms', 'moz', 'webkit', 'o'];
    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
        window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] 
                                   || window[vendors[x]+'RequestCancelAnimationFrame'];
    }
    if (!window.requestAnimationFrame)
        window.requestAnimationFrame = function(callback, element) {
            var currTime = new Date().getTime();
            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
            var id = window.setTimeout(function() { callback(currTime + timeToCall); },
              timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        };
    if (!window.cancelAnimationFrame)
        window.cancelAnimationFrame = function(id) {
            clearTimeout(id);
        };
}());

再画几个图形:

← 上一篇
两个canvas动画
下一篇 →
在canvas 2D API下实现3D效果(3D版心形函数的绘制)