在前面簡單講述了一下HTML里的Canvas,這次根據Canvas完成了“海浪效果”(水波上升)。
(O(∩_∩)O哈哈哈~作者我能看這個動畫看一下午)
上升水波.gif
- 動畫分析
構成:貝塞爾曲線
畫布:Canvas
效果:波浪漲潮(上升、波動)
觸發條件:點擊按鈕
貝塞爾曲線.gif
算法實現分析:從sin()函數切入,sin()越大波度起伏越大,簡單說就是通過不斷改變sin()值來實現海浪效果動畫
干貨開始:
1、創建觸發條件(按鈕)
<button type="button"
onclick="Beisizer()"http://點擊時觸發JS事件
onmouseover="bcd()"http://鼠標經過時JS事件
onmouseleave="out()"http://鼠標離開時JS事件
id="Anniu">確                     定</button>
2、創建畫布Canvas
<canvas id="Theback"></canvas>
3、創建JS事件(屬性設置)
//獲取畫布
var beisizer = document.getElementById("Theback");
var ContenofBeisizer = beisizer.getContext("2d");
//設置波浪海域(海浪寬度,高度)
var beisizerwidth = beisizer.width;
var beisizerheight = beisizer.height;
var beisizerlinewidth = 2;
//曲線
var sinX = 0;
var sinY = beisizerheight/2.0;
//軸長
var axisLenght = beisizerwidth;
//弧度寬度
var waveWidth = 0.014;
//海浪高度
var waveHeight = beisizerheight / 15.0;
ContenofBeisizer.lineWidth = beisizerlinewidth;
4、畫貝塞爾曲線
var drawSin = function (xofspeed) {
ContenofBeisizer.save();
//存放貝塞爾曲線的各個點
var points = [];
ContenofBeisizer.beginPath();
//創建貝塞爾點
for (var x = sinX;x < sinX +axisLenght;x+=80/axisLenght){
// var y = -Math.sin((sinX+x)*waveWidth); 測試請解開注釋,注釋下一行
var y = -Math.sin((sinX+x)*waveWidth+xofspeed);
// points.push([x,sinY + y * waveHeight]); 測試請解開注釋,注釋下一行
points.push([x,rand+y*waveHeight]);
// ContenofBeisizer.lineTo(x,sinY + y * waveHeight); 測試請解開注釋,注釋下一行
ContenofBeisizer.lineTo(x,rand + y * waveHeight);
}
ContenofBeisizer.lineTo(axisLenght,beisizerheight);
ContenofBeisizer.lineTo(sinX,beisizerheight);
ContenofBeisizer.lineTo(points[0][0],points[0][1]);
ContenofBeisizer.stroke();
ContenofBeisizer.restore();
//貝塞爾曲線樣式設置
ContenofBeisizer.strokeStyle = "#3bc777";
ContenofBeisizer.fillStyle = "#3bc777";
ContenofBeisizer.fill();
};
這一段代碼已經完成靜態貝賽爾曲線的繪制了,可以通過解開以下語句嘗試運行看下效果。
var y = -Math.sin((sinX+x)*waveWidth);
points.push([x,rand+y*waveHeight]);
var y = -Math.sin((sinX+x)*waveWidth+xofspeed);
運行方法執行 drawSin()
靜態貝塞爾曲線.png
5、海浪效果的實現
需要在屬性中加入一下代碼進行速率的設置
var speed = 0.1;
數值越大速率越快
var xofspeed = 0;
波浪橫向的偏移量
var rand = beisizerheight;
波浪高度
var rendY = function () {
ContenofBeisizer.clearRect(0,0,beisizerwidth,beisizerheight);
//控制海浪高度
var tmp = 0.1;
rand-=tmp;
var b = beisizerheight - rand;
//控制循環漲潮
if (parseInt(b)==beisizerheight){
rand = beisizerheight;
}
drawSin(xofspeed);
drawSinl(xofspeed);
xofspeed += speed;
requestAnimationFrame(rendY);
};
通過調用自身產生不同的高度,來產生海浪效果。這里設置的屬性值配合第四步畫貝塞爾曲線一起進行理解。
運行方式 rendY();
總結
貝賽爾曲線也可以制作音波,心跳儀等。可以嘗試改變頻率值來實現。