HTML5Canvas玩轉酷炫大波浪進度圖

2022-06-15    分類: 網站建設

如上圖所見,本文就是要實現上面那種效果。
由于最近AlloyTouch要寫一個下拉刷新的酷炫loading效果。所以選大波浪進度圖。
首先要封裝一下大波浪圖片進度組件。基本的原理是利用Canvas繪制矢量圖和圖片素材合成出波浪特效。



了解quadraticCurveTo

quadraticCurveTo() 方法通過使用表示二次貝塞爾曲線的指定控制點,向當前路徑添加一個點。

JavaScript 語法:
context.quadraticCurveTo(cpx,cpy,x,y);
參數值

  • cpx 貝塞爾控制點的 x 坐標
  • cpy 貝塞爾控制點的 y 坐標
  • x 結束點的 x 坐標
  • y 結束點的 y 坐標

如:

ctx.moveTo(20,20);
ctx.quadraticCurveTo(20,100,200,20);
ctx.stroke();

通過上面代碼可以繪制一條二次貝塞爾曲線,具體原理效果看下圖:

嘗試繪制波浪

var waveWidth = 300,
    offset = 0,
    waveHeight = 8,
    waveCount = 5,
    startX = -100,
    startY = 208,
    progress = 0,
    progressStep = 1,
    d2 = waveWidth / waveCount,
    d = d2 / 2,
    hd = d / 2,
    c = document.getElementById("myCanvas"),
    ctx = c.getContext("2d");
 
function tick() {
    offset -= 5;
    progress += progressStep;
    if (progress > 220 || progress < 0) progressStep *= -1;
 
    if (-1 * offset === d2) offset = 0;
    ctx.clearRect(0, 0, c.width, c.height);
    ctx.beginPath();
    var offsetY = startY - progress;
    ctx.moveTo(startX - offset, offsetY);
 
    for (var i = 0; i < waveCount; i++) {
        var dx = i * d2;
        var offsetX = dx + startX - offset;
        ctx.quadraticCurveTo(offsetX + hd, offsetY + waveHeight, offsetX + d, offsetY);
        ctx.quadraticCurveTo(offsetX + hd + d, offsetY - waveHeight, offsetX + d2, offsetY);
    }
    ctx.lineTo(startX + waveWidth, 300);
    ctx.lineTo(startX, 300);
    ctx.fill();
 
    requestAnimationFrame(tick);
}
 
tick();

可以看到無限運動的波浪:

這里需要主要,繪制的區域要比Canvas大來隱藏搖擺校正的圖像,上面使用了200200的Canvas。
大家把代碼clone下來可以試試把它繪制到一個大的Canvas上就可以明白。
這里通過if (-1offset === d2) offset = 0;來實現無限循環。
d2就是一個波峰+波谷的長度。一個波峰+一個波谷之后又開始同樣的生命周期和從0開始一樣,所以可以重置為0。

了解globalCompositeOperation

globalCompositeOperation 屬性說明了繪制到畫布上的顏色是如何與畫布上已有的顏色組合起來的。

繪制大波浪進度圖會用到:

ctx.globalCompositeOperation = "destination-atop";

destination-atop意義:畫布上已有的內容只會在它和新圖形重疊的地方保留。新圖形繪制于內容之后。

當然,globalCompositeOperation還有很多選項,這里不一一列舉,大家可以試試設置其他的屬性來調整出很酷炫的疊加特效。

整體實現

var img = new Image();
function tick() {
    ...
    ...
    ctx.fill();
    ctx.globalCompositeOperation = "destination-atop";
    ctx.drawImage(img, 0, 0);
    requestAnimationFrame(tick);
}
 
img.onload = function () {
    tick();
};
 
img.src = "asset/alloy.png";


為了代碼簡單直接,這里免去了封裝一個加載器的代碼,直接通過new Image來設置src來加載圖片。
在繪制完矢量圖之后,設置globalCompositeOperation,然后再繪制企鵝圖片,繪制順序不能搞錯。

最后

更多例子演示和代碼可以在Github上找到。
Github:https://github.com/AlloyTeam/AlloyTouch

當前名稱:HTML5Canvas玩轉酷炫大波浪進度圖
文章起源:http://m.kartarina.com/news46/167546.html

成都網站建設公司_創新互聯,為您提供建站公司域名注冊手機網站建設定制開發外貿網站建設外貿建站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設
主站蜘蛛池模板: 国产免费无码一区二区| 久久久久亚洲AV成人无码| 久久av高潮av无码av喷吹| 无码中文2020字幕二区| 亚洲美日韩Av中文字幕无码久久久妻妇| 精品无码黑人又粗又大又长| 免费A级毛片无码A∨| 亚洲一级特黄无码片| 亚洲欧洲无码AV不卡在线| 亚洲午夜国产精品无码老牛影视| 男人av无码天堂| 无码aⅴ精品一区二区三区浪潮| 尤物永久免费AV无码网站| 精品国产一区二区三区无码| 2014AV天堂无码一区| 无码精品久久一区二区三区 | 久久亚洲中文无码咪咪爱| 欧洲精品无码一区二区三区在线播放| 精品久久久久久无码不卡| 国产在线无码不卡影视影院| 乱人伦人妻中文字幕无码久久网| 亚洲国产超清无码专区| 丰满熟妇人妻Av无码区| 亚洲欧洲自拍拍偷午夜色无码| 日韩夜夜高潮夜夜爽无码| 亚洲AV无码专区在线厂| 亚洲熟妇无码AV不卡在线播放| 亚洲日韩国产精品无码av| 亚洲A∨无码无在线观看| 亚洲av无码片在线播放| 亚洲欧洲日产国码无码久久99| 人妻丝袜无码专区视频网站| 亚洲人成影院在线无码观看| 无码国产成人午夜电影在线观看| 无码人妻丰满熟妇区毛片18| 无码人妻精一区二区三区| 亚洲毛片av日韩av无码| 久久久久成人精品无码| 亚洲精品无码乱码成人| 久久久无码精品国产一区| 久久久久久无码Av成人影院 |