canvas學習總結三:繪製虛線

来源:http://www.cnblogs.com/beevesnoodles/archive/2017/06/21/7061426.html
-Advertisement-
Play Games

上一章節我們說到,線性路徑的繪製,主要利用movoTo(),lineTo()等方法,當然 Canvas 2D API 也提供了虛線的繪製方法,CanvasRenderingContext2D.setLineDash(); 下麵我們就來看看虛線的繪製方法 語法 參數 segments: 一個Array ...


上一章節我們說到,線性路徑的繪製,主要利用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();
}

 

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

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

 


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

 

我們在來看幾個例子

 

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();
}

 

 

 

有上圖幾個例子我們可以看出,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();

 

 

總結:

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

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

對canvas繪製圖形感興趣的同學,請持續關註後續更新,如有不對的地方也請指出並多多交流。

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 錯誤寫法 按照一般的方法return會報錯 需要使用 raise gen.Return(response.body) 代替return 官方例子 In Python 3.3, this exception is no longer necessary: the return statement ca ...
  • 兩者的區別主要集中以下幾個方面: 1.key是否允許為空 HashMap允許key為null,Hashtable不允許key為null。 2.value是否允許為空 HashMap允許value為空,Hashtbale不允許value為null。 3.線程是否安全 HashMap線程不安全,Hash ...
  • 題目描述 Like everyone else, FJ is always thinking up ways to increase his revenue. To this end, he has set up a series of tolls that the cows will pay wh ...
  • 前臺下載 ...
  • 本文轉自:http://blog.csdn.net/sinat_37328421/article/details/69267166 比方說你想配置預設路由為: $route['default_controller'] = 'index/home'; ci3.0之前是可以放在 controllers中 ...
  • 最近使用vue2.0重構項目, 需要實現一個分頁的表格, 沒有找到合適的分頁組件, 就自己寫了一個, 效果如下: 該項目是使用 vue-cli搭建的, 如果你的項目中沒有使用webpack,請根據代碼自己調整: 首先新建pagination.vue文件, 所有組件的代碼都寫在這裡, 寫這樣的組件並沒 ...
  • 1.javascript的typeof返回哪些數據類型 alert(typeof [1, 2]); //object alert(typeof 'leipeng'); //string var i = true; alert(typeof i); //boolean alert(typeof 1); ...
  • 在js中,字元串轉為數字類型是比較常見的,平時用的比較多的是parseFloat和parseInt這兩個方法。當然,除了這個方法之外還有一個Number;都是轉為數字類型,有什麼差別? 可以簡單的說Number的局限性更大。也就是說Number比parseFloat和parseInt對字元串的要求更 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...