『HTML5夢幻之旅』 - 舞動色彩,Canvas下實現顏色動畫

注:爲了方便起見,本次開發用到了開源引擎lufylegend,官方地址如下:http://lufylegend.com/lufylegend

今天來學習下HTML5 Canvas顏色動畫。什麼是顏色動畫呢?以我的理解就是以某種顏色過渡到另一種顏色。和這個效果有點類似:http://w3school.com.cn/tiy/t.asp?f=css3_animation1 上面的demo是用css3實現,而我們今天要用的是Canvas。Canvas並沒有相關的API,所以要想實現這種效果,只有靠自己了。

從上面的例子可以看出,我們需要完成緩動動畫和顏色變化這兩個基本效果,再將這兩個效果組合一下,就是我們要的結果了。


1,參考資料

值得高興的是,lufylegend爲我們提供了緩動類,可以完美地實現緩動動畫。所以我們現在只需要實現顏色變化了。怎麼變化顏色呢?縱觀Canvas所有API,我發現像素操作也許能派上用場。恰巧,lufylegend在1.9.4和1.9.4以上的版本中提供了LColorTransform這個類,用於顏色值變幻。

以下是lufylegend API文檔中LColorTransform用法:http://lufylegend.com/api/zh_CN/out/classes/LColorTransform.html

這個類可以配合LBitmapData的draw,colorTransform函數使用,這兩個函數的用法可參考如下給出的地址。

draw:http://lufylegend.com/api/zh_CN/out/classes/LBitmapData.html#method_draw

colorTransform:http://lufylegend.com/api/zh_CN/out/classes/LBitmapData.html#method_colorTransform

另外,各位讀者還需要了解LTweenLite:http://lufylegend.com/api/zh_CN/out/classes/LTweenLite.html

本次開發會使用draw函數和LTweenLite緩動類,請仔細閱讀相關函數介紹,以便閱讀下文時更輕鬆。


2,原理

實現顏色效果的原理其實很簡單,就是通過緩動類作爲驅動,不斷改變顏色的RGB值。

在LColorTranform中,提供了redOffset,greenOffset,blueOffset這三個屬性,分別用於像素處理時對R,G,B的調整。所以,在緩動類中,我們要緩動的屬性就是這三個屬性。然後在onUpdate中調用LBitmapData的draw函數對顯示對象刷新。


3,代碼展示

現在我先把代碼展示一下:

<!DOCTYPE html>
<html>
<head>
	<title>Color Transform</title>
	<script type="text/javascript" src="./lufylegend-1.9.7.min.js"></script>
	<script type="text/javascript">
		LInit(50, "mylegend", 600, 400, main);

		function main () {
			var loader = new LLoader();
			loader.addEventListener(LEvent.COMPLETE, function (e) {
				rectColorTransform();
				imageColorTransform(e.target);
			});
			loader.load("./yorhomwang.png")
		}

		function rectColorTransform () {
			var w = 200, h = 240;

			var rectLayer = new LShape();
			rectLayer.graphics.drawRoundRect(0, "", [0, 0, w, h, 5], true, "#000000");

			var bmpd = new LBitmapData(null, 0, 0, w, h);
			var bmp = new LBitmap(bmpd);
			bmp.x = bmp.y = 20;
			addChild(bmp);

			var rect = new LRectangle(0, 0, w, h);
			var ct = new LColorTransform(1, 1, 1, 1, 255, 0, 0, 0);

			startTween(bmpd, rectLayer, ct, rect);
		}

		function imageColorTransform(content) {
			var bmpd = new LBitmapData(null, 0, 0, content.width, content.height);
			var bmp = new LBitmap(bmpd);
			bmp.x = 250;
			bmp.y = 20;
			addChild(bmp);

			var rect = new LRectangle(0, 0, bmpd.width, bmpd.height);
			var ct = new LColorTransform(1, 1, 1, 1, 0, 0, 0, 0);

			startTween(bmpd, new LBitmap(new LBitmapData(content, 0, 0, rect.width, rect.height)), ct, rect);
		}

		function startTween (bmpd, layer, ct, rect) {
			var update = function (o) {
				bmpd.draw(layer, null, o, null, rect);	
			};

			update(ct);

			LTweenLite.to(ct, 3, {
				blueOffset : 255,
				loop : true,
				onUpdate : update
			}).to(ct, 3, {
				redOffset : -255,
			}).to(ct, 3, {
				greenOffset : 255,
			}).to(ct, 3, {
				blueOffset : -255,
			}).to(ct, 3, {
				redOffset : 255,
			}).to(ct, 3, {
				greenOffset : -255,
			});
		}
	</script>
</head>
<body>
	<div id="mylegend"></div>
</body>
</html>
加上html代碼,不足100行,可見,LColorTransform配合LTweenLite實現顏色動畫還是很簡單的。

運行上面的代碼,得到如下效果:


源代碼已全部給出,大家直接複製粘貼吧~


由於用到了像素處理,所以在某些電腦上運行起來可能會很卡。但是在HTML5迅猛發展的時代裏,相信Canvas渲染效率的大幅提升計日可待 。


注意:demo請在Chrome裏運行!

----------------------------------------------------------------

歡迎大家轉載我的文章。

轉載請註明:轉自Yorhom's Game Box

http://blog.csdn.net/yorhomwang

歡迎繼續關注我的博客

發佈了67 篇原創文章 · 獲贊 45 · 訪問量 93萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章