92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

微信小程序--實現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

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
日韩成人中文字幕| 伊是香蕉大人久久| 亚洲欧美国产一区二区三区| 欧美俄罗斯性视频| 亚洲精品自拍第一页| 欧美多人乱p欧美4p久久| 日本aⅴ大伊香蕉精品视频| 日韩免费在线视频| 亚洲视频免费一区| zzjj国产精品一区二区| 亚洲3p在线观看| 亚洲欧美日韩一区在线| 日韩美女视频在线观看| 亚洲第一精品夜夜躁人人爽| 91免费版网站入口| 亚洲精品久久久久国产| 法国裸体一区二区| 国产香蕉一区二区三区在线视频| 97婷婷大伊香蕉精品视频| 国产精品久久久av久久久| 夜色77av精品影院| 亚洲国产日韩一区| 欧美交受高潮1| 国产成人精品av在线| 国产有码一区二区| 国产亚洲一区二区精品| 亚洲a区在线视频| 亚洲精品美女在线| 91色精品视频在线| 欧美日韩亚洲系列| 久久亚洲成人精品| 国产精品扒开腿做爽爽爽视频| 国产精品久在线观看| www.久久草.com| 欧美一区二区色| 日韩电影中文 亚洲精品乱码| 亚洲最大的成人网| 久久久久久久久久久人体| 疯狂欧美牲乱大交777| 性色av一区二区三区免费| 国产精品成人免费视频| 久久综合久久八八| 国产男人精品视频| 亚洲精品美女在线观看| 97久久久免费福利网址| 日韩av影视在线| 国产精品精品视频| 国产91久久婷婷一区二区| 国产精品视频永久免费播放| 欧美日韩一区二区精品| 成人免费福利视频| 精品久久久久久中文字幕| 亚洲自拍偷拍色图| 欧美激情欧美激情| 欧美日韩国产丝袜美女| 日韩av成人在线| 日韩在线观看免费全集电视剧网站| 日韩av三级在线观看| 国产精品成久久久久三级| 亚洲电影免费在线观看| 亚洲欧美三级伦理| 日韩在线视频二区| 欧美精品18videos性欧| 久久免费高清视频| 上原亚衣av一区二区三区| 久久精品国产v日韩v亚洲| 国产精品久久77777| 久久这里有精品视频| 日韩欧美第一页| 91高清免费视频| 久久男人资源视频| 国产自产女人91一区在线观看| 成人精品久久一区二区三区| www.国产精品一二区| 亚洲成av人乱码色午夜| 久久久久久久久网站| 成人乱人伦精品视频在线观看| 91国内免费在线视频| 久久亚洲综合国产精品99麻豆精品福利| 日本成熟性欧美| 成人免费高清完整版在线观看| 一区二区欧美亚洲| 精品国产自在精品国产浪潮| 久久手机精品视频| 成人黄色在线免费| 欧美裸体xxxx极品少妇软件| 国产97在线亚洲| 91av网站在线播放| 日韩成人中文字幕在线观看| 日韩av色综合| 成人美女免费网站视频| 久久久久久久香蕉网| 亚洲天堂网站在线观看视频| 欧美激情视频网站| 国产一区av在线| 国产成人精品免费视频| 91干在线观看| 精品成人国产在线观看男人呻吟| 亚洲性视频网址| 国产精品一二三视频| 日av在线播放中文不卡| 日本不卡免费高清视频| 欧美大片欧美激情性色a∨久久| 亚洲毛片在线看| 久久久久久久久久久亚洲| 永久免费精品影视网站| 久热在线中文字幕色999舞| 国产一区二区三区在线播放免费观看| 成人在线观看视频网站| 久久成年人免费电影| 情事1991在线| 九九热这里只有精品免费看| 福利精品视频在线| 亚洲日韩欧美视频| 国产日本欧美一区二区三区| 欧美视频不卡中文| 国产a∨精品一区二区三区不卡| 亚洲国产精品福利| 久久99热精品这里久久精品| 亚洲精品www久久久久久广东| 久久精品中文字幕一区| 亚洲精品av在线播放| 国产一区二区三区视频在线观看| 国产一区二区三区日韩欧美| 国产v综合ⅴ日韩v欧美大片| 欧美另类暴力丝袜| 91精品国产高清自在线看超| 欧美日韩精品在线播放| 国产成人涩涩涩视频在线观看| 久久人91精品久久久久久不卡| 色噜噜狠狠狠综合曰曰曰88av| 国产综合福利在线| 国产偷国产偷亚洲清高网站| 日韩精品在线视频| 色老头一区二区三区在线观看| 亚洲欧美在线免费| 8x海外华人永久免费日韩内陆视频| 国产丝袜一区二区三区| 亚洲天堂成人在线视频| 97视频在线观看视频免费视频| 欧美一级成年大片在线观看| 亚洲综合在线播放| 中文字幕一精品亚洲无线一区| 日韩欧美国产高清91| 欧美国产高跟鞋裸体秀xxxhd| 色噜噜狠狠狠综合曰曰曰| 一区二区三区国产在线观看| 亚洲久久久久久久久久| 亚洲欧美三级在线| 中文字幕不卡在线视频极品| 国产精品久久9| 国产成人精品免高潮在线观看| 九九热精品视频国产| 欧美精品第一页在线播放| 91免费在线视频网站| 国产视频精品va久久久久久| 亚洲欧美日韩久久久久久| 欧美成人精品一区二区三区| 日韩国产欧美精品在线| 黄色91在线观看| 亚洲欧美中文日韩在线v日本| 国产精品av网站| 亚洲一区制服诱惑| 国产久一一精品|