成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Canvas繪制快應用開發(fā)工具的logo12.14

開發(fā) 開發(fā)工具
Canvas在Android原生開發(fā)和傳統(tǒng)HTML5開發(fā)的舞臺上都扮演著重要的角色,我們通過本文了解如何正確使用 canvas 畫布,以及如何通過 canvas 繪制復雜的圖形及動畫。

Canvas在Android原生開發(fā)和傳統(tǒng)HTML5開發(fā)的舞臺上都扮演著重要的角色,我們通過本文了解如何正確使用 canvas 畫布,以及如何通過 canvas 繪制復雜的圖形及動畫。

快應用官方文檔提供了快應用logo(如下圖)的繪制過程:

本文我們來學習一下快應用開發(fā)工具的logo(如下圖)的繪制過程:

分析圖片

用PhotoShop打開路徑為的圖片,并添加參考線,主要為了獲取透明邊框的寬度(你可以理解為圖片文件的padding)、藍色邊框的寬度、藍色圓弧的厚度、紅色圓點的直徑以及紅色和藍色的具體RGB代碼。

因為快應用的Canvas不支持透明背景(原文如下),所以本文成品略有瑕疵。

繪制白色填充和藍色邊框

Canvas 繪圖的兩大基本繪制方式就是繪制填充和描邊。所謂填充,就是指用指定的內容填滿所要繪制的圖形,最終生成一個實心的圖案,繪制填充矩形的方法是這樣的:ctx.fillRect(x, y, width, height);所謂描邊,就是沿著所要繪制的圖形邊緣,使用指定的內容進行描繪,最終生成的是空心的圖案,繪制描邊矩形的方法是這樣的ctx.strokeRect(x, y, width, height)。

看代碼望文生義就可以知道如果既要填充又要描邊,則不得不分別繪制兩次才能完成最終圖案,并且不能自定義描邊寬度。

為了能夠自定義描邊寬度,我們可以利用路徑來實現(xiàn)快應用開發(fā)工具的logo的藍色邊框和白色填充。繪制白色填充和藍色邊框的代碼如下:

  1. // 開始繪制路徑  
  2.   
  3. ctx.beginPath();  
  4.   
  5. // 起點(左上角)  
  6.   
  7. ctx.moveTo(r , r);  
  8.   
  9. // 繪制到第二個點的線段(左下角)  
  10.   
  11. ctx.lineTo(r, h - r );  
  12.   
  13. // 繪制到第三個點的線段(右下角)  
  14.   
  15. ctx.lineTo(h - r , h - r);  
  16.   
  17. // 繪制到終點的線段(右上角)  
  18.   
  19. ctx.lineTo(h - r, r );  
  20.   
  21. // 用線段閉合路徑(直接從終點連回到起點)  
  22.   
  23. ctx.closePath();  
  24.   
  25. // 描邊寬度  
  26.   
  27. ctx.lineWidth = r;  
  28.   
  29. // 定義描邊樣式,本次是純色  
  30.   
  31. ctx.strokeStyle = '#4286f5';  
  32.   
  33. // 繪制描邊  
  34.   
  35. ctx.stroke();  
  36.   
  37. // 定義填充樣式,用另一種格式的純色  
  38.   
  39. // 注意順序是R(紅色)、G(綠色)、B(藍色)、A(不透明度)而不是A、R、G、B  
  40.   
  41. ctx.fillStyle = 'rgba(255,255,255,255)';  
  42.   
  43. // 繪制填充  
  44.   
  45. ctx.fill();  
  46.   
  47. 官方文檔和我的注釋都很詳細,我補充幾點:  
  48.   
  49. 1、strokeStyle和fillStyle的值可以為線性漸變或中心漸變,本文只討論純色的情況  
  50.   
  51. 2、rgba的四個參數(shù)分別為R(紅色)、G(綠色)、B(藍色)、A(不透明度)而不是常說的A、R、G、B  
  52.   
  53. 繪制藍色圓弧和紅色圓點  
  54.   
  55. 藍色邊框和白色背景繪制了以后,下一步就是繪制藍色圓弧和紅色圓點了。紅色圓點的本質上就是一個實心圓,繪制實心圓的方法就是閉合的圓形路徑填充顏色。代碼如下:  
  56.   
  57. // 繪制紅色圓點  
  58.   
  59. ctx.beginPath();  
  60.   
  61. ctx.arc(h - 2 * s, h - 2.5 * s , s / 2 , 0, p * 2, false);  
  62.   
  63. ctx.fillStyle = 'rgb(234, 67, 53)'  
  64.   
  65. ctx.fill();  
  66.   
  67. 繪制圓弧的arc()方法的五個參數(shù)分別為圓心X坐標、圓心Y坐標、半徑、圓弧起點、圓弧終點、是否逆時針。弧度的計算方法為角度乘以 2*PI/360,幾個關鍵方向的弧度如下:左:0或2*PI,右:PI,上:P/2,下:P/2*3 。  
  68.   
  69. 弧線段的填充、描邊方式和線段一樣。  
  70.   
  71. 我們再繪制較復雜的藍色圓弧:  
  72.   
  73. // 繪制藍色圓弧  
  74.   
  75. ctx.beginPath();  
  76.   
  77. // arc()方法參數(shù)分別為圓心X坐標、圓心Y坐標、半徑、起點弧度、的終點弧度、是否是逆時針  
  78.   
  79. // 逆時針繪制空心內圈  
  80.   
  81. ctx.arc(h / 2, h / 2, h/6, -p / 4 , -p / 4 * 7, true);  
  82.   
  83. // 順時針繪制下側封邊  
  84.   
  85. ctx.arc(h / 2 + (h / 6 + s / 2) * q , h / 2 + (h / 6 + s / 2) * q , s / 2,-p / 4 , p / 4 * 7,false);  
  86.   
  87. // 順時針繪制實心外圈  
  88.   
  89. ctx.arc(h / 2, h / 2, h/6 + s, -p / 4 * 7, -p / 4, false);  
  90.   
  91. // 順時針繪制上側封邊  
  92.   
  93. ctx.arc(h / 2 + (h / 6 + s / 2) * q , h / 2 - (h / 6 + s / 2) * q , s / 2,-p / 4*7 , p / 4 ,false);  
  94.   
  95. // 填充顏色  
  96.   
  97. ctx.fillStyle = '#4286f5';  
  98.   
  99. ctx.fill();  


