index.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. import {
  2. createStoreBindings
  3. } from 'mobx-miniprogram-bindings'
  4. import {
  5. store
  6. } from '~/store/index'
  7. let innerAudioContext
  8. Page({
  9. /**
  10. * 页面的初始数据
  11. */
  12. data: {
  13. vState: false,
  14. vStart: '00:00',
  15. vEnd: '00:00',
  16. vProgress: 0,
  17. dState: false,
  18. dStart: '00:00',
  19. dEnd: '00:00',
  20. dProgress: 0,
  21. currentType: '',
  22. victory: {},
  23. defeated: {},
  24. equal: false
  25. },
  26. /**
  27. * 生命周期函数--监听页面加载
  28. */
  29. onLoad(options) {
  30. this.storeBindings = createStoreBindings(this, {
  31. store,
  32. fields: {
  33. userInfo: 'userInfo',
  34. readDetail: 'readDetail',
  35. pkData: 'pkData'
  36. },
  37. })
  38. this.storeBindings.updateStoreBindings()
  39. this.compareScore()
  40. this.innerAudioContext = wx.createInnerAudioContext()
  41. },
  42. compareScore() {
  43. console.log(this.data);
  44. let pkData = this.data.pkData
  45. let score = pkData.score
  46. let myResult = {
  47. audioPath: this.data.readDetail.tempFilePath,
  48. nickName: this.data.userInfo.nickName || this.data.userInfo.uid,
  49. avatar: this.data.userInfo.avatar,
  50. score: this.data.readDetail.myOverall || 97
  51. }
  52. this.setData({
  53. equal: score == myResult.score,
  54. victory: myResult.score > score ? myResult : pkData,
  55. defeated: myResult.score <= score ? myResult : pkData,
  56. })
  57. },
  58. playAudio({
  59. currentTarget
  60. }) {
  61. let type = currentTarget.dataset.type
  62. // 重置音频对象
  63. if (type != this.data.currentType) {
  64. this.innerAudioContext.stop();
  65. }
  66. // 处理音频播放
  67. if (type == 'victory' && !this.data.vState) {
  68. if (this.data.currentType != 'victory') {
  69. this.innerAudioContext.src = this.data.victory.audioPath
  70. }
  71. this.setData({
  72. vState: true,
  73. dState: false
  74. })
  75. } else if (type == 'victory' && this.data.vState) {
  76. this.innerAudioContext.pause();
  77. return this.setData({
  78. vState: false
  79. })
  80. } else if (type == 'defeated' && !this.data.dState) {
  81. if (this.data.currentType != 'defeated') {
  82. this.innerAudioContext.src = this.data.defeated.audioPath;
  83. }
  84. this.setData({
  85. dState: true,
  86. vState: false
  87. })
  88. } else if (type == 'defeated' && this.data.dState) {
  89. this.innerAudioContext.pause();
  90. return this.setData({
  91. dState: false
  92. })
  93. }
  94. this.setData({
  95. currentType: type
  96. })
  97. // this.innerAudioContext.onCanplay(() => {
  98. this.innerAudioContext.play();
  99. // })
  100. this.innerAudioContext.onTimeUpdate(() => {
  101. this.setDuration(this.innerAudioContext.currentTime)
  102. })
  103. },
  104. // 设置时间文案
  105. setDuration(s) {
  106. let t = '';
  107. s = Math.floor(s);
  108. if (s > -1) {
  109. let min = Math.floor(s / 60) % 60;
  110. let sec = s % 60;
  111. if (min < 10) {
  112. t += "0";
  113. }
  114. t += min + ":";
  115. if (sec < 10) {
  116. t += "0";
  117. }
  118. t += sec;
  119. }
  120. let label = this.data.currentType == 'victory' ? 'vStart' : 'dStart'
  121. let progressV = this.data.currentType == 'victory' ? 'vProgress' : 'dProgress'
  122. this.setData({
  123. [label]: t,
  124. [progressV]: Math.round((this.innerAudioContext.currentTime / this.innerAudioContext.duration) * 100)
  125. })
  126. },
  127. result() {
  128. wx.redirectTo({
  129. url: `/pages/reading/index?videoId=${this.data.pkData.exampleId}&readingType=pk&reset=true`,
  130. })
  131. },
  132. /**
  133. * 生命周期函数--监听页面卸载
  134. */
  135. onUnload() {
  136. this.innerAudioContext.destroy()
  137. },
  138. creatShare() {
  139. return new Promise((resolve, reject) => {
  140. let context = wx.createSelectorQuery();
  141. context
  142. .select('#share')
  143. .fields({
  144. node: true,
  145. size: true
  146. }).exec((res) => {
  147. const canvas = res[0].node;
  148. const ctx = canvas.getContext('2d');
  149. const dpr = wx.getSystemInfoSync().pixelRatio;
  150. canvas.width = res[0].width * dpr;
  151. canvas.height = res[0].height * dpr;
  152. ctx.scale(dpr, dpr);
  153. ctx.font = '16px PingFang';
  154. console.log(this.data.victory, this.data.defeated, this.data.equal);
  155. let bgImg = canvas.createImage();
  156. 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'
  157. bgImg.onload = () => {
  158. ctx.drawImage(bgImg, 0, 0, 375, 300);
  159. ctx.textAlign = "center";
  160. var lnamex = this.data.equal ? 100 : 100,
  161. lnamey = this.data.equal ? 125 : 115;
  162. ctx.fillText(this.data.victory.nickName, lnamex, lnamey)
  163. var rnamex = this.data.equal ? 280 : 280,
  164. rnamey = this.data.equal ? 125 : 140;
  165. ctx.fillText(this.data.defeated.nickName, rnamex, rnamey)
  166. ctx.font = '19px PingFang';
  167. var lnumx = this.data.equal ? 100 : 100,
  168. lnumy = this.data.equal ? 150 : 140;
  169. ctx.fillText(this.data.victory.score + '分', lnumx, lnumy)
  170. var rnumx = this.data.equal ? 280 : 280,
  171. rnumy = this.data.equal ? 150 : 165;
  172. ctx.fillText(this.data.defeated.score + '分', rnumx, rnumy)
  173. ctx.font = '13px PingFang';
  174. var ltimex = this.data.equal ? 136 : 136,
  175. ltimey = this.data.equal ? 252.5 : 239.5;
  176. ctx.fillText(this.data.vEnd, ltimex, ltimey)
  177. var rtimex = this.data.equal ? 320 : 320,
  178. rtimey = this.data.equal ? 253 : 267;
  179. ctx.fillText(this.data.dEnd, rtimex, rtimey)
  180. // 圆形位置 大小
  181. var size = 55;
  182. var lx = this.data.equal ? 71 : 72,
  183. ly = this.data.equal ? 45 : 38;
  184. var rx = this.data.equal ? 252 : 247,
  185. ry = this.data.equal ? 45 : 60;
  186. ctx.save(); // 保存
  187. ctx.arc(size / 2 + lx, size / 2 + ly, size / 2, 0, Math.PI * 2, false);
  188. ctx.arc(size / 2 + rx, size / 2 + ry, size / 2, 0, Math.PI * 2, false);
  189. ctx.clip();
  190. let leftImg = canvas.createImage();
  191. leftImg.src = this.data.victory.avatar
  192. leftImg.onerror = () => {
  193. loadRightImg()
  194. }
  195. leftImg.onload = () => {
  196. ctx.drawImage(leftImg, lx, ly, size, size)
  197. loadRightImg()
  198. }
  199. let loadRightImg = () => {
  200. let rightImg = canvas.createImage();
  201. rightImg.src = this.data.defeated.avatar
  202. rightImg.onload = () => {
  203. ctx.drawImage(rightImg, rx, ry, size, size)
  204. setTimeout(() => {
  205. wx.canvasToTempFilePath({
  206. canvas: canvas,
  207. success(res) {
  208. resolve({
  209. title: '请欣赏我的课文朗读作品,点赞+评论。',
  210. path: `/pages/index/index?&uid=${wx.getStorageSync('uid')}`,
  211. imageUrl: res.tempFilePath
  212. })
  213. },
  214. fail(res) {
  215. reject()
  216. }
  217. }, this)
  218. }, 500)
  219. }
  220. rightImg.onerror = () => {
  221. setTimeout(() => {
  222. wx.canvasToTempFilePath({
  223. canvas: canvas,
  224. success(res) {
  225. resolve({
  226. title: '请欣赏我的课文朗读作品,点赞+评论。',
  227. path: `/pages/index/index?&uid=${wx.getStorageSync('uid')}`,
  228. imageUrl: res.tempFilePath
  229. })
  230. },
  231. fail(res) {
  232. reject()
  233. }
  234. }, this)
  235. }, 500)
  236. }
  237. }
  238. }
  239. })
  240. })
  241. },
  242. onShareAppMessage({
  243. from,
  244. target
  245. }) {
  246. if (from == 'button') {
  247. const promise = new Promise(resolve => {
  248. this.creatShare().then(res => {
  249. console.log(res);
  250. resolve(res)
  251. })
  252. })
  253. return {
  254. title: '课文朗读,从未如此有趣。',
  255. path: `/pages/index/index?&uid=${wx.getStorageSync('uid')}`,
  256. imageUrl: 'http://reader-wx.ai160.com/images/reader/v3/shareContent.png',
  257. promise
  258. }
  259. } else {
  260. return {
  261. title: '课文朗读,从未如此有趣。',
  262. path: `/pages/index/index?&uid=${wx.getStorageSync('uid')}`,
  263. imageUrl: 'http://reader-wx.ai160.com/images/reader/v3/shareContent.png'
  264. }
  265. }
  266. },
  267. })