引见
在ECharts中看到过这类圆形散布结果,相似css3,恰好项目中想把它用上,but我又不想引入全部echart.js文件,更主要的是想弄邃晓它的道理,所以本身着手。在这篇文章中我们就来剖析完成这类结果的两种要领,先上结果图:
完成道理
经由历程不停的改变圆的半径大小,不停堆叠到达活动的结果,在活动的历程当中,设置当前canvas的通明度context.globalAlpha=0.95
,使得canvas上的圆逐步通明直至为0,从而完成这类散布、渐变的结果。
完成要领一
1. 症结技术点context.globalAlpha = 0.95
; //设置主canvas的绘制通明度。
建立暂时canvas来缓存主canas的汗青图象,再叠加到主canvas上。
2. 绘制历程
起首,我们先来写一个绘制圆的要领:
//画圆
var drawCircle = function() {
context.beginPath();
context.arc(150, 100, radius, 0, Math.PI * 2);
context.closePath();
context.lineWidth = 2; //线条宽度
context.strokeStyle = 'rgba(250,250,50,1)'; //色彩
context.stroke();
radius += 0.5; //每一帧半径增添0.5
//半径radius大于30时,重置为0
if (radius > 30) {
radius = 0;
}
};
然后,我们建立一个暂时canvas用来缓存主canvas上的汗青图象,设置主canvas的通明度context.globalAlpha=0.95
(症结一步),在每次挪用drawCircle
要领绘制一个新圆之前都把主canvas上的图象,也就是之前的图象给绘制到暂时的canvas中,比及drawCircle
要领绘制完新圆后,再把暂时canvas的图象绘制回主canvas中。
中心代码以下:
//建立一个暂时canvas来缓存主canvas的汗青图象
var backCanvas = document.createElement('canvas'),
backCtx = backCanvas.getContext('2d');
backCanvas.width = width;
backCanvas.height = height;
//设置主canvas的绘制通明度
context.globalAlpha = 0.95;
//显现行将绘制的图象,疏忽暂时canvas中已存在的图象
backCtx.globalCompositeOperation = 'copy';
var render = function() {
//1.先将主canvas的图象缓存到暂时canvas中
backCtx.drawImage(canvas, 0, 0, width, height);
//2.消灭主canvas上的图象
context.clearRect(0, 0, width, height);
//3.在主canvas上画新圆
drawCircle();
//4.等新圆画完后,再把暂时canvas的图象绘制回主canvas中
context.drawImage(backCanvas, 0, 0, width, height);
};
完成要领二
与上一种要领比拟,这类要领越发简朴,一样是用到了通明度逐步减小直到为0的道理,差别的是这里并没有建立暂时canvas,而是应用了context.globalCompositeOperation
属性值source-over
和destination-in
来合营应用,检察globalCompositeOperation属性引见
中心代码以下:
var render = function() {
//默认值为source-over
var prev = context.globalCompositeOperation;
//只显现canvas上原图象的堆叠部份
context.globalCompositeOperation = 'destination-in';
//设置主canvas的绘制通明度
context.globalAlpha = 0.95;
//这一步目标是将canvas上的图象变的通明
context.fillRect(0, 0, width, height);
//在原图象上堆叠新图象
context.globalCompositeOperation = prev;
//在主canvas上画新圆
drawCircle();
};
地图上的应用
这里我采纳的是第二种体式格局,将散布、渐变结果应用到了百度地图上,觉得还比较炫,检察更多demo
总结
要领一、二都能完成一样的结果,假如动画绘制、操纵canvas比较频仍,发起采纳第一种体式格局,用暂时canvas来缓存汗青图象,效力更高。