站長資訊網
        最全最豐富的資訊網站

        怎么使用Canvas繪制虛線

        上一章節我們說到,線性路徑的繪制,主要利用movoTo(),lineTo()等方法,當然 Canvas 2D API 也提供了虛線的繪制方法,CanvasRenderingContext2D.setLineDash();

        下面我們就來看看虛線的繪制方法

        語法

        ctx.setLineDash(segments);

        參數 segments:

        一個Array數組。

        一組描述交替繪制線段和間距(坐標空間單位)長度的數字。

        如果數組元素的數量是奇數, 數組的元素會被復制并重復。例如, [5, 15, 25] 會變成 [5, 15, 25, 5, 15, 25]。

        這里最后一句話有可能我們沒有看明白,沒關系我們繼續往下看。

        我們先繪一條簡單的虛線

        function drawDashed(){    cxt.lineWidth = 4;    cxt.strokeStyle = 'green';    cxt.beginPath();    cxt.setLineDash([5, 15]);    cxt.moveTo(20, 20);    cxt.lineTo(400, 20);    cxt.stroke();  }

        怎么使用Canvas繪制虛線

        因此繪制虛線也是非常簡單,我們試著改變setLineDash()方法的參數看看結果有什么不同

        = 4= 'green'50, 60400, 60= 4= 'red'0, 100400, 100

        怎么使用Canvas繪制虛線

        從這個例子我們可以看出當我們的參數數組只有一個元素時我們的 “線段與間隔” 是相等的,當參數數組的元素為空時,我們繪制的是一條實線。

        我們在來看幾個例子

        function drawDashed(){      cxt.lineWidth = 4;        cxt.strokeStyle = 'blue';      cxt.beginPath();      cxt.setLineDash([20, 5]);      cxt.moveTo(20, 40);      cxt.lineTo(380, 40);      cxt.stroke();        cxt.strokeStyle = 'green';      cxt.beginPath();      cxt.setLineDash([10, 20, 30]);      cxt.moveTo(20, 80);      cxt.lineTo(380, 80);      cxt.stroke();        cxt.strokeStyle = 'red';      cxt.beginPath();      cxt.setLineDash([10, 20, 30, 40]);      cxt.moveTo(20, 120);      cxt.lineTo(380, 120);      cxt.stroke();  }

        怎么使用Canvas繪制虛線

        有上圖幾個例子我們可以看出,setLineDash()方法是根據參數中的元素在 “線段與間隔” 之間形成組,然后進行循環,進而繪制出虛線。

        但是第二個例子當中我們傳入的參數的元素個數是基數,看起來和參數元素為偶數時有點區別,它會復制元素并重復,

        這就是我們開始所說的 如果參數 segments元素的數量是奇數, 數組的元素會被復制并重復。[10, 20, 30] 會變成 [10, 20, 30, 10, 20, 30]。

        getLineDash 方法

        有setLineDash的方法去設置虛線的線段與間距,相應的有個方法是獲取虛線的線段和間距的方法。

        ctx.getLineDash()

        該方法返回一個 Array數組。一組描述交替繪制線段和間距(坐標空間單位)長度的數字。如果數組元素的數量是奇數,數組元素會被復制并重復。 例如, 設置線段為 [5, 15, 25] 將會得到以下返回值 [5, 15, 25, 5, 15, 25]。

        var canvas = document.getElementById("canvas");var ctx = canvas.getContext("2d");  ctx.setLineDash([5, 15]);ctx.beginPath();  ctx.moveTo(0,100);  ctx.lineTo(400, 100);  ctx.stroke();
        console.log(ctx.getLineDash()); // [5, 15]

        擴展CanvasRenderingContext2D 繪制虛線

        我們不僅可以利用 canvas API 繪制虛線,我們還可以擴展一個自己繪制虛線的方法。
        擴展思路:
        1. 獲取起點坐標
        2. 計算虛線的總長度,計算虛線包含多少短線然后循環繪制

        話不多說,我們直接上代碼

        var canvas = document.getElementById('canvas');var cxt = canvas.getContext('2d');var moveToFunction = CanvasRenderingContext2D.prototype.moveTo;  CanvasRenderingContext2D.prototype.moveToLocation = {};// 重新定義moveTo方法CanvasRenderingContext2D.prototype.moveTo = function (x, y){this.moveToLocation.x = x;this.moveToLocation.y = y;      moveToFunction.apply(this, [x, y]);  };  CanvasRenderingContext2D.prototype.dashedLineTo = function(x, y, dashedLength){      dashedLength = dashedLength === undefined ? 5 : dashedLength;var startX = this.moveToLocation.x;var startY = this.moveToLocation.y;var deltaX = x - startX;var deltaY = y - startY;var numberDash = Math.floor(Math.sqrt(deltaX*deltaX + deltaY*deltaY)/dashedLength);for(var i=0; i < numberDash; i++){this[i%2 === 0 ? 'moveTo' : 'lineTo'](startX + (deltaX/numberDash)*i, startY + (deltaY/numberDash)*i); //等同于this.moveTo(x, y)或者 this.LineTo(x, y)    }this.moveTo(x, y); //連續繪制虛線時,起點從當前點開始};//繪制虛線cxt.lineWidth = 3;  cxt.strokeStyle = 'green';  cxt.moveTo(20, 20);  cxt.dashedLineTo(200, 200);  cxt.dashedLineTo(300, 100, 10);  cxt.dashedLineTo(400, 300);  cxt.stroke();

        怎么使用Canvas繪制虛線

        總結:

        我們可以通過setLineDash()方法繪制虛線,該方法會以參數的元素個數為 的形式去進行 循環 繪制,但是要注意傳入方法是參數的元素個數

        我們還可以自定義擴展繪制虛線的方法,主要就是獲取起點進而計算線段數進行循環繪制

        對canvas繪制圖形感興趣的同學,請持續關注后續更新,如有不對的地方也請指出并多多交流。

        如需轉載,還請注明出處,非常感謝!

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 992tv精品视频tv在线观看| 亚洲精品国产成人99久久| 99久久免费国产精精品| 欧美成人精品欧美一级乱黄一区二区精品在线 | 一本色道久久88—综合亚洲精品| 国产A级毛片久久久精品毛片| 成人区人妻精品一区二区不卡网站| 最新国产精品精品视频| 欧美精品成人3d在线| 精品99久久aaa一级毛片| 99精品国产福利在线观看| 凹凸国产熟女精品视频app| 免费精品无码AV片在线观看| 日韩人妻无码精品无码中文字幕 | 日韩欧精品无码视频无删节| 精品亚洲视频在线观看| 国产精品99久久精品爆乳| 日本精品久久久中文字幕| 国产精品分类视频分类一区| 国产午夜精品一区二区三区| 久久精品国产亚洲精品2020| 久久夜色精品国产噜噜噜亚洲AV| 亚洲欧美精品SUV| 亚洲精品国产首次亮相| 无码人妻精品一区二| 日本精品自产拍在线观看中文| 久久精品国产亚洲AV不卡| 免费精品国产自产拍在线观看| 久久精品成人一区二区三区| 国产精品内射婷婷一级二| 国产精品日韩欧美在线第3页 | 91亚洲国产成人久久精品| 四虎国产精品永久地址49| 思思99热在线观看精品| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 国产精品福利一区二区| 好吊妞视频精品| 2021国产精品视频网站| 国产精品第1页| 久久精品亚洲男人的天堂| 久久精品人妻一区二区三区|