注意弧線也必須閉合,否則會出bug

成品和完整源碼

本文的成品如下圖所示:

上文提到快應用的Canvas暫時不支持透明背景,所以官方logo的透明邊框變成了白色邊框,這是一個瑕疵所在。

本文的完整源碼如下:

  1. <template>  
  2.   
  3. <div class="doc-page">  
  4.   
  5. <div class="content" >  
  6.   
  7. <canvas class="new_canvas" id="newCanvas"></canvas>  
  8.   
  9. </div>  
  10.   
  11. </div>  
  12.   
  13. </template>  
  14.   
  15. <style>  
  16.   
  17. .content {  
  18.   
  19. flex-direction: column;  
  20.   
  21. align-items: center;  
  22.   
  23. width: 100%;  
  24.   
  25. padding: 20px;  
  26.   
  27. background-color: #000000;  
  28.   
  29. }  
  30.   
  31. .new_canvas {  
  32.   
  33. height: 300px;  
  34.   
  35. width: 300px;  
  36.   
  37. background-color: #00000000;  
  38.   
  39. }  
  40.   
  41. </style>  
  42.   
  43. <script>  
  44.   
  45. export default {  
  46.   
  47. private: {  
  48.   
  49. drawComplete: false  
  50.   
  51. },  
  52.   
  53. onInit() {  
  54.   
  55. this.$page.setTitleBar({  
  56.   
  57. text: 'Canvas'  
  58.   
  59. })  
  60.   
  61. },  
  62.   
  63. onShow() {  
  64.   
  65. if(!this.drawComplete) {  
  66.   
  67. this.drawCanvas();  
  68.   
  69. }  
  70.   
  71. },  
  72.   
  73. drawCanvas() {  
  74.   
  75. const canvas = this.$element('newCanvas'); //獲取 canvas 組件  
  76.   
  77. const ctx = canvas.getContext('2d'); //獲取 canvas 繪圖上下文  
  78.   
  79. var r = 20;// 空白處和藍色邊框的寬度  
  80.   
  81. var h = 300;// 畫布大小  
  82.   
  83. var p = Math.PI;// 圓周率  
  84.   
  85. var q = Math.sin(45 * 2 * p / 360);// 45度角的正弦(角度乘以 2*PI/360就是弧度)  
  86.   
  87. var s = 30;// 藍色圓弧厚度和紅色圓點直徑  
  88.   
  89. // 開始繪制路徑  
  90.   
  91. ctx.beginPath();  
  92.   
  93. // 起點(左上角)  
  94.   
  95. ctx.moveTo(r , r);  
  96.   
  97. // 繪制到第二個點的線段(左下角)  
  98.   
  99. ctx.lineTo(r, h - r );  
  100.   
  101. // 繪制到第三個點的線段(右下角)  
  102.   
  103. ctx.lineTo(h - r , h - r);  
  104.   
  105. // 繪制到終點的線段(右上角)  
  106.   
  107. ctx.lineTo(h - r, r );  
  108.   
  109. // 用線段閉合路徑(直接從終點連回到起點)  
  110.   
  111. ctx.closePath();  
  112.   
  113. // 描邊寬度  
  114.   
  115. ctx.lineWidth = r;  
  116.   
  117. // 定義描邊樣式,本次是純色  
  118.   
  119. ctx.strokeStyle = '#4286f5';  
  120.   
  121. // 繪制描邊  
  122.   
  123. ctx.stroke();  
  124.   
  125. // 定義填充樣式,用另一種格式的純色  
  126.   
  127. // 注意順序是R(紅色)、G(綠色)、B(藍色)、A(不透明度)而不是A、R、G、B  
  128.   
  129. ctx.fillStyle = 'rgba(255,255,255,255)';  
  130.   
  131. // 繪制填充  
  132.   
  133. ctx.fill();  
  134.   
  135. // 繪制藍色圓弧  
  136.   
  137. ctx.beginPath();  
  138.   
  139. // arc()方法參數(shù)分別為圓心X坐標、圓心Y坐標、半徑、起點弧度、的終點弧度、是否是逆時針  
  140.   
  141. // 逆時針繪制空心內圈  
  142.   
  143. ctx.arc(h / 2, h / 2, h/6, -p / 4 , -p / 4 * 7, true);  
  144.   
  145. // 順時針繪制下側封邊  
  146.   
  147. ctx.arc(h / 2 + (h / 6 + s / 2) * q , h / 2 + (h / 6 + s / 2) * q , s / 2,-p / 4 , p / 4 * 7,false);  
  148.   
  149. // 順時針繪制實心外圈  
  150.   
  151. ctx.arc(h / 2, h / 2, h/6 + s, -p / 4 * 7, -p / 4, false);  
  152.   
  153. // 順時針繪制上側封邊  
  154.   
  155. ctx.arc(h / 2 + (h / 6 + s / 2) * q , h / 2 - (h / 6 + s / 2) * q , s / 2,-p / 4*7 , p / 4 ,false);  
  156.   
  157. // 填充顏色  
  158.   
  159. ctx.fillStyle = '#4286f5';  
  160.   
  161. ctx.fill();  
  162.   
  163. // 繪制紅色圓點  
  164.   
  165. ctx.beginPath();  
  166.   
  167. ctx.arc(h - 2 * s, h - 2.5 * s , s / 2 , 0, p * 2, false);  
  168.   
  169. ctx.fillStyle = 'rgb(234, 67, 53)'  
  170.   
  171. ctx.fill();  
  172.   
  173. this.drawComplete = true;  
  174.   
  175. }  
  176.   
  177. }  
  178.   
  179. </script>  

 

 

