canvas學習記錄

canvas指定的 id、width、height三個屬性 博个。

<canvas id="canvas" width="400" height="320" />

繪制圓形

需要執(zhí)行如下步驟:
開始創(chuàng)建路徑
使用圖形上下文對象的beginPath方法。

context.beginPath();
該方法不使用參數(shù)功偿,通過該方法開始路徑的創(chuàng)建盆佣。在幾次循環(huán)的創(chuàng)建路徑的過程中,每次開始創(chuàng)建時都要調(diào)用beginPath()方法。

創(chuàng)建圖形的路徑
創(chuàng)建圓形路徑時共耍,需要使用圖形上下文對象的arc方法虑灰。

context.arc(x, y, radius, startAngle, endAngle, anticlockwise);
該方法使用6個參數(shù),x為繪制圓形的起點橫坐標痹兜,y為繪制圓形的起點縱坐標穆咐,radius為圓形半徑,startAngle為開始角度佃蚜,endAngle為結(jié)束角度庸娱,anticlockwise為是否按順時針方向進行繪制。anticlockwise參數(shù)為一個布爾值的參數(shù)谐算,為true時熟尉,按順時針繪制,為false時洲脂,按逆時針繪制斤儿。

路徑創(chuàng)建完成后,關(guān)閉路徑
使用圖形上下文對象的closePath方法將路徑閉合恐锦。

context.closePath();
將路徑閉合后往果,路徑的創(chuàng)建工作就完成了,但這時只是路徑創(chuàng)建完畢一铅,還沒有真正繪制圖形陕贮。

設定繪制樣式,調(diào)用繪制方法潘飘,繪制路徑
使用fill()肮之、stroke()、fillStyle()和strokeStyle()指定繪制樣式卜录。

  var context = canvas.getContext('2d');
  context.fillStyle = '#cccccc';
  context.fillRect(0, 0, 400, 400);
  var n = 0;
  for(var i = 0;i<10; i++) {
    context.beginPath();
    context.arc(i * 25, i * 25, i * 10, 0, Math.PI * 2, true);
    context.closePath();
    context.fillStyle = 'rgba(255,0,255, 0.25)';
    context.fill();
  }

效果如下:

QQ截圖20200708103334.jpg

繪制漸變圖形

繪制線性漸變

漸變是指在填充時從一種顏色慢慢過渡到另一種顏色戈擒。最簡單的是兩點之間的線性漸變。
繪制線性漸變時艰毒,需要使用到LinearGradient對象筐高,可以使用圖形上下文對象的createLinearGradient()方法創(chuàng)建該對象。

context.createLinearGradient(xStart, yStart, xEnd, yEnd);
該方法有4個參數(shù)丑瞧,xStart為漸變起始點的橫坐標柑土,yStart為漸變起始點的縱坐標,xEnd為漸變結(jié)束點的橫坐標绊汹,yEnd為漸變結(jié)束點的縱坐標冰单。
在創(chuàng)建linearGradient對象后,使用addColorStop()方法設定漸變的顏色灸促。

context.addColorStop(offset, color);
offset參數(shù)為所設定的顏色離開漸變起始點的偏移量诫欠,該參數(shù)的值是一個范圍在0~1之間的浮點值涵卵,漸變起始點的偏移量為0,漸變結(jié)束點的偏移量為1荒叼。color為繪制時的顏色轿偎。
因為是漸變,所以至少需要使用兩次addColorStop方法以追加兩個顏色(開始顏色和結(jié)束顏色)被廓,可以追加多個顏色坏晦。例如從藍色漸變到白色然后漸變到綠色。這時藍色的位移量為0嫁乘,白色的位移量為0.5昆婿,綠色的位移量為1。
接著把fillStyle或strokeStyle設定為linearGradient對象蜓斧,然后執(zhí)行填充的方法仓蛆,就可以繪制漸變圖形了。

  var context = canvas.getContext('2d');
  var g1 = context.createLinearGradient(0, 0, 0, 300);
  g1.addColorStop(0, 'rgb(255, 255, 0)');
  g1.addColorStop(1, 'rgb(0, 255, 255)');
  context.fillStyle = g1;
  context.fillRect(0, 0, 400, 320);
  var n = 0;
  var g2 = context.createLinearGradient(0, 0, 300, 0);
  g2.addColorStop(0, 'rgba(0, 0, 255, 0.5)');
  g2.addColorStop(1, 'rgba(255, 0, 0, 0.5)');
  for(var i = 0; i < 10; i++) {
    context.beginPath();
    context.fillStyle = g2;
    context.arc(i * 25, i * 25, i * 10, 0, Math.PI * 2, true);
    context.closePath();
    context.fill();
  }

