import { getPkResult } from '~/api/works' import { setDuration } from '~/utils/util' import { userEvent } from '~/api/global' import event from '~/mixins/event' let innerAudioContext Page({ behaviors: [event], /** * 页面的初始数据 */ data: { pkId: '', pkRecord: {}, vState: false, vStart: '00:00', vEnd: '00:00', vProgress: 0, dState: false, dStart: '00:00', dEnd: '00:00', dProgress: 0, currentType: '', victory: {}, defeated: {}, equal: false, // 是否是分享进来的 isPlayback: false }, /** * 生命周期函数--监听页面加载 */ async onLoad(options) { let { pkRecord, pkRecordVOS } = await getPkResult(options.id) this.setData({ pkId: options.id, pkRecord, isplayback: options.playback || false }) this.compareScore(pkRecordVOS) this.innerAudioContext = wx.createInnerAudioContext() await userEvent({ action: 'WXPKSCORE', }) }, compareScore(resultData) { let first = resultData[0] let second = resultData[1] let victory = first.userRead.score > second.userRead.score ? first : second let defeated = second.userRead.score < first.userRead.score ? second : first this.setData({ equal: first.userReadExtend.businessType != 2 ? first.userRead.score == second.userRead.score : true, victory: first.userRead.score > second.userRead.score ? first : second, defeated, vEnd: setDuration(victory.userRead.duration), dEnd: setDuration(defeated.userRead.duration), }) }, playAudio({ currentTarget }) { let type = currentTarget.dataset.type // 重置音频对象 if (type != this.data.currentType) { this.innerAudioContext.stop(); } // 处理音频播放 if (type == 'victory' && !this.data.vState) { if (this.data.currentType != 'victory') { this.innerAudioContext.src = this.data.victory.userRead.audioPath } this.setData({ vState: true, dState: false }) } else if (type == 'victory' && this.data.vState) { this.innerAudioContext.pause(); return this.setData({ vState: false }) } else if (type == 'defeated' && !this.data.dState) { if (this.data.currentType != 'defeated') { this.innerAudioContext.src = this.data.defeated.userRead.audioPath; } this.setData({ dState: true, vState: false }) } else if (type == 'defeated' && this.data.dState) { this.innerAudioContext.pause(); return this.setData({ dState: false }) } this.setData({ currentType: type }) // this.innerAudioContext.onCanplay(() => { this.innerAudioContext.play(); // }) this.innerAudioContext.onTimeUpdate(() => { let label = this.data.currentType == 'victory' ? 'vStart' : 'dStart' let progressV = this.data.currentType == 'victory' ? 'vProgress' : 'dProgress' this.setData({ [label]: setDuration(this.innerAudioContext.currentTime), [progressV]: Math.round((this.innerAudioContext.currentTime / this.innerAudioContext.duration) * 100) }) }) }, result({ currentTarget }) { if (currentTarget.dataset.type == 'reading') { wx.redirectTo({ url: `/pages/reading/index?videoId=${this.data.victory.userRead.exampleId}&readingType=pk`, }) } else if (currentTarget.dataset.type == 'index') { wx.switchTab({ url: '/pages/index/index', }) } else { wx.redirectTo({ url: `/pages/pkPage/index?videoId=${this.data.pkRecord.challengerUserReadId}&isShare=true`, }) } }, /** * 生命周期函数--监听页面卸载 */ onUnload() { this.innerAudioContext.destroy() }, creatShare() { return new Promise((resolve, reject) => { let context = wx.createSelectorQuery(); context .select('#share') .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; ctx.scale(dpr, dpr); ctx.font = '16px PingFang'; let bgImg = canvas.createImage(); bgImg.src = this.data.equal ? 'https://reader-wx.ai160.com/images/reader/v3/equal.png' : 'https://reader-wx.ai160.com/images/reader/v3/victory.png' bgImg.onload = () => { ctx.drawImage(bgImg, 0, 0, 375, 300); ctx.textAlign = "center"; var lnamex = this.data.equal ? 100 : 100, lnamey = this.data.equal ? 125 : 115; var vName = this.data.victory.user.nickName || this.data.victory.user.eid if (vName.length > 4) { vName = vName.slice(0, 4) + '...' } ctx.fillText(vName, lnamex, lnamey) var rnamex = this.data.equal ? 280 : 280, rnamey = this.data.equal ? 125 : 140; var dName = this.data.defeated.user.nickName || this.data.defeated.user.eid if (dName.length > 4) { dName = dName.slice(0, 4) + '...' } ctx.fillText(dName, rnamex, rnamey) ctx.font = '19px PingFang'; if (this.data.victory.userReadExtend.businessType != 2) { var lnumx = this.data.equal ? 100 : 100, lnumy = this.data.equal ? 150 : 140; ctx.fillText(this.data.victory.userRead.score + '分', lnumx, lnumy) var rnumx = this.data.equal ? 280 : 280, rnumy = this.data.equal ? 150 : 165; ctx.fillText(this.data.defeated.userRead.score + '分', rnumx, rnumy) } ctx.font = '13px PingFang'; var ltimex = this.data.equal ? 136 : 136, ltimey = this.data.equal ? 252.5 : 239.5; ctx.fillText(this.data.vEnd, ltimex, ltimey) var rtimex = this.data.equal ? 320 : 320, rtimey = this.data.equal ? 253 : 267; ctx.fillText(this.data.dEnd, rtimex, rtimey) // 圆形位置 大小 var size = 55; var lx = this.data.equal ? 71 : 72, ly = this.data.equal ? 45 : 38; var rx = this.data.equal ? 252 : 247, ry = this.data.equal ? 45 : 60; ctx.save(); // 保存 ctx.arc(size / 2 + lx, size / 2 + ly, size / 2, 0, Math.PI * 2, false); ctx.arc(size / 2 + rx, size / 2 + ry, size / 2, 0, Math.PI * 2, false); ctx.clip(); let leftImg = canvas.createImage(); leftImg.src = this.data.victory.user.avatar leftImg.onerror = () => { loadRightImg() } leftImg.onload = () => { ctx.drawImage(leftImg, lx, ly, size, size) loadRightImg() } let loadRightImg = () => { let rightImg = canvas.createImage(); rightImg.src = this.data.defeated.user.avatar rightImg.onload = () => { ctx.drawImage(rightImg, rx, ry, size, size) setTimeout(() => { wx.canvasToTempFilePath({ canvas: canvas, success: (res) => { let userName = this.data.pkRecord.userReadId == this.data.victory.userRead.id ? this.data.victory.user.nickName || this.data.victory.user.eid : this.data.defeated.user.nickName || this.data.defeated.user.eid if (userName.length > 4) { userName = userName.slice(0, 4) + '...' } resolve({ title: `我挑战了${userName}的作品,这场比拼真精彩!点击加入战局!`, path: `/pages/pkResult/index?id=${this.data.pkId}&uid=${wx.getStorageSync('uid')}&playback=true`, imageUrl: res.tempFilePath }) }, fail(res) { reject() } }, this) }, 500) } rightImg.onerror = () => { setTimeout(() => { wx.canvasToTempFilePath({ canvas: canvas, success(res) { resolve({ title: '我的新作品发布啦,快来捧场点赞!', path: `/pages/pkResult/index?uid=${wx.getStorageSync('uid')}`, imageUrl: res.tempFilePath }) }, fail(res) { reject() } }, this) }, 500) } } } }) }) }, onShareAppMessage({ from, target }) { if (from == 'button') { const promise = new Promise(resolve => { this.creatShare().then(res => { resolve(res) }) }) return { title: '自从用了它,家里朗朗书声,美妙极了!你家孩子也快来试试!', path: `/pages/index/index?uid=${wx.getStorageSync('uid')}`, imageUrl: 'http://reader-wx.ai160.com/images/reader/v3/375-300-1.jpg', promise } } else { return { title: '自从用了它,家里朗朗书声,美妙极了!你家孩子也快来试试!', path: `/pages/index/index?uid=${wx.getStorageSync('uid')}`, imageUrl: 'http://reader-wx.ai160.com/images/reader/v3/375-300-1.jpg' } } }, })