<strike id="cy2gs"><menu id="cy2gs"></menu></strike>
  • <del id="cy2gs"><dfn id="cy2gs"></dfn></del>
  • 微信小程序--實現canvas繪圖并且可以復盤回看

    2019-6-24    seo達人

    如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

    目錄結構:



    index.wxml:

    <view class="canvasBox">
      <canvas canvas-id="myCanvas" class="myCanvas" catchtouchstart='canvasStart' catchtouchmove='canvasMoving'></canvas>
    </view>
    <view class="btn">
      <button type="warn" bindtap='drawPen'>畫筆</button>
      <button type="primary" bindtap='clearCanvas'>清空畫板</button>
      <button type="warn" bindtap='clearLine'>橡皮擦</button>
      <button style='background:#000;color:#fff;' bindtap="black">黑色</button>
      <button style='background:yellow;color:#000;' bindtap="yellow">黃色</button>
      <button style='background:red;color:#fff;' bindtap="red">紅色</button>
      <button style='background:blue;color:#fff;' bindtap="blue">藍色</button>
      <button style='background:green;color:#fff;' bindtap="green">綠色</button>
      <button type="warn" bindtap="startRecording">開始錄制</button>
      <button type="primary" bindtap='rePlay'>復盤</button>
      <button></button>
    </view>
    index.wxss:

    .canvasBox{
      position: relative;
      top:0;
      left:0;
      width: 750rpx;
      height:800rpx;
      background:#eee;
    }
    .canvasBox .myCanvas{
      width: 100%;
      height:100%;
      position: absolute;
      top:0;
      left:0;
    }
     
    .btn{
      width: 750rpx;
      display: flex;
      justify-content: space-between;
      flex-wrap: wrap;
    }
    .btn button{
      width: 180rpx;
      font-size: 24rpx;
    }
    index.js:

    //index.js
    //獲取應用實例
    import {hisData} from "../../utils/historyOperation.js";
    const app = getApp()
    var moveToX = 0, moveToY = 0, lineToX = 0, lineToY = 0;
    var context = null;
    var isStart = false;
    var date;
    var startDate;//開始時刻
    var penType = "drawPen";
    var colorStr = "#000";
    var operationType = "mapping";
    Page({
      data: {
        
      },
      
      canvasStart:function(e){
        var x = Math.floor(e.touches[0].clientX);
        var y = Math.floor(e.touches[0].clientY);
        date = new Date();
        moveToX = x;
        moveToY = y;
        operationType = "mapping";
        if(penType === "clearPen"){
          operationType = "clearLine";
        }
        if (isStart) {
          hisData.hisDataArr.push({
            time: date.getTime() - startDate,
            operation: operationType,
            lineArr: {
              startX: moveToX,
              startY: moveToY,
              currentX: x,
              currentY: y,
              z: 1,
              colorStr:colorStr
            }
          })
        }
      },
      //繪制線條
      canvasMoving:function(e){
        date = new Date();
        var x = Math.floor(e.changedTouches[0].clientX);
        var y = Math.floor(e.changedTouches[0].clientY);
        lineToX = x;
        lineToY = y;
        if(penType === "clearPen"){
          operationType = "clearLine";
          context.clearRect(x-12, y-12, 24, 24);
          context.draw(true);
        }else{
          operationType = "mapping";
          context.setStrokeStyle(colorStr);
          context.moveTo(moveToX, moveToY);
          context.lineTo(lineToX, lineToY);
        }
        if (isStart) {
          hisData.hisDataArr.push({
            time: date.getTime() - startDate,
            operation: operationType,
            lineArr: {
              startX: moveToX,
              startY: moveToY,
              currentX: lineToX,
              currentY: lineToY,
              z: 1,
              colorStr: colorStr
            }
          })
        }
        moveToX = lineToX;
        moveToY = lineToY;
        context.stroke();
        context.draw(true);
      },
      
      clearCanvas:function(){
        context.clearRect(0,0,375,400);
        context.draw(true);
        date = new Date();//記錄當前操作時刻
        operationType = "clearCanvas";
        if(isStart){
          hisData.hisDataArr.push({
            time: date.getTime() - startDate,
            operation: operationType,
            lineArr: {
              startX: -1,
              startY: -1,
              currentX: -1,
              currentY: -1,
              z: 0,
              colorStr: colorStr
            }
          })
        }
      },
      
      drawPen:function(){
        penType = "drawPen";
      },
      clearLine:function(){
        penType = "clearPen";
      },
      black:function(){
        colorStr = "#000";
      },
      yellow: function () {
        colorStr = "yellow";
      },
      red: function () {
        colorStr = "red";
      },
      blue: function () {
        colorStr = "blue";
      },
      green: function () {
        colorStr = "green";
      },
      startRecording:function(){
        isStart = true;
        date = new Date();
        startDate = date.getTime();
      },
      rePlay:function(){
        wx.navigateTo({
          url: '../replay/replay',
        })
      },
      onLoad: function () {
        isStart = false;
        context = wx.createCanvasContext('myCanvas');
        context.beginPath();
        context.setStrokeStyle('#000');
        context.setLineWidth(5);
        context.setLineCap('round');
        context.setLineJoin('round');
      }
    })
    historyOperation.js:該文件用來保存歷史操作,以便復盤

    const hisData = {
      hisDataArr:[
        {
          time:0,//操作時間
          /**
           * 操作類型
           * 繪圖:mapping
           * 拖動球員:moveplayer
           * 清除畫布:clearCanvas
           * 橡皮擦:clearLine
           */
          operation:"mapping",//操作類型
          /**
           * 繪制路徑
           * startX:開始x坐標
           * startY:開y縱坐標
           * currentX:目標位置的 x 坐標
           * currentY:目標位置的 y 坐標
           * z:1代表畫線時鼠標處于move狀態,0代表處于松開狀態
           * colorStr:線的填充顏色
           */
          lineArr: {    //繪制路徑
            startX:0,
            startY:0,
            currentX:0,
            currentY:0,
            z:0,
            colorStr:"#000"
          }
        }
      ]
    };
     
    export {hisData};
    復盤:

    reply.wxml:

    <!--pages/replay/replay.wxml-->
    <view class="replayBox">
      <canvas canvas-id='myCanvas' class="myCanvas"></canvas>
    </view>
    <button type="warn" bindtap="start">開始</button>
    reply.wxss:

    /* pages/replay/replay.wxss */
    .replayBox{
      position:relative;
      width: 750rpx;
      height:800rpx;
      background: #eee;
    }
     
    .replayBox .myCanvas{
      position: absolute;
      top:0;
      left:0;
      width:100%;
      height:100%;
    }
     
    reply.js:

    // pages/replay/replay.js
    import {hisData} from "../../utils/historyOperation.js";
    var startDate;
    var date;
    var curTime;
    var context = null;
    var timer = null;
    Page({
     
      /**
       * 頁面的初始數據
       */
      data: {
     
      },
      start:function(){
        context.clearRect(0, 0, 375, 400);
        clearInterval(timer);
        date = new Date();
        startDate = date.getTime();
        var i = 0;
        var that = this;
        var len = hisData.hisDataArr.length;
        timer = setInterval(function(){
          date = new Date();
          curTime = date.getTime() - startDate;
          if (curTime >= hisData.hisDataArr[i].time){
            switch (hisData.hisDataArr[i].operation) {
              case "mapping":
                context.setStrokeStyle(hisData.hisDataArr[i].lineArr.colorStr);
                context.moveTo(hisData.hisDataArr[i].lineArr.startX, hisData.hisDataArr[i].lineArr.startY);
                context.lineTo(hisData.hisDataArr[i].lineArr.currentX, hisData.hisDataArr[i].lineArr.currentY);
                context.stroke();
                context.draw(true);
                break;
              case "clearCanvas":
                context.clearRect(0, 0, 375, 400);
                context.draw(true);
                break;
              case "clearLine":
                context.clearRect(hisData.hisDataArr[i].lineArr.currentX-12, hisData.hisDataArr[i].lineArr.currentY-12, 24, 24);
                context.draw(true);
                break;
            }
            i++;
          }
          if(i >= len){
            clearInterval(timer);
          }
        },2);
      },
      /**
       * 生命周期函數--監聽頁面加載
       */
      onLoad: function (options) {
        context = wx.createCanvasContext('myCanvas');
        context.beginPath();
        context.setStrokeStyle('#000');
        context.setLineWidth(3);
        context.setLineCap('round');
        context.setLineJoin('round');
      }
    })
    藍藍設計www.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、網站建設 平面設計服務

    日歷

    鏈接

    個人資料

    藍藍設計的小編 http://www.skdbbs.com

    存檔

    主站蜘蛛池模板: 亚洲精品成人片在线观看精品字幕| 国产亚洲精品美女久久久| 无码国内精品人妻少妇| 8050免费午夜一级国产精品| 久久精品人人做人人妻人人玩| 久久国产精品波多野结衣AV| 国产精品毛片久久久久久久| 无码精品视频一区二区三区| 欧美精品高清在线xxxx| 国产99视频精品免费视频76| 国产精品高清一区二区三区 | 久久精品国产亚洲av水果派| 日韩精品免费一线在线观看| 国产精品无码不卡一区二区三区| 精品亚洲一区二区| 大伊香蕉精品视频在线导航| 精品卡一卡二卡乱码高清| 亚洲精品V欧洲精品V日韩精品| 四虎影视永久在线精品| 久久夜色撩人精品国产小说| 精品久久久久久无码人妻蜜桃| 国产精品高清2021在线| 日韩欧美精品不卡| 精品久久久久久亚洲| 99热精品在线观看| 69堂国产成人精品视频不卡| 国产久热精品无码激情| 国产在线精品一区二区中文| 国产麻豆精品久久一二三| 国产午夜精品久久久久免费视 | 欧美精品亚洲精品日韩专区| 国产亚洲精品无码拍拍拍色欲| 国产精品午夜久久| 国产小呦泬泬99精品| 精品国产国产综合精品| 精品国产青草久久久久福利| 国产综合成人色产三级高清在线精品发布 | 欧美精品久久久久久久自慰| 日韩精品久久无码中文字幕| 日韩人妻无码精品久久免费一 | 久久精品不卡|