canvas由淺入深(一):從折線到三角形

從基礎研究canvas,我們從簡單的線段開始,一步一步繪制復雜圖形

html code

<style type="text/css">
    #can1{background-color: cadetblue;}
</style>
<div class="justify-content-sm-center text-center">
    <canvas id="can1" width="800" height="800"></canvas>
</div>

在html里,我們定義了一個畫布,為了更加直觀的看出畫布的范圍,添加了背景顏色.
然后我們開始渲染上下文

var can1 = document.getElementById('can1');
//渲染畫布的上下文the rendering context
var ctx = can1.getContext('2d');

<canvas> 元素有一個叫做 getContext() 的方法,這個方法是用來獲得渲染上下文和它的繪畫功能。

先畫個矩形

ctx.fillStyle = "#058";//設置顏色
//繪制一個填充的矩形 .fillRect(x,y,width,height);
ctx.fillRect(10,10,60,50);

矩形使用.fillRect(x,y,width,height);繪制

再畫個半透明矩形,并讓他們的一部分重疊在一起。

ctx.fillStyle = "rgba(186, 41, 80, 0.73)";//設置半透明顏色
ctx.fillRect(50,10,50,80);//繪制一個填充的矩形

效果如圖所示:


相交的矩形

通過上面的熱身,你已經(jīng)了解了canvas繪圖,下面我們從線段開始

繪制一段折線

ctx.beginPath();
ctx.moveTo(180,10);
ctx.lineTo(230,30);
ctx.lineTo(180,50);
ctx.lineWidth=5;
ctx.strokeStyle = '#058';
ctx.stroke();

上面的代碼,我們用到了以下幾個函數(shù)和方法:
lineTo()方法
添加一個新點,然后創(chuàng)建從該點到畫布中最后指定點的線條(該方法并不會創(chuàng)建線條)

beginPath()
新建一條路徑,圖形繪制命令被指向到路徑上生成路徑。

fillRect()
該方法繪制“已填色”的矩形。默認的填充顏色是黑色。

stroke()
通過線條來繪制圖形輪廓。

繪制一個封閉的圖形——三角形

在上面的代碼的基礎上,我們只需要再加個函數(shù)ctx.closePath();就能夠封閉這個折線,

我們一般把代碼分成三部分來寫,這樣的代碼比較清晰易懂。

//1、開始定義路徑
ctx.beginPath();
ctx.moveTo(150,10);
ctx.lineTo(200,30);
ctx.lineTo(150,50);
ctx.closePath();

//2、開始設置狀態(tài)
ctx.lineWidth=8;
ctx.fillStyle = '#indianred';
ctx.strokeStyle = '#fbbe0d';

//3、開始繪制
ctx.fill();
ctx.stroke();

因為canvas是基于狀態(tài)繪制的,也就是說,把canvas的各種設置、定義和最后的繪制,分開來寫。

以上代碼,我們又使用了一個函數(shù):

closePath()

閉合路徑之后圖形繪制命令又重新指向到上下文中。

最終效果:


折線和三角形

這樣一行一行寫,不能方便的在別處復用,我們還是把它封裝成函數(shù),使用時,只需調(diào)用即可

//繪制三角形的函數(shù)
//定義了繪制起點的x軸坐標,y軸坐標,圖形寬度w,圖形高度h,邊框粗細bW,邊框顏色bC,填充顏色fC
function drawTriangle(x, y, w, h, bW, bC, fC){
    ctx.beginPath();
    ctx.moveTo(x,y);
    ctx.lineTo(x + w,y+h/2);
    ctx.lineTo(x, y + h);
    ctx.closePath();
    
    ctx.lineWidth = bW;
    ctx.fillStyle = fC;
    ctx.strokeStyle = bC;
    
    ctx.fill();
    ctx.stroke();
}

drawTriangle(30,180,100,90,8,'#8ab62f','#fba670');
用函數(shù)封裝的三角形
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容