微信小程序canvas分享海报,包含拒绝授权后重新打开授权设置。
这篇文章完善了第一次拒绝授权后再次点击可以打开授权设置,希望可以帮助到爱学习的道友
这里是效果图,图片可以百度上找。
话不多说,直接上代码
最重要的一点,千万不要忘记在json文件里面注册组件和wxml里面引用组件
wxml
<button class='btn' catchtap='createPoster' >生成海报</button> <my-poster id="getPoster" types="{{type}}" isflag="{{isflag}}" title="{{goods_title}}" bigImg="{{share.img}}" qrcode="{{share.rcode}}" > </my-poster>
js
data:{ isflag: false // 海报模态框 } // 生成海报 createPoster:function(){ this.setData({ isflag: true }) this.selectComponent('#getPoster').getAvaterInfo(); },
组件wxml
<view hidden="{{!isflag}}" catchtouchmove="return" class="con-poster" bindtap='closePoster'> <!-- 模态框 --> <view class='modialog'> <view class='canvas-box' id='canvas-container'> <canvas canvas-id="myCanvas" style="width:100%;height:100%;"/> </view> </view> <!-- 保存图片按钮 --> <view class='save-img' catchtap='saveBtn'>保存图片</view> </view>
组件wxss
.con-poster{ width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); position: fixed; top: 0; left: 0; z-index: 999; } .modialog{ width: 660rpx; height: 750rpx; margin: 100rpx auto 0; } .canvas-box{ width: 660rpx; height: 750rpx; background: #fff; } .save-img{ width: 660rpx; height: 100rpx; margin: 30rpx auto 0; font-size: 32rpx; display: flex; justify-content: center; align-items: center; color: #fff; background:linear-gradient(90deg,rgba(56,219,248,1),rgba(81,171,255,1)); }
组件js
properties: { isflag:{ // 控制组件开关 type: Boolean, value: true } bigImg:{ // 大图 type: String, value: '' }, qrcode:{ // 二维码 type: String, value: '' }, title:{ // 标题 type: String, value: '大幅度开发' } } data: { imgHeight: 0 }, methods: { //关闭海报 closePoster: function () { this.setData({ isflag: false }) }, // 提示框 toast: function(msg,callback){ wx.showToast({ title: msg, icon: 'none', success(){ callback && (setTimeout(function(){ callback() },1500)) } }) }, //下载产品大图 getAvaterInfo: function () { wx.showLoading({ title: '生成中...', mask: true }); var that = this; that.setData({ isflag: true }) var productImage = that.data.bigImg; if (productImage) { wx.downloadFile({ url: productImage, success: function (res) { wx.hideLoading(); if (res.statusCode === 200) { var productSrc = res.tempFilePath; that.calculateImg(productSrc, function (data) { that.getQrCode(productSrc, data); }) } else { that.toast('产品图片下载失败!', () =>{ var productSrc = ""; that.getQrCode(productSrc); }) } }, fail: function (err) { wx.hideLoading(); that.toast('请求失败,网络错误', () => { that.closePoster() }) } }) } else { wx.hideLoading(); var productSrc = ""; that.getQrCode(productSrc); } }, //下载二维码 getQrCode: function (productSrc, imgInfo = "") { wx.showLoading({ title: '生成中...', mask: true, }); var that = this; var productCode = that.data.qrcode; if (productCode) { wx.downloadFile({ url: productCode, success: function (res) { wx.hideLoading(); if (res.statusCode === 200) { var codeSrc = res.tempFilePath; that.sharePosteCanvas(productSrc, codeSrc, imgInfo); } else { that.toast('二维码下载失败!', () => { var codeSrc = ""; that.sharePosteCanvas(productSrc, codeSrc, imgInfo); }) } }, fail: function () { wx.hideLoading(); that.toast('请求失败,网络错误', () => { that.closePoster() }) } }) } else { wx.hideLoading(); var codeSrc = ""; that.sharePosteCanvas(productSrc, codeSrc); } }, //canvas绘制分享海报 sharePosteCanvas: function (avaterSrc, codeSrc, imgInfo){ wx.showLoading({ title: '生成中...', mask: true, }) var that = this; const ctx = wx.createCanvasContext('myCanvas', that); var width = ""; const query = wx.createSelectorQuery().in(this); query.select('#canvas-container').boundingClientRect(function (rect) { var width = rect.width; var height = rect.height; var left = rect.left; ctx.setFillStyle('#fff'); ctx.fillRect(0, 0, width, height); //海报大图 if (avaterSrc) { if (imgInfo) { var imgheght = parseFloat(imgInfo); } ctx.drawImage(avaterSrc, 0, 0, width, imgheght ? imgheght : width); ctx.setFontSize(14); ctx.setFillStyle('#fff'); ctx.setTextAlign('left'); } //海报标题 if (that.data.title) { const CONTENT_ROW_LENGTH = 22; // 正文 单行显示字符长度 let [contentLeng, contentArray, contentRows] = that.textByteLength((that.data.title).substr(0, 40), CONTENT_ROW_LENGTH); ctx.setTextAlign('left'); ctx.setFillStyle('#000'); ctx.setFontSize(15); let contentHh = 22 * 1; for (let m = 0; m < contentArray.length; m++) { ctx.fillText(contentArray[m], 15, imgheght + 35 + contentHh * m); } } // 绘制二维码 if (codeSrc) { ctx.drawImage(codeSrc, left + 215, imgheght + 20, width / 4, width / 4) ctx.setFontSize(10); ctx.setFillStyle('#000'); } }).exec() setTimeout(function () { ctx.draw(); wx.hideLoading(); }, 1000) }, // 封装每行显示的文本字数 textByteLength(text, num) { // text为传入的文本 num为单行显示的字节长度 let strLength = 0; let rows = 1; let str = 0; let arr = []; for (let j = 0; j < text.length; j++) { if (text.charCodeAt(j) > 255) { strLength += 2; if (strLength > rows * num) { strLength++; arr.push(text.slice(str, j)); str = j; rows++; } } else { strLength++; if (strLength > rows * num) { arr.push(text.slice(str, j)); str = j; rows++; } } } arr.push(text.slice(str, text.length)); return [strLength, arr, rows] // [处理文字的总字节长度,每行显示内容的数组,行数] }, //计算图片尺寸 calculateImg: function (src, cb) { var that = this; wx.getSystemInfo({ success(res2) { var imgHeight = (res2.windowWidth * 0.65) + 130; that.setData({ imgHeight: imgHeight }) cb(imgHeight - 130); } }) }, // 点击保存按钮 saveBtn(){ var _this = this wx.getSetting({ success(res) { if (res.authSetting['scope.writePhotosAlbum']) { // 第一次授权,并且成功 _this.saveShareImg(); } else if (res.authSetting['scope.writePhotosAlbum'] === undefined) { // 未授权 wx.authorize({ scope: 'scope.writePhotosAlbum', success() { _this.saveShareImg(); }, fail() { _this.toast('您没有授权,无法保存到相册') } }) } else { // 第一次授权失败,现在打开设置 wx.showModal({ title: '警告', content: '请打开授权,否则无法将图片保存在相册中!', success(result) { if (result.confirm) { wx.openSetting({ success(settingResult) { if (settingResult.authSetting['scope.writePhotosAlbum']) { _this.saveShareImg(); } else { _this.toast('您没有授权,无法保存到相册') } } }) } } }) } } }) }, // 保存到相册 saveShareImg: function () { var that = this; wx.showLoading({ title: '正在保存', mask: true, }) setTimeout(function () { wx.canvasToTempFilePath({ canvasId: 'myCanvas', success: function (res) { var tempFilePath = res.tempFilePath; wx.saveImageToPhotosAlbum({ filePath: tempFilePath, success() { // 保存 wx.hideLoading() that.toast('图片保存成功', () =>{ that.closePoster(); }) }, fail: function (err) { // 取消保存 wx.hideLoading() that.toast('保存失败') } }) } }, that); }, 1000); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月17日
2024年11月17日
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】