<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • HTML5Canvas玩轉(zhuǎn)酷炫大波浪進(jìn)度圖

            2022-06-15    分類(lèi): 網(wǎng)站建設(shè)

            如上圖所見(jiàn),本文就是要實(shí)現(xiàn)上面那種效果。
            由于最近AlloyTouch要寫(xiě)一個(gè)下拉刷新的酷炫loading效果。所以選大波浪進(jìn)度圖。
            首先要封裝一下大波浪圖片進(jìn)度組件?;镜脑硎抢肅anvas繪制矢量圖和圖片素材合成出波浪特效。



            了解quadraticCurveTo

            quadraticCurveTo() 方法通過(guò)使用表示二次貝塞爾曲線(xiàn)的指定控制點(diǎn),向當(dāng)前路徑添加一個(gè)點(diǎn)。

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

            • cpx 貝塞爾控制點(diǎn)的 x 坐標(biāo)
            • cpy 貝塞爾控制點(diǎn)的 y 坐標(biāo)
            • x 結(jié)束點(diǎn)的 x 坐標(biāo)
            • y 結(jié)束點(diǎn)的 y 坐標(biāo)

            如:

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

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

            嘗試?yán)L制波浪

            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();

            可以看到無(wú)限運(yùn)動(dòng)的波浪:

            這里需要主要,繪制的區(qū)域要比Canvas大來(lái)隱藏?fù)u擺校正的圖像,上面使用了200200的Canvas。
            大家把代碼clone下來(lái)可以試試把它繪制到一個(gè)大的Canvas上就可以明白。
            這里通過(guò)if (-1offset === d2) offset = 0;來(lái)實(shí)現(xiàn)無(wú)限循環(huán)。
            d2就是一個(gè)波峰+波谷的長(zhǎng)度。一個(gè)波峰+一個(gè)波谷之后又開(kāi)始同樣的生命周期和從0開(kāi)始一樣,所以可以重置為0。

            了解globalCompositeOperation

            globalCompositeOperation 屬性說(shuō)明了繪制到畫(huà)布上的顏色是如何與畫(huà)布上已有的顏色組合起來(lái)的。

            繪制大波浪進(jìn)度圖會(huì)用到:

            ctx.globalCompositeOperation = "destination-atop";
            

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

            當(dāng)然,globalCompositeOperation還有很多選項(xiàng),這里不一一列舉,大家可以試試設(shè)置其他的屬性來(lái)調(diào)整出很酷炫的疊加特效。

            整體實(shí)現(xiàn)

            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";
            


            為了代碼簡(jiǎn)單直接,這里免去了封裝一個(gè)加載器的代碼,直接通過(guò)new Image來(lái)設(shè)置src來(lái)加載圖片。
            在繪制完矢量圖之后,設(shè)置globalCompositeOperation,然后再繪制企鵝圖片,繪制順序不能搞錯(cuò)。

            最后

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

            當(dāng)前名稱(chēng):HTML5Canvas玩轉(zhuǎn)酷炫大波浪進(jìn)度圖
            文章起源:http://www.jbt999.com/news46/167546.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、域名注冊(cè)手機(jī)網(wǎng)站建設(shè)、定制開(kāi)發(fā)、外貿(mào)網(wǎng)站建設(shè)外貿(mào)建站

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

            商城網(wǎng)站建設(shè)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 成人国产一区二区三区精品麻豆 | 三级片毛片视频 | 影音先锋痴女无码 | 国产乱╳╳AⅤ毛片 | 欧美日韩毛片 |