wxml: <scroll-view class="warp_" scroll-y="true"> <view style=‘‘ style=‘position: absolute;z-index: 2;top:0;left:0;right:0;‘> <canvas canvas-id="myCanvas" style="width:{{335 * rpx}}px;height:{{580 * rpx}}px;margin: 30rpx auto 50rpx;"/> <cover-view style=‘padding-bottom: 0;box-sizing: border-box;background:#fff;position: fixed;bottom:0;left:0;width:100%;z-index:9999‘> <!-- <cover-view class="tit f28">海报模板</cover-view> <cover-view class=‘pageNav bWhite flex f24 center gridXb‘> <cover-view class="pageLi sub pr" data-index="{{index}}" catchtap="changeBg" wx:key="" wx:for="{{pageNav}}"> <cover-view class="text pr {{index==active?‘active‘:‘‘}} "> <cover-image class="pageLiImg" src="/image/close2.png"></cover-image> </cover-view> <cover-view class="pageBox"> {{item.title}} </cover-view> </cover-view> </cover-view> --> <cover-view bindtap=‘saveImg‘ class=‘btn‘>保存图片</cover-view> </cover-view> </view> <view class=‘pop_bg_fix‘></view> <!-- </view> --> </scroll-view>
wxss: .warp_{width: 100vw;height: 100vh;box-sizing: border-box;line-height: 1.5;position: fixed;top: 0;left: 0;z-index: 9999991;background: #fff;}
wxjs: // pages/newPage/haoBao/index.js const app = getApp() Page({ /** * 页面的初始数据 */ data: { pageNav: [ { title: ‘简约白‘, color: ‘#fff‘, img: ‘‘, iocn: ‘/image/iocn60.png‘ }, { title: ‘西瓜红‘, color: ‘#fd8866‘, img: ‘/image/topBg3.png‘, iocn: ‘/image/iocn60.png‘ }, { title: ‘天空蓝‘, color: ‘#e5f2fb‘, img: ‘/image/topBg4.png‘, iocn: ‘/image/iocn59.png‘, ac: 1 }, { title: ‘胭脂粉‘, color: ‘#fcdee3‘, img: ‘/image/topBg2.png‘, iocn: ‘/image/iocn62.png‘ }, { title: ‘薰衣草‘, color: ‘#ebdefb‘, img: ‘/image/topBg.png‘, iocn: ‘/image/iocn61.png‘ }, { title: ‘豆沙绿‘, color: ‘#a6e7de‘, img: ‘/image/topBg5.png‘, iocn: ‘/image/iocn63.png‘ } ], active: 0, wx_avatar_url: ‘‘, userinfo: [], index2:0, walk_km: 0, walk_sumk: 0, walk_left:0 }, //获取encryptedData(没有解密的步数)和iv(加密算法的初始向量) myWalk: function(e) { let that = this that.pushRQId = null console.log(that.pushRQId) if (app.HTTP.isLoading(that.pushRQId)) return console.log(‘walk‘) let formid = e.detail.formId wx.checkSession({ success() { // session_key 未过期,并且在本生命周期一直有效 }, fail() { wx.clearStorageSync() } }) wx.getSetting({ success: function(res) { console.log(res); if (!res.authSetting[‘scope.werun‘]) { wx.showModal({ title: ‘提示‘, content: ‘获取微信运动步数,需要开启计步权限‘, success: function(res) { if (res.confirm) { //跳转去设置 wx.openSetting({ success: function(res) { wx.getWeRunData({ success: function(res2) { that.pushRQId = app.HTTP.post(app.URL.userinfo_url, { iv: res2.iv, encryptedData: res2.encryptedData, m: ‘mywalk‘, city: app.globalData.city, formid: formid }, (res) => { //console.log(res); return let arr_top3 = []; if (res.walkrank.length > 0) { arr_top3 = res.walkrank.splice(0, 3) } wx.setStorageSync(‘user_info‘, res.user) that.setData({ walk_step: res.step, walk_sum: res.stepsum, walk_sumk: (res.stepsum * 0.75 * 0.001).toFixed(1), walk_km: (res.step * 0.75 * 0.001).toFixed(1), walk_top3: arr_top3, walk_rank: res.walkrank, userscore: res.user.score }) wx.showToast({ title: ‘同步成功‘, }) }) }, fail: function(res) { wx.showModal({ title: ‘提示‘, content: ‘开发者未开通微信运动,请关注“微信运动”公众号后重试‘, showCancel: false, confirmText: ‘知道了‘ }) } }) } }) } else { //不设置 } } }) } else { wx.getWeRunData({ success: function(res2) { console.log(res2) that.pushRQId = app.HTTP.post(app.URL.userinfo_url, { iv: res2.iv, encryptedData: res2.encryptedData, appid: app.URL.app_id, m: ‘mywalk‘, city: app.globalData.city, formid: formid }, (res) => { // console.log(res); return let arr_top3 = []; if (res.walkrank.length > 0) { arr_top3 = res.walkrank.splice(0, 3) } wx.setStorageSync(‘user_info‘, res.user) that.setData({ walk_step: res.step, walk_sum: res.stepsum, walk_sumk: (res.stepsum * 0.75 * 0.001).toFixed(1), walk_km: (res.step * 0.75 * 0.001).toFixed(1), walk_top3: arr_top3, walk_rank: res.walkrank, userscore: res.user.score }) wx.showToast({ title: ‘同步成功‘, }) }) }, fail: function(res) { wx.showModal({ title: ‘提示‘, content: ‘请关注“微信运动”公众号后重试‘, showCancel: false, confirmText: ‘知道了‘ }) } }) } } }) }, //选择背景色 changeBg: function(e) { var that = this let p = e.currentTarget.dataset that.data.pageNav[p.index][‘color‘] // console.log(that.data.pageNav[p.index][‘color‘]) that.setData({ color: that.data.pageNav[p.index][‘color‘], img: that.data.pageNav[p.index][‘img‘], iocn: that.data.pageNav[p.index][‘iocn‘], active: p.index }) that.canvasImg() }, canvasImg() { let that = this; var ress = wx.getSystemInfoSync() var rpx = ress.windowWidth / 375 that.setData({ rpx: ress.windowWidth / 375 }) const ctx = wx.createCanvasContext(‘myCanvas‘); ctx.setFillStyle(‘#fff‘); //为创建的canvans上下文添充颜色 如果没有设置 fillStyle,默认颜色为 black。 ctx.fillRect(0, 0, 335 * rpx, 580 * rpx) // ctx.setFillStyle(‘#d5313a‘); //为创建的canvans上下文添充颜色 如果没有设置 fillStyle,默认颜色为 black。 // ctx.fillRect(20 * rpx, 100 * rpx, 295 * rpx, 350 * rpx) ctx.drawImage(that.data.headimgurls, 0 * rpx, 0 * rpx, 335 * rpx, 335 * rpx); //ctx.drawImage(that.data.bgWhite, 20 * rpx, 400 * rpx, 295 * rpx, 180 * rpx); ctx.save(); // 先保存状态 已便于画完圆再用 ctx.beginPath(); //开始绘制 //先画个圆 ctx.arc(38 * rpx, 374 * rpx, 25 * rpx, 0, Math.PI * 2, false); //false代表顺时针 图片的位置加半径 ctx.setStrokeStyle(‘#fff‘) ctx.stroke(); ctx.clip();//画了圆 再剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内 ctx.drawImage(that.data.headimgurl, 13 * rpx, 348 * rpx, 50 * rpx, 50 * rpx); // 推进去图片 ctx.restore(); //恢复之前保存的绘图上下文 恢复之前保存的绘图上下文即状态 可以继续绘制 ctx.setFillStyle("#999"); ctx.setFontSize(14 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(that.data.user.nickname+‘向您推荐了一个好东西!‘, 76 * rpx, 380 * rpx); ctx.setFillStyle("#3D3D3D"); ctx.setFontSize(14 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(‘今天我走了‘, 13 * rpx, 430 * rpx); ctx.setFillStyle("#f03725"); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.setFontSize(18 * rpx); ctx.fillText(that.data.users.walkstep+‘‘, 82 * rpx, 430 * rpx); ctx.setFillStyle("#3D3D3D"); ctx.setFontSize(14 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(‘步,‘, (that.data.users.walkstep.toString().length*11+80) * rpx, 430 * rpx); ctx.setFillStyle("#3D3D3D"); ctx.setFontSize(14 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(‘共走了‘, (that.data.users.walkstep.toString().length*11+110) * rpx, 430 * rpx); ctx.setFillStyle("#f03725"); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.setFontSize(18 * rpx); ctx.fillText(that.data.walk_km+‘‘, (that.data.users.walksteps.toString().length*11+118+that.data.walk_sumk.toString().length*11) * rpx, 430 * rpx); ctx.setFillStyle("#3D3D3D"); ctx.setFontSize(14 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(‘公里‘, (that.data.users.walksteps.toString().length*11+110+that.data.walk_sumk.toString().length*11*2) * rpx, 430 * rpx); ctx.setFillStyle("#3D3D3D"); ctx.setFontSize(14 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(‘总里程距离‘, 13 * rpx, 460 * rpx); ctx.setFillStyle("#f03725"); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.setFontSize(18 * rpx); ctx.fillText(that.data.users.walksteps+‘‘, 82 * rpx, 460 * rpx); ctx.setFillStyle("#3D3D3D"); ctx.setFontSize(14 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(‘步,‘, (that.data.users.walksteps.toString().length*11+80) * rpx, 460 * rpx); ctx.setFillStyle("#3D3D3D"); ctx.setFontSize(14 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(‘总共打卡‘, (that.data.users.walksteps.toString().length*11+110) * rpx, 460 * rpx); ctx.setFillStyle("#f03725"); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.setFontSize(18 * rpx); ctx.fillText(that.data.signnum+‘‘, (that.data.users.walksteps.toString().length*11+155+that.data.signnum.toString().length*11) * rpx, 460 * rpx); ctx.setFillStyle("#3D3D3D"); ctx.setFontSize(14 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(‘次‘, (that.data.users.walksteps.toString().length*11+112+that.data.walk_sumk.toString().length*11*2) * rpx,460 * rpx); ctx.setFillStyle(‘#f5f5f5‘) ctx.fillRect(13* rpx, 480 * rpx, 310 * rpx, 90 * rpx) ctx.drawImage(that.data.code,26 * rpx, 496 * rpx, 60 * rpx, 60 * rpx); ctx.setFillStyle("#333"); ctx.setFontSize(12 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(that.data.user.nickname, 100 * rpx, 526 * rpx); ctx.drawImage("/image/add.png", 140 * rpx, 516 * rpx, 12 * rpx, 12 * rpx) ctx.setFillStyle("#333"); ctx.setFontSize(12 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(that.data.user.cityname, 156 * rpx, 526 * rpx); ctx.setFillStyle("#333"); ctx.setFontSize(12 * rpx); //字大小 ctx.setTextAlign(‘left‘); //是否居中显示,参考点画布中线 ctx.fillText(‘平台担保交易,一键提现到账‘, 100 * rpx, 546 * rpx); ctx.draw(); }, saveImg() { let that = this; var res = wx.getSystemInfoSync() var rpx = res.windowWidth / 375 that.setData({ rpx: res.windowWidth / 375 }) wx.canvasToTempFilePath({ x: 0, y: 0, width: 335 * rpx, //画布宽高 height: 580 * rpx, destWidth: 1005 * rpx, //画布宽高*dpr 以iphone6为准 destHeight: 1740 * rpx, //放大2倍以上,解决保存的图片模糊的问题 canvasId: ‘myCanvas‘, success: function (res) { console.log(res.tempFilePath) //生成的临时图片路径 wx.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success: function (res) { console.log(res); wx.showToast({ title: ‘保存成功‘, }) }, fail: function () { console.log(‘a‘) } }) } }) }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { this._getUserinfo(); }, _getUserinfo: function () { let that = this app.HTTP.post(app.URL.userinfo_url, { m: ‘homeShare‘, city: app.globalData.city }, (info) => { wx.setStorageSync(‘user_info‘, info.userinfo) that.setData({ signnum: info.signnum, walk_step: parseInt(info.walkstep), walk_sum: info.walksteps, walk_sumk: (info.walksteps * 0.75 * 0.001).toFixed(1), walk_km: (parseInt(info.walkstep) * 0.75 * 0.001).toFixed(1), users: info, user: info.userinfo, userImg: info.share_imgs }) wx.downloadFile({ url: info.userinfo.headimgurl, success: function (res2) { that.setData({ headimgurl: res2.tempFilePath }); let _suid = `user_id=${that.data.user.uid}`; let _page = "pages/newPage/idx/index"; // that._getFxcode(_page, _suid); //that.canvasImg(); } }) wx.downloadFile({ url: info.share_imgs[0].img, success: function (res2) { that.setData({ headimgurls: res2.tempFilePath }); } }) }) }, _getFxcode: function (_page, _scene) { let that = this app.HTTP.post(app.URL.hao_bao_home, { //m: "getQrcode", page: _page, param: _scene, }, (res) => { wx.downloadFile({ url: res.url, success: function (res2) { that.setData({ code: res2.tempFilePath }); that.canvasImg(); } }) }); }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: function () { }, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, /** * 用户点击右上角分享 */ onShareAppMessage: function () { } })