• <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <small id="ggggg"></small> <sup id="ggggg"></sup>
    <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <tfoot id="ggggg"></tfoot>
  • <nav id="ggggg"><cite id="ggggg"></cite></nav>
    <nav id="ggggg"></nav>
    成人黃色A片免费看三更小说,精品人妻av区波多野结衣,亚洲第一极品精品无码,欧美综合区自拍亚洲综合,久久99青青精品免费观看,中文字幕在线中字日韩 ,亚洲国产精品18久久久久久,黄色在线免费观看

    微信小程序--實(shí)現(xiàn)canvas繪圖并且可以復(fù)盤回看

    2019-6-24    seo達(dá)人

    如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

    目錄結(jié)構(gòu):



    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'>畫(huà)筆</button>
      <button type="primary" bindtap='clearCanvas'>清空畫(huà)板</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">藍(lán)色</button>
      <button style='background:green;color:#fff;' bindtap="green">綠色</button>
      <button type="warn" bindtap="startRecording">開(kāi)始錄制</button>
      <button type="primary" bindtap='rePlay'>復(fù)盤</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
    //獲取應(yīng)用實(shí)例
    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;//開(kāi)始時(shí)刻
    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();//記錄當(dāng)前操作時(shí)刻
        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:該文件用來(lái)保存歷史操作,以便復(fù)盤

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

    reply.wxml:

    <!--pages/replay/replay.wxml-->
    <view class="replayBox">
      <canvas canvas-id='myCanvas' class="myCanvas"></canvas>
    </view>
    <button type="warn" bindtap="start">開(kāi)始</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({
     
      /**
       * 頁(yè)面的初始數(shù)據(jù)
       */
      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);
      },
      /**
       * 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面加載
       */
      onLoad: function (options) {
        context = wx.createCanvasContext('myCanvas');
        context.beginPath();
        context.setStrokeStyle('#000');
        context.setLineWidth(3);
        context.setLineCap('round');
        context.setLineJoin('round');
      }
    })
    藍(lán)藍(lán)設(shè)計(jì)m.lzhte.cn )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)

    日歷

    鏈接

    個(gè)人資料

    存檔

    主站蜘蛛池模板: 温宿县| 成在线人免费视频播放| 亚洲精品岛国片在线观看| 亚洲瑟瑟| 波多野结衣亚洲一区| av中文字幕在线资源网| 国产日韩精品视频无码| 天堂AV无码AV毛片毛| 中文字幕AV伊人AV无码AV| 日韩精品久久久免费观看| 香蕉EEWW99国产精选免费| 秋霞鲁丝片成人无码| 久久无码国产日本欧美| 欧美日韩精品一区二区三区不卡91麻豆久久| 华人少妇被黑人粗大的猛烈进| 日韩精品有码在线视频| 亚洲AV电影不卡在线观看| 和田县| 国产九色AV刺激露脸对白 | 三级在线网站| 国产日韩综合一区二区性色AV| 少妇人妻精品无码专区视频| 日韩导航| 一区二区韩国福利网站| 2020精品国产自在现线看| 国产精品嫩模大尺度视频| 手机看片日本在线观看视频| 欧亚乱色一区二区三区| 五月亚洲| 在线观看国产精品日本不卡网| 国内精品久久久久影院网站| 日本视频精品一区二区| 视频日本一区二区三区| 乌拉特前旗| 亚洲AVAV天堂AV在线网爱情| 九九久久精品免费观看| 一夜七次郎最新网站| 成人免费午夜无码视频在线播放| 97操操| 日韩欧美中文在线| 中文字幕亚洲精品2页|