canvas路徑與子路徑詳解
路徑在canvas是一個十分重要的概念,但往往會被初學者忽略。
如果對它沒有良好的掌握,非常容易出現意想不到的問題。
首先看一段程式碼例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> window.onload = function () { let canvas = document.getElementById("canvas"); let ctx = canvas.getContext("2d"); ctx.moveTo(100, 100); ctx.lineTo(200, 100); } </script> </head> <body> <canvas id="canvas"></canvas> </body> </html>
程式碼目的是繪製一條直線,然而執行程式碼之後,發現頁面什麼都沒有。
這是因為moveTo與lineTo方法繪製了一條路徑,但是路徑還沒有進行描邊操作。
程式碼修改如下:
[JavaScript] 純文字檢視 複製程式碼window.onload = function () { let canvas = document.getElementById("canvas"); let ctx = canvas.getContext("2d"); ctx.moveTo(100, 100); ctx.lineTo(200, 100); ctx.stroke(); }
呼叫stroke方法進行描邊即可繪製出相應的直線。
上述程式碼展示的是初學者容易犯的一個錯誤,通過此例子引出本文主角,路徑。
一.路徑與子路徑:
路徑本身是很容易理解的,與PS中的路徑如出一轍。
通俗點說,路徑勾勒出影像的輪廓,然後對路徑進行描邊和填充,使其顯示出來。
canvas路徑特點如下:
在繪圖的任何時刻,只有一條路徑存在,此路徑可以擁有多個子路徑。
路徑由beginPath方法建立,子路徑可以利用canvas中的lineTo,或者arcTo等方法建立。
將描邊顏色設定為紅色,那麼此路徑中繪製的圖案的描邊顏色都是紅色,在此路徑中再繪製一條線,並將其描邊顏色設定為藍色,那麼整個路徑所有圖案描邊都會變成藍色,包括前面已經繪製的紅色線,本質是重新對整個路徑進行一次描邊,藍色描邊將紅色描邊覆蓋在下面(紅色描邊依然存在,不要理解為重置)。
更多內容可以參閱canvas繪製圖案是重疊繪製而不是重置一章節加深理解。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> window.onload = function () { let canvas = document.getElementById("ant"); let ctx = canvas.getContext("2d"); ctx.beginPath(); ctx.strokeStyle = "blue"; ctx.moveTo(30,20); ctx.lineTo(30,120); ctx.moveTo(50,200); ctx.lineTo(80,220); ctx.stroke(); } </script> </head> <body> <canvas id="ant" width="300" height="300"></canvas> </body> </html>
程式碼在一個路徑中繪製兩個子路徑,moveTo方法用來設定子路徑的起點位置。
關於moveTo方法的更多內容參閱canvas moveTo()一章節。
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> window.onload = function () { let canvas = document.getElementById("canvas"); let ctx = canvas.getContext("2d"); ctx.lineWidth = 6; ctx.strokeStyle = "red"; ctx.moveTo(100, 10); ctx.lineTo(100, 80); ctx.stroke(); ctx.strokeStyle = "blue"; ctx.lineTo(200, 80); ctx.stroke(); } </script> </head> <body> <canvas id="canvas"></canvas> </body> </html>
程式碼執行效果截圖如下:
會在當前路徑中重新再"塗抹"一遍描邊顏色,豎線的紅色描邊會被藍色覆蓋。
為了避免上述情況,beginPath方法的作用就得以體現。
程式碼修改如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> window.onload = function () { let canvas = document.getElementById("canvas"); let ctx = canvas.getContext("2d"); ctx.lineWidth = 6; ctx.strokeStyle = "red"; ctx.beginPath(); ctx.moveTo(100, 10); ctx.lineTo(100, 80); ctx.stroke(); ctx.beginPath(); ctx.moveTo(100, 80); ctx.lineTo(200, 80); ctx.strokeStyle = "blue"; ctx.stroke(); } </script> </head> <body> <canvas id="canvas"></canvas> </body> </html>
上述程式碼實現了預期效果,豎線和橫線具有不同的顏色。
這是因為使用beginPath方法可以開闢一條新的路徑,在新路徑上繪製的圖案會不對前面繪製的圖案產生影響。
更多關於路徑的更多知識可以參閱canvas beginPath()詳解一章節。
相關文章
- canvas 路徑與子路徑Canvas
- MPTCP 原始碼分析(二) 建立子路徑TCP原始碼
- MPTCP 原始碼分析(三) 子路徑選擇TCP原始碼
- HTML絕對路徑與相對路徑HTML
- canvas判斷點是否在路徑內Canvas斷點
- 深入解析Java絕對路徑與相對路徑Java
- Xcode外掛路徑、快取路徑、圖片壓縮工具路徑、程式碼片段路徑、symbolicatecrash路徑XCode快取Symbol
- Nginx location 和 proxy_pass路徑配置詳解Nginx
- HPUX11.31硬體路徑詳解UX
- C:/inetpub/logs/logfile/路徑詳解
- 機器人路徑規劃 A*與D*機器人路徑規劃演算法詳述機器人演算法
- HTML5 Canvas使用路徑——繪製圓形HTMLCanvas
- web專案絕對路徑與相對路徑的問題Web
- cookie path路徑與domain域CookieAI
- canvas 奇巧淫技(二)繪製箭頭路徑效果Canvas
- canvas學習筆記-繪製矩形及路徑(一)Canvas筆記
- html中的路徑的介紹:絕對路徑和相對路徑HTML
- Linux檔案的路徑定位-相對路徑和絕對路徑Linux
- 尤拉路徑
- 檔案的相對路徑和絕對路徑以及根相對路徑
- struts/Servlet,action轉到jsp後,路徑問題(struts2,jsp路徑,action路徑,action跳轉,相對路徑,絕對路徑)...ServletJS
- 檔案絕對路徑和相對路徑
- Java工程路徑及相對路徑(轉載)Java
- Jsp相對路徑和絕對路徑JS
- JAVAWEB——絕對路徑和相對路徑,到底加不加“/“,以及解決方案JavaWeb
- canvas 實現光線沿不規則路徑運動Canvas
- Core Graphic 指南:圓弧與路徑
- canvas createRadialGradient() 徑向漸變Canvas
- JAVA 取得當前目錄的路徑/Servlet/class/檔案路徑/web路徑/url地址JavaServletWeb
- 詳解智慧運維一體化建設實現路徑運維
- SVG之Path路徑詳解(二),全面解析貝塞爾曲線SVG
- nodejs路徑處理方法和絕對路徑NodeJS
- 【MFC】BROWSEINFO設定路徑,支援記憶上次路徑
- 絕對路徑和相對路徑的區別,
- javascript將相對路徑修改為絕對路徑JavaScript
- 絕對路徑和相對路徑的區別
- Qt的相對路徑轉為絕對路徑QT
- 智慧醫院2.0時代,詳解智慧醫院建設路徑與領域組成