<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        canvas實現按住鼠標移動繪制出軌跡的方法實例

        來源:懂視網 責編:小采 時間:2020-11-27 18:49:22
        文檔

        canvas實現按住鼠標移動繪制出軌跡的方法實例

        canvas實現按住鼠標移動繪制出軌跡的方法實例:需求在一塊canvas畫布上,初始狀態畫布什么都沒有,現在,我想給畫布加一點鼠標事件,用鼠標在畫布上寫字。具體的效果是鼠標移動到畫布上任意一點,然后按住鼠標,移動鼠標的位置,就可以開始寫字啦!本文作為學習canvas的第一篇收獲,很多人初學canvas
        推薦度:
        導讀canvas實現按住鼠標移動繪制出軌跡的方法實例:需求在一塊canvas畫布上,初始狀態畫布什么都沒有,現在,我想給畫布加一點鼠標事件,用鼠標在畫布上寫字。具體的效果是鼠標移動到畫布上任意一點,然后按住鼠標,移動鼠標的位置,就可以開始寫字啦!本文作為學習canvas的第一篇收獲,很多人初學canvas

        需求

        在一塊canvas畫布上,初始狀態畫布什么都沒有,現在,我想給畫布加一點鼠標事件,用鼠標在畫布上寫字。具體的效果是鼠標移動到畫布上任意一點,然后按住鼠標,移動鼠標的位置,就可以開始寫字啦!

        本文作為學習canvas的第一篇收獲,很多人初學canvas做的第一個demo是實現一個“鐘”,當然,我也實現了一個,不過不講這個,而是講講一個更有趣、也更簡單的玩意。

        鼠標按住繪制軌跡

        原理

        先簡單分析下思路,首先我們需要一個canvas畫布,然后計算鼠標在畫布上的位置,給鼠標綁定onmousedown事件和onmousemove事件,在移動過程中繪制出路徑,松開鼠標的時候,繪制結束。

        這個思路雖然很簡單,但是里面有些地方需要小技巧實現。

        1、需要一個html文件,包含canvas元素。

        這是一個寬度800,高度400的畫布。為什么沒有寫px呢?哦,暫時沒搞懂,canvas文檔推薦的。

        <!doctype html>
        <html class="no-js" lang="zh">
         <head>
         <meta charset="utf-8">
         <meta http-equiv="x-ua-compatible" content="ie=edge">
         <title>canvas學習</title>
         <meta name="description" content="">
         <meta name="viewport" content="width=device-width, initial-scale=1">
        
         <link rel="manifest" href="site.webmanifest">
         <link rel="apple-touch-icon" href="icon.png">
         <link rel="stylesheet" href="css/main.css">
         </head>
         <body>
         <canvas id="theCanvas" width="800" height="400"></canvas>
         <script src="js/main.js"></script>
         </body>
        </html>

        2、判斷當前環境是否支持canvas。

        在main.js中,我們寫一個自執行函數,下面是兼容性判斷的代碼片段,“代碼主體”中將會是實現需求的核心。

        (function() {
         let theCanvas = document.querySelector('#theCanvas')
         if (!theCanvas || !theCanvas.getContext) {
         //不兼容canvas
         return false
         } else {
         //代碼主體
         }
        })()

        3、獲取2d對象。

         let context = theCanvas.getContext('2d')

        4、獲取當前鼠標相對于canvas的坐標。

        為什么要獲取這個坐標呢?因為鼠標默認是獲取當前窗口的相對坐標,而canvas可以位于頁面上的任何位置,所以需要通過計算才能得到真實的鼠標坐標。

        將獲取鼠標相對于canvas的真實坐標封裝成了一個函數,如果你覺得抽象,可以在草稿紙上畫圖來理解為什么要這么運算。

        通常情況下,可以是x - rect.left和y - rect.top。但為什么實際上卻是x - rect.left * (canvas.width/rect.width)呢?

        canvas.width/rect.width表示判斷canvas中存在的縮放行為,求出縮放的倍數。

        const windowToCanvas = (canvas, x, y) => {
         //獲取canvas元素距離窗口的一些屬性,MDN上有解釋
         let rect = canvas.getBoundingClientRect()
         //x和y參數分別傳入的是鼠標距離窗口的坐標,然后減去canvas距離窗口左邊和頂部的距離。
         return {
         x: x - rect.left * (canvas.width/rect.width),
         y: y - rect.top * (canvas.height/rect.height)
         }
        }

        5、有了第4步的利器函數,我們可以給canvas加上鼠標事件了!

        先給鼠標綁定按下onmousedown事件,用moveTo繪制坐標起點。

        theCanvas.onmousedown = function(e) {
         //獲得鼠標按下的點相對canvas的坐標。
         let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
         //es6的解構賦值
         let { x, y } = ele
         //繪制起點。
         context.moveTo(x, y)
        }

        6、移動鼠標的時候,沒有鼠標長按事件,又該怎么監聽呢?

        這里用到的小技巧是在onmousedown內部再執行一個onmousemove(鼠標移動)事件,這樣就能監聽按住鼠標并且移動了。

        theCanvas.onmousedown = function(e) {
         //獲得鼠標按下的點相對canvas的坐標。
         let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
         //es6的解構賦值
         let { x, y } = ele
         //繪制起點。
         context.moveTo(x, y)
         //鼠標移動事件
         theCanvas.onmousemove = (e) => {
         //移動時獲取新的坐標位置,用lineTo記錄當前的坐標,然后stroke繪制上一個點到當前點的路徑
         let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
         let { x, y } = ele
         context.lineTo(x, y)
         context.stroke()
         }
        }

        7、鼠標松開的時候,不再繪制路徑。

        有什么辦法可以讓onmouseup事件中阻止掉上面監聽的2種事件呢?方法挺多的,設置onmousedown和onmousemove為null算是一種,我這里用到了“開關”。isAllowDrawLine設置為bool值,來控制函數是否執行,具體代碼可以看下面完整的源碼。

        源碼

        分為3個文件,index.html、main.js、utils.js,這里用到了es6的語法,我是使用parcle配置好了開發環境,所以不會有報錯,如果你直接,運行的時候出現錯誤,在無法升級瀏覽器的情況下,可以將es6語法改成es5.

        1、index.html
        上面已經展示了,不再復述。

        2、main.js

        import { windowToCanvas } from './utils'
        (function() {
         let theCanvas = document.querySelector('#theCanvas')
         if (!theCanvas || !theCanvas.getContext) {
         return false
         } else {
         let context = theCanvas.getContext('2d')
         let isAllowDrawLine = false
         theCanvas.onmousedown = function(e) {
         isAllowDrawLine = true
         let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
         let { x, y } = ele
         context.moveTo(x, y)
         theCanvas.onmousemove = (e) => {
         if (isAllowDrawLine) {
         let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
         let { x, y } = ele
         context.lineTo(x, y)
         context.stroke()
         }
         }
         }
         theCanvas.onmouseup = function() {
         isAllowDrawLine = false
         }
         }
        })()

        3、utils.js

        /*
        * 獲取鼠標在canvas上的坐標
        * */
        const windowToCanvas = (canvas, x, y) => {
         let rect = canvas.getBoundingClientRect()
         return {
         x: x - rect.left * (canvas.width/rect.width),
         y: y - rect.top * (canvas.height/rect.height)
         }
        }
        
        export {
         windowToCanvas
        }

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        canvas實現按住鼠標移動繪制出軌跡的方法實例

        canvas實現按住鼠標移動繪制出軌跡的方法實例:需求在一塊canvas畫布上,初始狀態畫布什么都沒有,現在,我想給畫布加一點鼠標事件,用鼠標在畫布上寫字。具體的效果是鼠標移動到畫布上任意一點,然后按住鼠標,移動鼠標的位置,就可以開始寫字啦!本文作為學習canvas的第一篇收獲,很多人初學canvas
        推薦度:
        標簽: 移動 鼠標 實現
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日本亚洲视频在线| 日本亚洲欧洲免费天堂午夜看片女人员 | 日本不卡免费新一区二区三区| 亚洲国产精品嫩草影院久久| 亚洲1区2区3区精华液| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲乱码国产一区网址| 色婷婷综合缴情综免费观看| 亚洲av日韩片在线观看| 春意影院午夜爽爽爽免费| 中文字幕亚洲一区| 国产一区二区三区免费| 内射干少妇亚洲69XXX| 免费观看美女用震蛋喷水的视频| 亚洲中文字幕一二三四区苍井空| 免费一本色道久久一区| 苍井空亚洲精品AA片在线播放| 又黄又大又爽免费视频| 久久99精品免费一区二区| 亚洲天天做日日做天天欢毛片| 国产成人精品免费视| 色窝窝亚洲AV网在线观看| 中文字幕亚洲不卡在线亚瑟| 精品免费视在线观看| 亚洲福利视频网址| 日本不卡免费新一二三区| 一级做a毛片免费视频| 亚洲AV福利天堂一区二区三| 99精品国产免费久久久久久下载 | 人人狠狠综合久久亚洲婷婷| av无码免费一区二区三区| 久久亚洲精品11p| 精品久久香蕉国产线看观看亚洲| 精品久久久久久久久免费影院| 国产成人综合久久精品亚洲| 国产成人免费高清激情视频| 免费无码一区二区| 亚洲性猛交xx乱| 亚洲裸男gv网站| 亚色九九九全国免费视频| 一个人看的在线免费视频|