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

資訊專欄INFORMATION COLUMN

每周一點canvas動畫——序

svtter / 1096人閱讀

摘要:每周一點動畫是一個系列文章,本文并不對的做過多的介紹,我默認你已經了解基本的繪圖,并在此告訴你如何使用簡單的數學與物理知識創建相當酷炫的動畫。下一節,我們就正式開始我們的動畫之旅

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

1.支持情況

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

2.本文主要內容

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




    
    canvas動畫序


   
       

you browser not support canvas!

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

1、百分比加載

第一個動畫是一個用Canvas做的百分比加載動畫(根據讀者的建議,已經對錯誤的代碼做了修改)。codePen地址

var canvas = document.getElementById("canvas"),  //獲取canvas元素
    context = canvas.getContext("2d"),           //獲取畫圖環境,指明為2d
    centerX = canvas.width/2,                    //Canvas中心點x軸坐標
    centerY = canvas.height/2,                   //Canvas中心點y軸坐標
    rad = Math.PI*2/100,                         //將360度分成100份,那么每一份就是rad度
    speed = 0.1;                                  //加載的快慢就靠它了
             
    //繪制藍色外圈
    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();
   }
         
    //動畫循環
    (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;
    }());
 

在上面的代碼段中,我們通過一個立即執行函數來執行我們的動畫循環,并在內部通過

window.requestAnimationFrame(drawFrame, canvas);

循環調用自身,requestAnimationFrame是一個新的API,作用與setTimeInterval一樣,不同的是它會根據瀏覽器的刷新頻率自動調整動畫的時間間隔。在循環中我們每次執行都會重新繪制藍色的圓弧,和白色的圓環和百分比加載的文字,由于每次繪制的時間間隔很小,只有十幾毫秒(主要看電腦),所以我們的肉眼是無法清楚地分別每一幀的畫面,這樣就形成了我們看到的動畫。該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)

經典的黑客帝國效果,Geek們的最愛。目前,已經被我封裝成插件,可供大家方便使用。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(""),                 //將文字拆分進一個數組
        font_size = 16,  //字體大小
        clumns = w / font_size,                     //文字降落的列數
        drops = [];

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

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

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

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

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

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

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

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

下一節,我們就正式開始我們的Canvas動畫之旅!??!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/79105.html

相關文章

  • 周一canvas動畫》——修改增強版

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

    shery 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<