責任編輯:張燕妮 來源: 51CTO
相關推薦

2011-08-04 16:17:39

iPhone 開發(fā)工具

2011-08-04 16:28:01

iPhone 開發(fā)工具 Accessoriz

2010-09-10 13:19:48

放寬限制開發(fā)工具iPhone

2010-05-28 13:38:29

Linux開發(fā)工具

2012-12-24 09:42:11

大數(shù)據(jù)應用開發(fā)輔助開發(fā)工具大數(shù)據(jù)

2013-11-22 11:03:45

GoogleWeb開發(fā)工具

2012-03-08 21:38:26

Android

2012-03-09 13:56:27

MITAndroid開發(fā)工具

2010-09-10 10:59:48

蘋果iOS應用

2010-05-06 10:41:43

ibmdwLotusEclipse

2010-06-04 17:26:53

Linux 開發(fā)工具

2010-07-15 12:56:55

Perl 開發(fā)工具

2010-08-03 14:18:02

Flex開發(fā)工具

2013-11-21 10:21:25

2009-07-03 12:59:50

Java ServleJSP開發(fā)工具

2011-06-08 13:20:56

Android ARM

2010-07-26 13:45:14

Perl開發(fā)工具

2011-04-08 15:19:04

開發(fā)工具開發(fā)

2010-02-24 14:53:33

Python開發(fā)工具

2010-05-28 14:30:15

ibmdw業(yè)務應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区在线看 | 一级做a爰片性色毛片16美国 | 国产aⅴ爽av久久久久久久 | 国产精品日日做人人爱 | 中文视频在线 | 欧美精品一区二区免费视频 | 久久久亚洲一区 | 韩国久久| 久久久久久久久蜜桃 | 国产成人麻豆免费观看 | 羞羞视频网站免费观看 | 久热久热 | 欧美精品福利 | 狠狠艹| 一区二区视频 | 日韩综合在线播放 | 午夜欧美一区二区三区在线播放 | 成人国产精品 | 国产传媒毛片精品视频第一次 | 国产精品国产三级国产aⅴ中文 | 亚洲久草| 久久久久久久久综合 | 爱爱免费视频 | 欧美精品欧美精品系列 | 欧美国产日韩在线观看 | 国产免费观看一级国产 | 国产精品久久久久影院色老大 | 国产精品一区二区视频 | 久久精品国产一区二区三区不卡 | 久久99精品久久久久久秒播九色 | 精品亚洲一区二区三区 | 91免费在线 | 欧美日韩国产精品一区 | 99免费视频 | www视频在线观看 | 91视视频在线观看入口直接观看 | 欧美乱码精品一区二区三区 | 国产高清在线精品一区二区三区 | 91久久久久 | 99精品视频免费观看 | 日本黄色免费片 |