HTML5 canvas画布元素 制作 动态花朵动画

废话不多说 先上代码

<!doctype>
<html>
<head>
<meta charset="utf-8">
</head>
<body style="text-align:center;">
<canvas id="canvas" width="1300px" height="580px" style="border:2px black solid;">
</canvas>
<script>

var imge = new Image(100 ,100);
imge.src = "hh.png";
var a = new Array();
 a[0] = "2.png";
var cans = document.getElementById("canvas");
var cc = cans.getContext("2d");
cc.save();
var num=0;
function zuobiaox() {
	var x = Math.floor(Math.random()*1200);
	return x;	
}
function zuobiaoy() {
	var y = Math.floor(Math.random()*480);
	return y;	
}

imge.onload = function() {

	chanhua();
	
}
function chanhua() {
	cc.fillstyle="white";
	cc.fillRect(0,0,1300,580);
	//cc.save();
	//一定要清理画布,这样才能清理残留在画布上的像素,还你一个亮白如新的画布~请用纳爱斯
	cc.clearRect(0,0,1300,580);
	var x = zuobiaox();
		var y = zuobiaoy();
		//bian(imge);
		var ww= 70+Math.floor(Math.random()*100);
		
		
		cc.drawImage(imge, x, y,180,180);
		//setInterval("draw(imgdata, x, y,1.3)",1000);
		//ceshi(x,y,13);
		num =0;
		draw(x,y);
		//cc.restore();
		setTimeout("chanhua()",2000);
		
}

function  draw(x,y) {
		
	var img = cc.getImageData(x,y,180,180);	
	for(var i = 0,len = img.data.length; i <len; i+=4)	{
	
		img.data[i+3] = img.data[i+3] * 0.8;
	}
	
	cc.putImageData(img,x,y);
	num++;
	if(num>20)
	{
	//	alert("ok");
	
	
		clearTimeout(st);
		//如果没有return,就会导致之前出现过花的位置都继续保持
		return;
		
	}
	var st = setTimeout("draw("+x+","+y+")",80);	
	
}

//setInterval(img.onload,2000);
</script>
<a href="#"><img src = "hh.png" width="100px"></a>
</body>
</html>

技术分享

函数解释:

chanhua():利用位图在画布随机位置上绘制花朵。每隔2s调用一次该函数,每次调用都会清理画布

draw():对位图进行特效处理,进行像素处理,利用getImageData(),获取画布上某一区域像素,对该区域像素进行透明度处理。在通过putImageData()将处理好的像素放在原位置。每0.08s调用一次该函数,调用20次,每次调用花的透明度增强,到最后一次时,花几近透明(几近透明的说法是准确的,因为此时花的透明度已达到0.0000...0x了,所以不是完全透明,但是已经看不出来了)。


注意事项:

1.由于出现过花的地方还是有残留像素存在,当相同地方再次出现花朵时,会对新花产生影响,所以在每次生成花朵时要清理一次画布,利用clearRect()函数,宽和高与画布保持一致。

2.一定要在图片加载完成后再去利用图片,img.onload=function() {...}中去使用上述函数。

3.setTimeout("draw("+x+","+y+")",80);一定要给draw()函数加引号,否则马上执行该函数,不再等待0.08s。不要把变量x,y也括在双引号当中,这样会被当成是普通字符串处理。

4.切记每朵花的draw()函数要退出,否则会一直在画布上每2s变淡一次,不会消失。如下图所示:

技术分享


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。