摘要:撤銷清空等操作撤銷前進清空清空前后數據恢復到默認數據地址查看代碼
Canvas API簡介 調用方法效果展示
getImageData() 返回ImageData對象,該對象為畫布上指定的矩形復制像素數據
putImageData() 把圖像數據(從指定的 ImageData 對象)放回畫布上
clearRect() 在給定的矩形內清除指定的像素
toDataURL() 返回canvas圖像的URL
lineTo() 添加一個新點,創建從該點到最后指定點的線條
stroke() 繪制已定義的路徑
beginPath() 起始一條路徑,或重置當前路徑
moveTo() 把路徑移動到畫布中的指定點,不創建線條
調用屬性strokeStyle 設置或返回用于筆觸的顏色、漸變或模式
shadowBlur 設置或返回用于陰影的模糊級別
shadowColor 設置或返回用于陰影的顏色
lineWidth 設置或返回當前的線條寬度
功能需求說明更多API請參考 canvas基本使用
基礎線條繪制功能
筆觸顏色修改
筆刷粗細調整
撤回、前進、情況功能
生成圖片
初始化數據colors: 筆觸顏色列表
brushs: 筆刷對應的粗細
context: canvas context
imgUrl: 用于存放保存圖片的地址
canvasMoveUse: 是否允許執行move時候繪制線條
preDrawAry: 存儲當前表面狀態數組-上一步
nextDrawAry: 存儲當前表面狀態數組-下一步
middleAry: 中間數組
lineWidth: 線條寬度
lineColor: 線條顏色
shadowBlur: 陰影
data() { return { colors: ["#fef4ac","#0018ba","#ffc200","#f32f15","#cccccc","#5ab639"], brushs: [{ className: "small fa fa-paint-brush", lineWidth: 3 },{ className: "middle fa fa-paint-brush", lineWidth: 6 },{ className: "big fa fa-paint-brush", lineWidth: 12 }], context: {}, imgUrl: [], canvasMoveUse: true, preDrawAry: [], nextDrawAry: [], middleAry: [], config: { lineWidth: 1, lineColor: "#f2849e", shadowBlur: 2 } } }設置繪畫配置
setCanvasStyle() { this.context.lineWidth = this.config.lineWidth this.context.shadowBlur = this.config.shadowBlur this.context.shadowColor = this.config.lineColor this.context.strokeStyle = this.config.lineColor }
筆觸顏色及粗細相關設置(點擊修改config數據):
畫筆的移動操作
// 當在屏幕中移動時即開始繪制準備 beginPath(e){ const canvas = document.querySelector("#canvas") if (e.target !== canvas) { this.context.beginPath() } }
// 在canvas中鼠標按下 canvasDown(e) { // 讓move方法可用 this.canvasMoveUse = true // client是基于整個頁面的坐標 // offset是cavas距離頂部以及左邊的距離 const canvasX = e.clientX - e.target.parentNode.offsetLeft const canvasY = e.clientY - e.target.parentNode.offsetTop // 設置canvas的配置 this.setCanvasStyle() //清除子路徑 this.context.beginPath() // 移動的起點 this.context.moveTo(canvasX, canvasY) //當前繪圖表面狀態 const preData = this.context.getImageData(0, 0, 600, 400) //當前繪圖表面進棧 // 按下相當于新的操作的開始,所以把當前記錄數據放到prev中 this.preDrawAry.push(preData) },
// canvas中鼠標移動 canvasMove(e) { if(this.canvasMoveUse) { // 只有允許移動時調用 const t = e.target let canvasX let canvasY // 由于手機端和pc端獲取頁面坐標方式不同,所以需要做出判斷 if(this.isPc()){ canvasX = e.clientX - t.parentNode.offsetLeft canvasY = e.clientY - t.parentNode.offsetTop }else { canvasX = e.changedTouches[0].clientX - t.parentNode.offsetLeft canvasY = e.changedTouches[0].clientY - t.parentNode.offsetTop } // 連接到移動的位置并上色 this.context.lineTo(canvasX, canvasY) this.context.stroke() } },
// canvas中鼠標放開 canvasUp(e){ const preData = this.context.getImageData(0, 0, 600, 400) if (!this.nextDrawAry.length) { // 在沒有撤銷過的情況下,將當前數據放入prev //當前繪圖表面進棧 this.middleAry.push(preData) } else { // 在撤銷的情況下,將在后面步驟的數據情況記錄 this.middleAry = [] this.middleAry = this.middleAry.concat(this.preDrawAry) this.middleAry.push(preData) this.nextDrawAry = [] } // 設置move時不可繪制 this.canvasMoveUse = false }
為了保證移動端的可用性,加入touchstart等。
撤銷清空等操作// 撤銷 if (this.preDrawAry.length) { const popData = this.preDrawAry.pop() const midData = this.middleAry[this.preDrawAry.length + 1] this.nextDrawAry.push(midData) this.context.putImageData(popData, 0, 0) }
// 前進 if (this.nextDrawAry.length) { const popData = this.nextDrawAry.pop() const midData = this.middleAry[this.middleAry.length - this.nextDrawAry.length - 2] this.preDrawAry.push(midData) this.context.putImageData(popData, 0, 0) }
// 清空 this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height) // 清空前后數據 this.preDrawAry = [] this.nextDrawAry = [] // middleAry恢復到默認數據 this.middleAry = [this.middleAry[0]]
demo地址
查看代碼
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81082.html
摘要:使用庫讀寫環境光照度傳感器本文將教大家如何快速使用庫讀取光照度數據。五實驗樣機測試展示通過之前配置好的面板,通過涂鴉智能進行配網實時采集光照度傳感器的數據。 使用STM32 HAL庫讀寫環境光照度傳感器(BH1750) 本文將教大家如何快速使用STM32HAL庫讀取光照度數據。 實現功能:通...
摘要:開啟掃描時需要設備處于配網狀態一分類配網子設備可以通過使用手機藍牙直接掃描獲取設備到設備基礎信息,再使用配網接口實現設備的本地配網。 ? (一)分類 ? (二)設備配置 ? (三)設備管理 ? ? 設備管理,大體分為兩類,mesh 和 其他 ? ? 獲取設備列表,給涂鴉sdk發送當前房間id...
閱讀 3576·2023-04-25 14:20
閱讀 1200·2021-09-10 10:51
閱讀 1157·2019-08-30 15:53
閱讀 464·2019-08-30 15:43
閱讀 2319·2019-08-30 14:13
閱讀 2797·2019-08-30 12:45
閱讀 1209·2019-08-29 16:18
閱讀 1169·2019-08-29 16:12