vue canvas繪制矩形并解決由clearRec帶來的閃屏問題
起因:在cavnas繪制矩形時(shí) 鼠標(biāo)移動(dòng)一直在監(jiān)測(cè)中,所以鼠標(biāo)移動(dòng)的軌跡會(huì)留下一個(gè)個(gè)的矩形框,
要想清除矩形框官方給出了ctx.clearRect() 但是這樣是把整個(gè)畫布給清空了,因此需要不斷
向畫布展示新的圖片,這樣就出現(xiàn)了不斷閃屏的問題。
那么怎么解決呢?
microsoft提供了雙緩沖圖形技術(shù),可以點(diǎn)擊看看這邊文章。
具體就是畫圖的時(shí)候做兩個(gè)canvas層,一個(gè)臨時(shí)層 一個(gè)顯示層,鼠標(biāo)的監(jiān)聽事件放在顯示層處理,
每次清空的時(shí)候只清空臨時(shí)層,這樣就可以解決閃屏問題了。
部分代碼如下:
<!--臨時(shí)層--> <canvas id="customPositionImg2" ref="table2" style=" display:none;"></canvas> <!--顯示層 增加鼠標(biāo)按下,移動(dòng),松開事件--> <canvas id="customPositionImg" ref="table" @mousedown="mousedown" @mousemove="mousemove" @mouseup="mouseup" style=""></canvas>
顯示層展示圖片:
//因?yàn)轫?xiàng)目是dialog展示自定義畫板,所以圖片展示就寫在了dialog打開的鉤子里,如果需要直接復(fù)制 vue.nextTick里面的代碼就行 show () { vue.nextTick(_ => { let customCanvas =this.$refs.table;// canvas顯示層 this.customstyle =''; customCanvas.height = 740; customCanvas.width = 1460; this.customcxt = customCanvas.getContext("2d"); let img = new Image(); img.src = this.imgSrc; let that = this; img.onload = function () { that.customRwidth = customCanvas.width / img.width; //原圖與展示圖片的寬高比 that.customRheight = customCanvas.height / img.height; that.customcxt.drawImage(img, 0, 0, customCanvas.width, customCanvas.height); }; }) },
鼠標(biāo)操作事件
//鼠標(biāo)按下時(shí)執(zhí)行 mousedown(e){ this.isMouseDownInCanvas = true; // 鼠標(biāo)按下時(shí)開始位置與結(jié)束位置相同 防止鼠標(biāo)在畫完矩形后 點(diǎn)擊圖畫形成第二個(gè)圖形 this.endX = e.offsetX; this.endY = e.offsetY; this.startX = e.offsetX; this.startY = e.offsetY; }, //鼠標(biāo)移動(dòng)式時(shí)執(zhí)行 mousemove(e){ if (this.isMouseDownInCanvas){ // 當(dāng)鼠標(biāo)有按下操作時(shí)執(zhí)行 console.log( e.offsetX,e.offsetY); if((this.endX != e.offsetX)||( this.endY != e.offsetY)){ this.endX = e.offsetX; this.endY = e.offsetY; let wwidth = this.endX - this.startX; let wheigth = this.endY - this.startY; let tempCanvas = this.$refs.table2; // canvas臨時(shí)層 let tempCtx = tempCanvas.getContext('2d'); tempCanvas.width = 1460; tempCanvas.height = 740; // 設(shè)置寬高 // 清除臨時(shí)層指定區(qū)域的所有像素 tempCtx.clearRect(0, 0, 1460, 740); // 重新展示圖片 let img = new Image(); img.src = this.imgSrc; let that = this; img.onload = function () { that.customcxt.drawImage(img, 0, 0,1460, 740); }; this.customcxt.strokeStyle=" #00ff00"; //矩形框顏色 this.customcxt.lineWidth="2"; //矩形框?qū)挾? this.customcxt.strokeRect(this.startX,this.startY,wwidth,wheigth); //繪制矩形 }else{ //鼠標(biāo)按下靜止時(shí)顯示矩形的大小。 let wwidth2 = this.endX - this.startX; let wheigth2 = this.endY - this.startY; this.customcxt.strokeRect(this.startX,this.startY,wwidth2,wheigth2) } } }, //鼠標(biāo)松開時(shí)執(zhí)行 mouseup(e){ this.isMouseDownInCanvas = false; // 繪制最終的矩形框 let wwidth = this.endX - this.startX; let wheigth = this.endY - this.startY; this.customcxt.strokeRect(this.startX,this.startY,wwidth,wheigth) },
總結(jié)
以上所述是小編給大家介紹的vue cavnas繪制矩形并解決由clearRec帶來的閃屏問題,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Vue鼠標(biāo)滾輪滾動(dòng)切換路由效果的實(shí)現(xiàn)方法
這篇文章主要介紹了Vue鼠標(biāo)滾輪滾動(dòng)切換路由效果的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08antdv vue upload自定義上傳結(jié)合表單提交方式
這篇文章主要介紹了antdv vue upload自定義上傳結(jié)合表單提交方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Vue3實(shí)現(xiàn)動(dòng)態(tài)面包屑的代碼示例
這篇文章主要給大家介紹一下Vue3動(dòng)態(tài)面包屑是如何實(shí)現(xiàn)的,實(shí)現(xiàn)思路又是什么,以及發(fā)給大家介紹一下面包屑的功能,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07elementUI的table表格改變數(shù)據(jù)不更新問題解決
最近在做vue的項(xiàng)目時(shí)發(fā)現(xiàn)了一個(gè)問題,今天就來解決一下,本文主要介紹了elementUI的table表格改變數(shù)據(jù)不更新問題解決,感興趣的可以了解一下2022-02-02vue實(shí)現(xiàn)前端按鈕組件權(quán)限管理
這篇文章主要為大家介紹了vue實(shí)現(xiàn)前端按鈕組件權(quán)限管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09