国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

每周一點(diǎn)canvas動(dòng)畫——序

svtter / 1090人閱讀

摘要:每周一點(diǎn)動(dòng)畫是一個(gè)系列文章,本文并不對(duì)的做過多的介紹,我默認(rèn)你已經(jīng)了解基本的繪圖,并在此告訴你如何使用簡單的數(shù)學(xué)與物理知識(shí)創(chuàng)建相當(dāng)酷炫的動(dòng)畫。下一節(jié),我們就正式開始我們的動(dòng)畫之旅

《每周一點(diǎn)canvas動(dòng)畫》是一個(gè)系列文章,本文并不對(duì)canvas的API做過多的介紹,我默認(rèn)你已經(jīng)了解基本的canvas繪圖API,并在此告訴你如何使用簡單的數(shù)學(xué)與物理知識(shí)創(chuàng)建相當(dāng)酷炫的動(dòng)畫。一說到物理和數(shù)學(xué)知識(shí)各位騷年們是不是感覺蛋疼(原諒我說臟話了),不過我要告訴你,我們用到的數(shù)學(xué)和物理知識(shí)真的很簡單,一點(diǎn)都不可怕。

1.支持情況

canvas作為H5中最為重要的新增特性,使開發(fā)者可以用它來創(chuàng)作各種令人驚嘆的作品。但開發(fā)者最關(guān)心的問題肯定是瀏覽器的支持情況(圖片來自張鑫旭博客)!

2.本文主要內(nèi)容

本系列文章主要介紹Canvas 2D動(dòng)畫原理,以及簡單的如何在2D平面模仿3D效果的方法,中間可能會(huì)穿插一些與其他技術(shù)相結(jié)合的DEMO和項(xiàng)目。首先,我們創(chuàng)作動(dòng)畫的基本文檔結(jié)構(gòu)如下。




    
    canvas動(dòng)畫序


   
       

you browser not support canvas!

在此我們需要明白動(dòng)畫的基本概念:
動(dòng)畫其實(shí)是由不同的靜態(tài)畫面組成,每一幅靜態(tài)畫面我們叫做一幀(frame),當(dāng)眾多的靜態(tài)畫面按照一定的規(guī)則快速運(yùn)動(dòng)時(shí),我們的眼睛就會(huì)欺騙我們的大腦,從而形成物體運(yùn)動(dòng)的假象。在這里先給大家展示用Canvas創(chuàng)作的兩個(gè)酷炫動(dòng)畫,看看它是否夠簡潔,夠酷炫!

1、百分比加載

第一個(gè)動(dòng)畫是一個(gè)用Canvas做的百分比加載動(dòng)畫(根據(jù)讀者的建議,已經(jīng)對(duì)錯(cuò)誤的代碼做了修改)。codePen地址

var canvas = document.getElementById("canvas"),  //獲取canvas元素
    context = canvas.getContext("2d"),           //獲取畫圖環(huán)境,指明為2d
    centerX = canvas.width/2,                    //Canvas中心點(diǎn)x軸坐標(biāo)
    centerY = canvas.height/2,                   //Canvas中心點(diǎn)y軸坐標(biāo)
    rad = Math.PI*2/100,                         //將360度分成100份,那么每一份就是rad度
    speed = 0.1;                                  //加載的快慢就靠它了
             
    //繪制藍(lán)色外圈
    function blueCircle(n){
        context.save();
        context.beginPath();
        context.strokeStyle = "#49f";
        context.lineWidth = 12;
        context.arc(centerX, centerY, 100 , -Math.PI/2, -Math.PI/2 + n*rad, false);
        context.stroke();
        context.restore();
    }
         
    //繪制白色外圈
    function whiteCircle(){
        context.save();
        context.beginPath();
        context.strokeStyle = "#A5DEF1";
        context.lineWidth = 12;
        context.arc(centerX, centerY, 100 , 0, Math.PI*2, false);
        context.stroke();
        context.closePath();
        context.restore();
    }
         
    //百分比文字繪制
    function text(n){
        context.save();
        context.fillStyle = "#F47C7C";
        context.font = "40px Arial";
        context.textAlign = "center";
        context.textBaseline = "middle";
        context.fillText(n.toFixed(0)+"%", centerX, centerY);
        context.restore();
   }
         
    //動(dòng)畫循環(huán)
    (function drawFrame(){
         window.requestAnimationFrame(drawFrame, canvas);
         context.clearRect(0, 0, canvas.width, canvas.height);
             
         whiteCircle();
         text(speed);
         blueCircle(speed);
                
         if(speed > 100) speed = 0;
         speed += 0.1;
    }());
 

在上面的代碼段中,我們通過一個(gè)立即執(zhí)行函數(shù)來執(zhí)行我們的動(dòng)畫循環(huán),并在內(nèi)部通過

window.requestAnimationFrame(drawFrame, canvas);

循環(huán)調(diào)用自身,requestAnimationFrame是一個(gè)新的API,作用與setTimeInterval一樣,不同的是它會(huì)根據(jù)瀏覽器的刷新頻率自動(dòng)調(diào)整動(dòng)畫的時(shí)間間隔。在循環(huán)中我們每次執(zhí)行都會(huì)重新繪制藍(lán)色的圓弧,和白色的圓環(huán)和百分比加載的文字,由于每次繪制的時(shí)間間隔很小,只有十幾毫秒(主要看電腦),所以我們的肉眼是無法清楚地分別每一幀的畫面,這樣就形成了我們看到的動(dòng)畫。該API的兼容處理如下:

if(!window.requestAnimationFrame){
    window.requestAnimationFrame =(window.webkitRequestAnimationFrame||
                                   window.mozRequestAnimationFrame||
                                   window.oRequestAnimationFrame||
                                   window.msRequestAnimationFrame||
                                   function(callback){
                                       return window.setTimeout(callback,1000/60); 
                                 });
    
}
2、黑客帝國(Matrix.js)

經(jīng)典的黑客帝國效果,Geek們的最愛。目前,已經(jīng)被我封裝成插件,可供大家方便使用。codePen地址 | 插件地址

具體代碼:

var canvas = document.querySelector("canvas"),
    context = canvas.getContext("2d"),
    w = canvas.width = window.innerWidth,
    h = canvas.height = window.innerHeight;
           
     //初始化
    var clearColor = "rgba(0, 0, 0, .1)",             //用于繪制漸變陰影
        wordColor = "#33ff33",                         //文字顏色
        words = "0123456789qwertyuiopasdfghjklzxcvbnm,./;"[]QWERTYUIOP{}ASDFGHJHJKL:ZXCVBBNM<>?",
        wordsArr = words.split(""),                 //將文字拆分進(jìn)一個(gè)數(shù)組
        font_size = 16,  //字體大小
        clumns = w / font_size,                     //文字降落的列數(shù)
        drops = [];

     for(var i=0; i h && Math.random() > 0.98){
                        drops[i] = 0;
                }
                    drops[i]++;
        }
       context.restore();
  }
           
    //動(dòng)畫循環(huán)
  (function drawFrame(){
        window.requestAnimationFrame(drawFrame, canvas);
        context.fillStyle = clearColor;
        context.fillRect(0, 0, w, h);  //注意這
        draw();
   }())

這段代碼有兩個(gè)比較核心的地方:
1,在初始化部分,我們定義了一個(gè)變量clearColor = "rgba(0, 0, 0, .1)",用于繪制陰影。其原理是:每當(dāng)動(dòng)畫繪制新的一幀,就在上面覆蓋一個(gè)透明度為0.1的黑色矩形。隨著層數(shù)的疊加,文字就會(huì)被逐漸遮蓋形成了我們看到的陰影。

2,在初始化的注釋處和核心模塊處。首先,設(shè)置了每個(gè)字體的大小(font_size)。然后,用canvas的寬度除以字體的大小,就得到了需要繪制的列數(shù)(clumns), 然后創(chuàng)建了一個(gè)數(shù)組drops,數(shù)組的長度為clumns,并且每個(gè)元素的值都為1(drops在這有什么用呢?繼續(xù)往下看)。在繪制部分,我們采取的思路是一行一行的繪制,首先在循環(huán)中隨機(jī)的獲取文字,在文字繪制API部分注意這行代碼:

context.fillText(text, i * font_size, drops[i] * font_size);

我們知道該API有三個(gè)參數(shù),第一個(gè)是繪制的文字,第二,三是文字的坐標(biāo)。在X坐標(biāo)部分為i * font_size,也就是說在循環(huán)完成后每個(gè)文字的X軸坐標(biāo)是(0, 16, 32,48...), 而Y坐標(biāo)為drops[i] * font_size由于drops內(nèi)元素的初始值都為1,所以文字的Y坐標(biāo)為(16, 16, 16, ...),這樣我們就相當(dāng)于先繪制了第一行的文字。那么緊接著我們繪制第二行只需要將drops中的元素加1即可,即(第二行的Y軸坐標(biāo)為(32,32,32...)。
依次類推,我們就繪制了滿屏的文字,通過漸變陰影我們就可以看到文字似乎是向下運(yùn)動(dòng)的效果。為了讓他們看上去運(yùn)動(dòng)的速度不一致,加上了這行代碼:

if (drops[i] * font_size > h && Math.random() > 0.98){
           drops[i] = 0;
 }

這行代碼判斷的是當(dāng)前繪制的這行文字的Y坐標(biāo)是否超過了canvas的高度,如果超過又從第一行開始繪制,那么如何讓他們出現(xiàn)差異性呢!小秘密在Math.random() > 0.98這,if中的兩個(gè)條件一個(gè)是判斷文字高度,另一個(gè)是判斷一個(gè)隨機(jī)數(shù)是佛大于0.98,只有當(dāng)兩個(gè)條件同時(shí)成立才能回到第一行重新繪制。所以,由于第二個(gè)條件是隨機(jī)的,那么差異性就自然而然的出現(xiàn)了!

看看,只需要這么簡單的代碼就能寫出這么酷炫的效果,是不是很贊!你也試試吧!不理解沒關(guān)系,這里只是讓你看看canvas能做出多么酷炫的效果。

下一節(jié),我們就正式開始我們的Canvas動(dòng)畫之旅?。。?/p>

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79105.html

相關(guān)文章

  • 周一點(diǎn)canvas動(dòng)畫》——修改增強(qiáng)版

    摘要:年的某一天,不小心看了下自己寫的幾篇文章,瞬間被惡心到了。本周已經(jīng)開始對(duì)刪除的文章著手回復(fù),目前進(jìn)度如下每周一點(diǎn)動(dòng)畫序每周一點(diǎn)動(dòng)畫用戶交戶每周一點(diǎn)動(dòng)畫三角函數(shù)每周一點(diǎn)動(dòng)畫波形運(yùn)動(dòng)新增平滑運(yùn)動(dòng)以及各項(xiàng)運(yùn)動(dòng)形式的動(dòng)畫效果圖 2016年的某一天,不小心看了下自己寫的幾篇文章,瞬間被惡心到了。 語句不通順 廢話一大堆 標(biāo)點(diǎn)符號(hào)錯(cuò)亂 圖片丑陋 排版惡心 缺少實(shí)際demo,并且沒有直觀的在線體驗(yàn)...

    shery 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<