canvas 填充覆蓋描邊
填充和描邊是canvas中最為基本的操作,本文不做詳細介紹。
更多內容可以參閱canvas 設定矩形樣式一章節。
但是有時候,這些操作會帶來令人奇怪的現象,比如本文將要介紹的填充覆蓋描邊。
首先看一段程式碼例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <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.rect(10, 10, 100, 100); ctx.lineWidth=10; ctx.strokeStyle="blue"; ctx.fillStyle="red"; ctx.stroke(); ctx.fill(); } </script> </head> <body> <canvas id="canvas" width="300" height="150"></canvas> </body> </html>
程式碼執行效果截圖如下:
程式碼分析如下:
(1).lineWidth屬性設定描邊寬度為10px,也就是邊框的厚度。
(2).fillStyle屬性設定填充顏色為紅色。
(3).很明顯邊框的描邊寬度沒有10px,也就是它很可能被填充遮蓋了。
原理很簡單,canvas繪製線條的時候,並不是沿著它的起始位置向外擴充套件,而是將這個起始位置作為中線向兩側擴充套件,這麼說可能大家還不明白,具體參閱canvas lineWidth繪製原理一章節。
如果不想出現上述現象,可以採用如下解決方案:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <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.rect(10, 10, 100, 100); ctx.lineWidth=10; ctx.strokeStyle="blue"; ctx.fillStyle="red"; ctx.fill(); ctx.stroke(); } </script> </head> <body> <canvas id="canvas" width="300" height="150"></canvas> </body> </html>
程式碼執行效果截圖如下:
上述程式碼的表現已經恢復正常,很簡單隻要將ctx.fill方法和ctx.stroke方法調整一下位置即可。
也就是先填充再描邊,那麼描邊就會覆蓋在填充之上,後來者居上,很輕鬆解決此問題。
在網上也有關於此方面的解決方案,最好還是要了解出現此問題的原理。
可以做到舉一反三,而不是頭痛醫頭腳痛醫腳,僅浮在表面。
更多canvas知識可以參閱canvas教程板塊。
相關文章
- canvas 描邊與填充Canvas
- canvas描邊和填充介紹Canvas
- SVG 文字填充和描邊SVG
- canvas strokeText() 文字描邊Canvas
- mysql索引覆蓋掃描優化MySql索引優化
- SVG 填充、描邊和透明度設定SVG
- 短視訊系統原始碼,如何給button控制元件新增描邊、填充背景和描邊原始碼控制元件
- canvas fillText() 文字填充Canvas
- canvas fillText() 填充文字Canvas
- canvas填充樣式Canvas
- 多邊形填充-活動邊表法
- Mysql索引覆蓋MySql索引
- 最小圓覆蓋
- 程式碼覆蓋率與測試覆蓋率比較
- 企業WiFi覆蓋,解決覆蓋四大難題WiFi
- 第9條:覆蓋equals時總要覆蓋hashCode方法
- Java方法覆蓋和變數覆蓋的區別詳解Java變數
- EMMA 覆蓋率工具
- 語法:Python中的可覆蓋物件與不可覆蓋物件Python物件
- pHp程式碼覆蓋率PHP
- php實現矩形覆蓋PHP
- 程式碼覆蓋率分析
- 線段覆蓋問題
- 四、建立覆蓋網路--Flannel
- ESLint: 規則配置覆蓋EsLint
- 76. 最小覆蓋子串
- 最大匹配、最小頂點覆蓋、最大獨立集、最小路徑覆蓋(轉)(再轉)
- 4連通域邊界填充演算法和8連通域邊界填充演算法C++演算法C++
- iOS 覆蓋率檢測原理與增量程式碼測試覆蓋率工具實現iOS
- idea2022.1 檢視單測覆蓋率展示分支覆蓋率Idea
- 使用CustomForwardRendererData做描邊效果Forward
- 【高德地圖API】從零開始學高德JS API(三)覆蓋物——標註|折線|多邊形|資訊視窗|聚合marker|麻點圖|圖片覆蓋物地圖APIJS
- MySQL 的覆蓋索引與回表MySql索引
- 【離散優化】覆蓋問題優化
- 超市無線覆蓋的需求分析
- 室外無線覆蓋解決方案
- Angular CDK Overlay 彈出覆蓋物Angular
- document.write() 清空覆蓋內容