场景:小程序测试活动,实现echarts雷达图展现不一样的结果、微信头像、二维码、测试结果文字,最终绘制出一张图片用户保存相册。考虑到开发时间及各类坑使用了canvasdrawer组件,其中开发过程当中遇到的一些问题总结。
- 安卓输出图片错位问题一样异步解决
- measureText注意线上版本库1.9.1+
//业务层代码 let that = this // 保存图片到临时的本地文件 //注意chart初始化实例不能输出图片 const ecComponent = this.selectComponent('#mychart-dom-graph');//获取echarts组件 ecComponent.canvasToTempFilePath({ //安卓机型此处不会成功回调 success: res => { that.eventDraw(res.tempFilePath) }, fail: res => console.log('失败', res) }); //ec-canvas.js源码 canvasToTempFilePath(opt) { if (!opt.canvasId) { opt.canvasId = this.data.canvasId; } const system = wx.getSystemInfoSync().system ctx.draw(true, () => {//此处微信api在安卓部分机型不会回调 ,相反ctx.draw(false)清空画布会执行,致使echarts已经绘制画布清空,输出为空图片 wx.canvasToTempFilePath(opt, this); }); } //修改后 canvasToTempFilePath(opt) { if (!opt.canvasId) { opt.canvasId = this.data.canvasId; } const system = wx.getSystemInfoSync().system if (/ios/i.test(system)) { ctx.draw(true, () => { wx.canvasToTempFilePath(opt, this); }); } else {//针对安卓机型异步获取已绘制图层 ctx.draw(true,()=>{ //断点打印依旧不会执行setTimeout(() => {wx.canvasToTempFilePath(opt, this);}, 1000);}}); ctx.draw(true); setTimeout(() => {//延迟获取 wx.canvasToTempFilePath(opt, this); }, 1000); } },
onReady: function() { let that = this; setTimeout(() => {//异步解决echarts实例没有加载成功的没法设置options option.series[0].data[0].value = that.data.canvasListData chart.setOption(option); }, 500); } <!--备注--> //提早声明变量 let chart = null; var option = {}
建议查看:微信小程序社区的帖子。html
HTML页面能够使用 html2canvas转换节点生成图片保存
因为时间限制,不少地方理解不够深入,瑕疵不少,欢迎提出