Canvas從入門(mén)到放棄 (二)

在慕課網(wǎng)上學(xué)習(xí)了 Canvas繪圖詳解 這門(mén)教程宝穗,寫(xiě)了這篇canvas教程次哈,想和大家分享學(xué)習(xí)的過(guò)程情妖,希望和大家共同進(jìn)步.=_=
這么久才更教程的第二篇睬关,我該打(;′⌒`)

1. 效果展示

完整代碼請(qǐng)戳Lesson2/demo9.html

效果展示.png

2. 圖像的變換和保存

2.1 位移 translate(x,y)

完整代碼請(qǐng)戳Lesson2/demo1.html

 //第一個(gè)正方形從(0,0)點(diǎn)開(kāi)始毡证,x軸平移100像素电爹,y軸平移100像素
   context.fillStyle = "#559ABB";
   context.translate(100,100);
   context.fillRect(0, 0, 100, 100);
        
   //第二個(gè)正方形從(100,100)點(diǎn)開(kāi)始,x軸平移100像素料睛,y軸平移100像素
   context.fillStyle = "#F8D184";
   context.translate(100,100);
   context.fillRect(0, 0, 100, 100);

可以看出兩個(gè)translate的效果是疊加的丐箩,為了使用圖形變換時(shí)效果不影響可保存canvas的狀態(tài)。

圖片.png

Canvas狀態(tài)的保存和恢復(fù)

save(): 保存當(dāng)前圖形的狀態(tài)
restore(): 返回save的canvas的所有狀態(tài)

完整代碼請(qǐng)戳Lesson2/demo2.html

  //保存第一個(gè)正方形的狀態(tài)
  //從(0,0)點(diǎn)開(kāi)始恤煞,x軸平移100像素屎勘,y軸平移100像素
  context.save();
  context.fillStyle = "#559ABB";
  context.translate(100,100);
  context.fillRect(0, 0, 100, 100);
  context.restore();

  //保存第二個(gè)正方形的狀態(tài)
  //從(0,0)點(diǎn)開(kāi)始,x軸平移100像素阱州,y軸平移100像素
  context.save();
  context.fillStyle = "#F8D184";
  context.translate(100,100);
  context.fillRect(0, 0, 100, 100);
  context.restore();

均以(0,0)為起點(diǎn)x,y軸平移100像素,藍(lán)色的正方形被黃色的正方形蓋住了

圖片.png

2.2 旋轉(zhuǎn)rotate(deg)

使用translate,rotate的星空?qǐng)D
完整代碼請(qǐng)戳Lesson2/demo3.html

 window.onload = function () {
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    canvas.width = 400;
    canvas.height = 400;
    context.fillStyle = "#283D52";
    context.fillRect(0, 0, canvas.width, canvas.height);
    //假設(shè)畫(huà)布中有50個(gè)星星
    for (var i = 0; i <= 50; i++) {
        //x軸偏移量
        var x = Math.random() * canvas.width;
        //y軸偏移量
        var y = Math.random() * canvas.height;
        //任意角度
        var a = Math.random() * 360;
        draw(context, x, y, a);
    }
};

    //繪制星星
    function draw(cxt, x, y, rot) {
        //保存canvas的狀態(tài)
        cxt.save();
        //x,y軸的偏移量
        cxt.translate(x, y);
        //旋轉(zhuǎn)的角度
        cxt.rotate(rot / 180 * Math.PI);
        //繪制星星的路徑
        starPath(cxt);

        cxt.fillStyle = "#F8D184";
        cxt.strokeStyle = "#FAD085";
        cxt.lineWidth = 2;
        cxt.lineJoin = "round";

        cxt.fill();
        cxt.stroke();
        cxt.restore();
    }
    
    //繪制一個(gè)星星的路徑,這里繪制星星時(shí)設(shè)定大圓半徑為10法梯,小圓半徑為大圓半徑的一半
    function starPath(cxt) {
        cxt.beginPath();
        for (var i = 0; i < 5; i++) {
            cxt.lineTo(Math.cos((18 + i * 72) / 180 * Math.PI) * 10,
                   -Math.sin((18 + i * 72) / 180 * Math.PI) * 10);
            cxt.lineTo(Math.cos((54 + i * 72) / 180 * Math.PI) * 0.5 * 10,
                   -Math.sin((54 + i * 72) / 180 * Math.PI) * 0.5 * 10);
        }
        cxt.closePath();
    }

如何繪制星星 可參考 Canvas從入門(mén)到放棄 (一)
只有平移和旋轉(zhuǎn)苔货,所有星星都是一樣大

圖片.png
2.3 縮放scale(sx,sy)

完整代碼請(qǐng)戳Lesson2/demo4.html

window.onload = function () {
    var canvas = document.getElementById("canvas");
    canvas.width = 400;
    canvas.height = 400;
    var context = canvas.getContext("2d");

    context.fillStyle = "#283D52";
    context.fillRect(0, 0, canvas.width, canvas.height);
    for (var i = 0; i < 80; i++) {
        //大圓半徑在[5-15)之間
        var R = Math.random() * 10 + 5;
        //x軸偏移量 
        var x = Math.random() * canvas.width;
        //y軸偏移量 
        var y =Math.random() * canvas.height;
        //旋轉(zhuǎn)角度
        var a = Math.random() * 360;
        drawStar(context, x, y, R, a);
     }
};
    function drawStar(cxt, x, y, R, rot) {
        cxt.save();
        //x,y軸的偏移量
        cxt.translate(x, y);
        //旋轉(zhuǎn)的角度
        cxt.rotate(rot / 180 * Math.PI);
        //縮放的大小
        cxt.scale(R, R);
        drawPath(cxt);

        cxt.fillStyle = "#F8D184";
        cxt.lineJoin = "round";
        cxt.fill();
        cxt.restore();
    }
    //繪制一個(gè)星星的路徑(繪制的星星看不見(jiàn),因?yàn)檫@里沒(méi)有設(shè)置半徑立哑,在上面用scale控制半徑)
    function drawPath(cxt) {
        cxt.beginPath();
        for (var i = 0; i < 5; i++) {
            //繪制大圓上的五個(gè)坐標(biāo)點(diǎn)
            cxt.lineTo(Math.cos((18 + i * 72 ) / 180 * Math.PI),
                   -Math.sin((18 + i * 72) / 180 * Math.PI));
            //繪制小圓上的五個(gè)坐標(biāo)點(diǎn)
            cxt.lineTo(Math.cos((54 + i * 72) / 180 * Math.PI) * 0.5,
                   -Math.sin((54 + i * 72) / 180 * Math.PI) *0.5);
        }
        cxt.closePath();
    }
圖片.png

3. 填充樣式

3.1 漸變

線(xiàn)性漸變

step1: 設(shè)置漸變線(xiàn)

//參數(shù)是兩個(gè)坐標(biāo)夜惭,構(gòu)成了一條線(xiàn)段
var linearGrad = context.createLinearGradient(xstart,ystart,xend,yend)

step 2:在漸變線(xiàn)上設(shè)置關(guān)鍵色

//stop決定關(guān)鍵色的位置,color決定關(guān)鍵色的顏色
 linearGrad.addColorStop(stop,color);

繪制一片線(xiàn)性漸變的星空
完整代碼請(qǐng)戳Lesson2/demo5.html

   var canvas = document.getElementById("canvas");
   canvas.width = 400;
   canvas.height = 400;
   var context = canvas.getContext("2d");

   var linearGrad = context.createLinearGradient(0, 0, 0, 400);
   linearGrad.addColorStop(0, '#1C213B');
   linearGrad.addColorStop(0.25, '#2A2D49');
   linearGrad.addColorStop(0.5, '#4D4D5F');
   linearGrad.addColorStop(0.75, '#916580');
   linearGrad.addColorStop(1.0, '#C3919A');
   context.fillStyle = linearGrad;
   context.fillRect(0, 0, canvas.width, canvas.height);
線(xiàn)性漸變.png

徑向漸變

step 1: 設(shè)置漸變線(xiàn)

   //參數(shù)為第一個(gè)圓的圓心铛绰,半徑诈茧,第二個(gè)圓的圓心,半徑
   var linearGrad = context.createRadialGradient(x0,y0,r0,x1,y1,r1);

step 2: 在漸變線(xiàn)上設(shè)置漸變色

//stop決定關(guān)鍵色的位置捂掰,color決定關(guān)鍵色的顏色
linearGrad.addColorStop(stop,color);

繪制一片徑向漸變的星空
完整代碼請(qǐng)戳Lesson2/demo6.html

 var canvas = document.getElementById("canvas");
 canvas.width = 400;
 canvas.height = 400;
 var context = canvas.getContext("2d");

 var linearGrad = context.createRadialGradient(canvas.width/2, canvas.height, 0, 
                     canvas.width/2,canvas.height,canvas.height);
linearGrad.addColorStop(0, '#CC99A1');
linearGrad.addColorStop(1.0, '#213244');

context.fillStyle = linearGrad;
context.fillRect(0, 0, canvas.width, canvas.height);
徑向漸變.png

3.2 使用圖片填充畫(huà)布

完整代碼請(qǐng)戳Lesson2/demo7.html

//第一個(gè)參數(shù)敢会,表示填充一個(gè)圖片,第二個(gè)參數(shù)填充方式
createPattern(img,repeat-style)
 window.onload = function () {
    var canvas = document.getElementById("canvas");
    canvas.width = 300;
    canvas.height = 300;
    var context = canvas.getContext("2d");

  //創(chuàng)建一個(gè)圖片對(duì)象
    var backGroundImage = new Image();
    backGroundImage.src = "lemon.png";
    backGroundImage.onload = function () {
        var pattern = context.createPattern(backGroundImage, "repeat");
        context.fillStyle = pattern;
        context.fillRect(0, 0, 300, 300);
    }
}
圖片填充.png
3.3 使用另一個(gè)canvas填充畫(huà)布

完整代碼請(qǐng)戳Lesson2/demo8.html

//第一個(gè)參數(shù)这嚣,表示填充另外一個(gè)畫(huà)布鸥昏,第二個(gè)參數(shù)填充方式
createPattern(canvas,repeat-style)
window.onload = function () {
    var canvas = document.getElementById("canvas");
    canvas.width = 400;
    canvas.height = 400;
    var context = canvas.getContext("2d");

    var backCanvas = creatBackCanvas();
    var pattern = context.createPattern(backCanvas, "repeat");
    context.fillStyle = pattern;
    context.fillRect(0, 0, 400, 400);
};
 //創(chuàng)建一個(gè)背景畫(huà)布,畫(huà)布中繪制一顆星星
function creatBackCanvas() {
    var backCanvas = document.createElement("canvas");
    backCanvas.width = 100;
    backCanvas.height = 100;

    var backCanvasContext = backCanvas.getContext("2d");
    drawStar(backCanvasContext, 50, 50, 20, 0);
    return backCanvas;
}
//繪制星星
function drawStar(cxt, x, y, R, a) {
    cxt.beginPath();
    for (let i = 0; i < 5; i++) {
        cxt.lineTo(Math.cos((18 + i * 72 - a) / 180 * Math.PI) * R + x,
                  -Math.sin((18 + i * 72 - a) / 180 * Math.PI) * R + y);
        cxt.lineTo(Math.cos((54 + i * 72 - a) / 180 * Math.PI) * R/2 + x,
                  -Math.sin((54 + i * 72 - a) / 180 * Math.PI) * R/2 + y);
    }
    cxt.closePath();

    cxt.fillStyle = "#F8D184";
    cxt.strokeStyle = "#FAD085";
    cxt.lineWidth = 3;
    cxt.lineJoin = "round";
    cxt.fill();
    cxt.stroke();
}
使用canvas填充.png

總結(jié):填充樣式 fillStyle

fillStyle = color   (顏色)
            gradient(漸變)
            image   (圖片)
            canvas  (畫(huà)布)
         

下節(jié)預(yù)告:曲線(xiàn)的繪制姐帚,文字的渲染

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吏垮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膳汪,老刑警劉巖唯蝶,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異遗嗽,居然都是意外死亡姻蚓,警方通過(guò)查閱死者的電腦和手機(jī)竿屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人防症,你說(shuō)我怎么就攤上這事≈饨唬” “怎么了氯窍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)锤躁。 經(jīng)常有香客問(wèn)我搁料,道長(zhǎng),這世上最難降的妖魔是什么系羞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任郭计,我火速辦了婚禮,結(jié)果婚禮上椒振,老公的妹妹穿的比我還像新娘昭伸。我一直安慰自己,他們只是感情好澎迎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布庐杨。 她就那樣靜靜地躺著,像睡著了一般夹供。 火紅的嫁衣襯著肌膚如雪灵份。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天哮洽,我揣著相機(jī)與錄音填渠,去河邊找鬼。 笑死鸟辅,一個(gè)胖子當(dāng)著我的面吹牛氛什,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匪凉,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屉更,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了洒缀?” 一聲冷哼從身側(cè)響起瑰谜,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤欺冀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后萨脑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體隐轩,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年渤早,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了职车。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹊杖,死狀恐怖悴灵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骂蓖,我是刑警寧澤积瞒,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站登下,受9級(jí)特大地震影響茫孔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜被芳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一缰贝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畔濒,春花似錦剩晴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至壹将,卻和暖如春嗤攻,著一層夾襖步出監(jiān)牢的瞬間毛嫉,已是汗流浹背诽俯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留承粤,地道東北人暴区。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辛臊,于是被迫代替她去往敵國(guó)和親仙粱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一:canvas簡(jiǎn)介 1.1什么是canvas彻舰? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,683評(píng)論 2 32
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,114評(píng)論 25 707
  • 一伐割、canvas簡(jiǎn)介 1.1 什么是canvas候味?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    Looog閱讀 3,942評(píng)論 3 40
  • 書(shū)中代碼示例效果展示:Core HTML5 Canvas Examples 基礎(chǔ)知識(shí) canvas元素 canva...
    szu_bee閱讀 2,826評(píng)論 2 28
  • 臺(tái)上節(jié)目正如火如荼地進(jìn)行著,筱熙看著主持人亦凡隔心,而不遠(yuǎn)處又有一雙眼睛盯著筱熙看白群,那就是小武,眼看著下一個(gè)節(jié)目就是小...
    哆啦B夢(mèng)666閱讀 863評(píng)論 0 0