国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

利用vue制作在線涂鴉板

nemo / 2892人閱讀

摘要:撤銷清空等操作撤銷前進清空清空前后數據恢復到默認數據地址查看代碼

效果展示

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

    相關文章

    • 前端文檔收集

      摘要:系列種優化頁面加載速度的方法隨筆分類中個最重要的技術點常用整理網頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數組函數數據訪問性能優化方案實現的大排序算法一怪對象常用方法函數收集數組的操作面向對象和原型繼承中關鍵詞的優雅解釋淺談系列 H5系列 10種優化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術點 常用meta整理 網頁性能管理詳解 HTML5 ...

      jsbintask 評論0 收藏0
    • 前端文檔收集

      摘要:系列種優化頁面加載速度的方法隨筆分類中個最重要的技術點常用整理網頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數組函數數據訪問性能優化方案實現的大排序算法一怪對象常用方法函數收集數組的操作面向對象和原型繼承中關鍵詞的優雅解釋淺談系列 H5系列 10種優化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術點 常用meta整理 網頁性能管理詳解 HTML5 ...

      muddyway 評論0 收藏0
    • STM32CubeMX學習教程之硬件I2C讀取光照度

      摘要:使用庫讀寫環境光照度傳感器本文將教大家如何快速使用庫讀取光照度數據。五實驗樣機測試展示通過之前配置好的面板,通過涂鴉智能進行配網實時采集光照度傳感器的數據。 使用STM32 HAL庫讀寫環境光照度傳感器(BH1750) 本文將教大家如何快速使用STM32HAL庫讀取光照度數據。 實現功能:通...

      tinylcy 評論0 收藏0
    • Android:涂鴉tuytaSDK實現邏輯

      摘要:開啟掃描時需要設備處于配網狀態一分類配網子設備可以通過使用手機藍牙直接掃描獲取設備到設備基礎信息,再使用配網接口實現設備的本地配網。 ? (一)分類 ? (二)設備配置 ? (三)設備管理 ? ? 設備管理,大體分為兩類,mesh 和 其他 ? ? 獲取設備列表,給涂鴉sdk發送當前房間id...

      MorePainMoreGain 評論0 收藏0

    發表評論

    0條評論

    nemo

    |高級講師

    TA的文章

    閱讀更多
    最新活動
    閱讀需要支付1元查看
    <