更新時間:2022-09-28 08:35:20 來源:動力節點 瀏覽18次
canvas簡單理解成一張可以自定義大小(有上限)的畫布,在畫布上可以寫字,畫圖形,放置圖片。一般可以用來動態生成截圖,方便用戶保存和轉發。
頁面canvas被隱藏了
<!--畫出試卷內容,通過css(position:fixed; left:100%;)隱藏canvas-->
<!--A4是2480*3508象素 210*297毫米-->
<canvas
wx:if="{{page==4}}"
type="2d"
id="canvas"
style="width:750rpx; height:1050rpx; position:fixed; left:100%;"
></canvas>
通過 onCanvas 事件開始繪制畫布內容
每繪制完成一頁,通過 wx.canvasToTempFilePath 保存圖片到本地
全部繪制完成,通過 wx.previewImage 進行圖片預覽
// 初始化canvas
onCanvas: function (e) {
// 繪制完成直接顯示
if(this.data.drawFinish) {
this.previewPapers()
return
}
wx.showLoading({
title: '試卷轉圖片中',
})
const query = wx.createSelectorQuery()
query.select('#canvas')
.fields({ node: true, size: true })
.exec((res) => {
const canvas = res[0].node
const ctx = canvas.getContext('2d')
const dpr = wx.getSystemInfoSync().pixelRatio
canvas.width = res[0].width * dpr
canvas.height = res[0].height * dpr
console.log('canvas.width, canvas.height', canvas.width, canvas.height)
ctx.scale(dpr, dpr)
// 繪制記憶卷
this.drawMemoryPaperImage(canvas, ctx)
})
},
// 繪制記憶卷
drawMemoryPaperImage(canvas, ctx) {
// 獲取記憶卷數據
let memoryList = this.data.memoryList
// 繪制一頁記憶卷(繪制第一頁)
let oneMemoryPaper = memoryList[0]
let currentIndex = 0 // 0-表示繪制保存第一頁數據
let totalPages = memoryList.length
this.drawOneMemoryPaperImage(canvas, ctx, oneMemoryPaper, currentIndex, totalPages)
},
// 繪制一頁記憶卷
drawOneMemoryPaperImage(canvas, ctx, oneMemoryPaper, currentIndex, totalPages) {
let maxWidth = 750
let pg = oneMemoryPaper
// 繪制前清空canvas
ctx.clearRect(0, 0, canvas.width, canvas.height)
// 繪制標題
ctx.font = '18px sans-serif'
ctx.textAlign = 'center';
ctx.fillText('快速數字記憶卷', 375, 70, maxWidth )
for(let j=0; j<pg.length; j++) {
let row = pg[j]
for(let k=0; k<row.length; k++) {
let text = pg[j][k]
let x = k * 17 + 40
let y = j * 35 + 150
// 繪制數字
ctx.font = '14px sans-serif'
ctx.textAlign = 'left';
ctx.fillText(text, x, y, maxWidth )
// 繪制行號
if(k==39) {
let rowNo = 'Row ' + (j<9?'0'+(j+1):(j+1))
ctx.fillText(rowNo, x+25, y, maxWidth )
}
}
}
// 繪制頁碼
ctx.font = '18px sans-serif'
ctx.textAlign = 'center';
ctx.fillText('第 '+(currentIndex+1)+' 頁', 375, 1050, maxWidth )
// 保存試卷到小程序臨時目錄
let paper = 'paper.memoryPaper['+currentIndex+']'
this.saveToTempFilePath(canvas, ctx, paper, currentIndex, totalPages)
},
// 保存繪制的試卷到小程序臨時目錄
saveToTempFilePath(canvas, ctx, paper, currentIndex, totalPages) {
var that = this
wx.canvasToTempFilePath({
canvas: canvas,
success(res) {
that.setData({
[paper]: res.tempFilePath,
})
// 繪制下一頁數據
let nextIndex = currentIndex + 1
if(nextIndex < totalPages) {
that.drawNextOneMemoryPaperImage(canvas, ctx, nextIndex, totalPages)
}else {
// 記憶卷全部繪制完成
that.setData({ drawFinish:true })
wx.hideLoading({
success: (res) => {
console.log('記憶卷全部繪制完成')
},
})
that.previewPapers()
}
},
fail(err) {
console.log(err)
}
})
},
// 繪制下一頁數據
drawNextOneMemoryPaperImage(canvas, ctx, nextIndex, totalPages) {
// 獲取記憶卷數據
let memoryList = this.data.memoryList
let currentIndex = nextIndex
let oneMemoryPaper = memoryList[nextIndex]
this.drawOneMemoryPaperImage(canvas, ctx, oneMemoryPaper, currentIndex, totalPages)
},
// 預覽試卷
previewPapers() {
let paper = this.data.paper
wx.previewImage({
current: paper.memoryPaper[0],
urls: paper.memoryPaper
})
},
提交申請后,顧問老師會電話與您溝通安排學習