做爰高潮a片〈毛片〉,尤物av天堂一区二区在线观看,一本久久A久久精品VR综合,添女人荫蒂全部过程av

最新文章專題視頻專題問答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
主站蜘蛛池模板: 宝山区| 美姑县| 师宗县| 博野县| 屏东市| 秦皇岛市| 同江市| 崇左市| 洮南市| 开封县| 云浮市| 都江堰市| 彰化市| 鄂伦春自治旗| 西吉县| 大城县| 旅游| 清水河县| 吉林省| 通榆县| 刚察县| 托里县| 乐都县| 汝阳县| 福安市| 启东市| 常山县| 鄂托克前旗| 石河子市| 阳泉市| 宁海县| 淮南市| 北安市| 旬阳县| 长垣县| 乌兰浩特市| 明光市| 宁河县| 萨迦县| 峡江县| 双鸭山市|