效果如圖:


image.png

<meta charset="utf-8">

給圖形繪制陰影

使用Canvas元素可以給圖形添加陰影效果挎春。
圖形上下文對象的關(guān)于陰影繪制的屬性:

  • shadowOffsetX:陰影的橫向位移量看疙,默認為0。
  • shadowOffsetY:陰影的縱向位移量直奋,默認為0能庆。
  • shadowColor:陰影的顏色。
  • shadowBlur:陰影的模糊范圍脚线,可選搁胆。屬性值是比0大的數(shù)字,否則將被忽略邮绿。
 function draw() {
    var canvas = document.getElementById('canvas');
    if (canvas == null) { return false; }
    var context = canvas.getContext('2d');
    context.fillStyle = "#ffffff";
    context.fillRect(0, 0, 400, 300);
    context.shadowOffsetX = 10;
    context.shadowOffsetY = 10;
    context.shadowColor = 'rgba(120,120,120,0.5)';
    context.shadowBlur = 7.5;
    // 圖形繪制
    context.translate(0,50);
    for(var i = 0;i < 3;i++){
      context.translate(50,50);
      create5Star(context);
      context.fill();
    }
  }
  function create5Star(context) {
    var n = 0;
    var dx = 100;
    var dy = 0;
    var s = 50;
    //創(chuàng)建路徑
    context.beginPath();
    context.fillStyle = 'rgba(255,215,0,0.5)';
    var x = Math.sin(0);
    var y = Math.cos(0);
    var dig = Math.PI / 5 * 4;
    for(var i = 0; i < 5; i++) {
      var x = Math.sin(i * dig);
      var y = Math.cos(i * dig);
      context.lineTo( dx + x * s,dy + y * s);
    }
    context.closePath();
  }
  draw()

效果如圖:

image.png

上面的代碼使用translate方法繪制了幾個呈移動狀態(tài)的五角星渠旁。同時給每個五角星都加上了陰影效果。繪制陰影的時候使用了圖形上下文對象的繪制陰影屬性斯碌,這幾個屬性與路徑無關(guān),只要設定一次之后肛度,全部五角星就都具有陰影效果了傻唾。
如果不想讓全部五角星都具有陰影效果,需要把shadowColor屬性設定為rgba(0, 0, 0, 0)承耿。

僅作學習使用冠骄,無商業(yè)用途,如有侵權(quán) 聯(lián)系刪除
參考文獻 http://www.reibang.com/p/6ea653cb02ac

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末加袋,一起剝皮案震驚了整個濱河市凛辣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌职烧,老刑警劉巖扁誓,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件防泵,死亡現(xiàn)場離奇詭異,居然都是意外死亡蝗敢,警方通過查閱死者的電腦和手機捷泞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寿谴,“玉大人锁右,你說我怎么就攤上這事⊙忍” “怎么了咏瑟?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痪署。 經(jīng)常有香客問我码泞,道長,這世上最難降的妖魔是什么惠桃? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任浦夷,我火速辦了婚禮,結(jié)果婚禮上辜王,老公的妹妹穿的比我還像新娘劈狐。我一直安慰自己,他們只是感情好呐馆,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布肥缔。 她就那樣靜靜地躺著,像睡著了一般汹来。 火紅的嫁衣襯著肌膚如雪续膳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天收班,我揣著相機與錄音坟岔,去河邊找鬼。 笑死摔桦,一個胖子當著我的面吹牛社付,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邻耕,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼鸥咖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兄世?” 一聲冷哼從身側(cè)響起啼辣,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎御滩,沒想到半個月后鸥拧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體党远,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年住涉,在試婚紗的時候發(fā)現(xiàn)自己被綠了麸锉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡舆声,死狀恐怖花沉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媳握,我是刑警寧澤碱屁,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站蛾找,受9級特大地震影響娩脾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜打毛,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一柿赊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幻枉,春花似錦碰声、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椿肩,卻和暖如春瞻颂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背郑象。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工贡这, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厂榛。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓盖矫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親噪沙。 傳聞我的和親對象是個殘疾皇子炼彪,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348