微信小程序canvas分享海报功能

微信小程序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);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 微信小程序实现分享到朋友圈功能

    截止到2017年11月18号,微信小程序官方还尚未开放直接分享到朋友圈的能力,但是劳动人民的智慧是伟大的,现在普遍的做法是,生成一张带有小程序码的图片,保存到用户相册,用户自行发布图片到朋友圈 我的套路: 请求后端API生成小程序码(生成小程序码需要access token,后端生成比较方便) canvas绘制文字和图片到画布 当用户点击分享到朋友圈时,给用户展示画布,画布转成图片,并将图片保存到相册 onShow: function () { var that = this; //1. 请求后

  • 微信小程序通过保存图片分享到朋友圈功能

    说明 首先说明一点,小程序内是不能直接分享到朋友圈的.所以只能通过生成图片,携带小程序二维码,保存到手机相册,让用户自己选择发到朋友圈.然后可以通过在小程序中识别二维码来进入小程序的指定页面.参考市面上支持分享的应用,基本都是这种实现方式. 准备阶段 1.通过服务器获取小程序码 这里可以参考下微信的官方文档,给后台指定的参数和路径等信息,让后台生成指定的小程序码.然后调用wx.getImageInfo将后台生成的小程序码保存起来. 注意一定要仔细看下微信的文档,如果生成小程序码的路径正式服务器不

  • 微信小程序之分享页面如何返回首页的示例

    做小程序开发发现,页面分享出去后,用户通过分享进去的页面很难找到返首页的情况.(微信官方操作是点击右上角三个点,在手机下方显示返回首页).民间很多方案是自己在页面加个悬浮Home标注. 今天我分享另外一种方法.请看下面.gif; 有没有发现,左上角有返回按钮了.原理简单,在你要分享的页面,分享配置时配置你的首页,并带上对应的参数,在首页 onLoad方法中可以获取.代码如下: <!--index.wxml--> <view class="container">

  • 微信小程序--onShareAppMessage分享参数用处(页面分享)

    今天下午突然听到群里有人说微信小程序工具更新了,文档也更新了不少内容. 顾不上吃冬至的饺子.我就冲进来了. 先说分享功能,目前真机尚不能调试.开发工具上可以看看效果.后续还会更新. Page()中加上如下代码后在右上角就会出现三个小白点 title:分享的标题. desc:分享一段描述. path:这个参数有点意思.以前在微信中的分享一般都是url.这里是当前页面这里应该是pages/index?id=123这里的id目前还不知道是什么. 也就是说以后你可以在微信中像分享一个网页一样分享一个页面

  • 详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能

    微信小程序在12月21日发布了新版本的开发工具,并在官网公布新增分享.模板消息.客服消息.扫一扫.带参数二维码功能. 有了分享功能,相信会给很多创业者带来了无限的可能性! 下面就来看看这些新功能到底怎么用吧! 1.分享 可以分享小程序的任何一个页面给好友或群聊.注意是分享给好友或群聊,并没有分享到朋友圈.一方面微信在尝试流量分发方式,但同时又不愿意开放最大的流量入口. 开发文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/share.html?t=

  • 微信小程序实现带参数的分享功能(两种方法)

    微信小程序分享功能的实现方法有两种: 第一种 在page.js中实现onShareAppMessage,便可在小程序右上角选择分享该页面 onShareAppMessage: function () { return { title: '弹出分享时显示的分享标题', desc: '分享页面的内容', path: '/page/user?id=123' // 路径,传递参数到指定页面. } } 第二种 自定义按钮实现分享,在page中添加一个带有open-type='share'的button标签

  • 微信小程序分享功能onShareAppMessage(options)用法分析

    本文实例讲述了微信小程序分享功能onShareAppMessage(options)用法.分享给大家供大家参考,具体如下: 在页面的js文件中定义了 onShareAppMessage 函数时,页面可以表示改页面可以转发.可以在函数中设置页面转发的信息. 1. 只有定义了该函数,小程序右上角的菜单中才会有转发按钮 2. 用户点击转发按钮的时候回调用该函数 3. 该函数内需要 return 一个 Object,Object中包含转发的信息(可自定义转发的内容) 页面中有可以触发转发时间的地方有两个

  • 微信小程序分享功能之按钮button 边框隐藏和点击隐藏

    先上图 样式设置: 在小程序社区看了下,说是伪类造成的.于是就重新定义下样式.然后就 ok 了. 总结 以上所述是小编给大家介绍的微信小程序分享功能之按钮button 边框隐藏和点击隐藏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

  • 微信小程序 数据封装,参数传值等经验分享

    微信小程序开发总结: 一: 参数传值的方法 1: data-id 我们可以给HTML元素添加data-*属性来传递我们需要的值,使用方法说明: (1)设置data-id <view class="block" bindtap="playTap" data-id="{{modle.id}}"> (2): 取值 + 传值 playTap:function(e) { const dataset = e.currentTarget.datas

  • 微信小程序之拖拽排序(代码分享)

    index.wxml <!--index.wxml--> <view class="container"> <view bindtap="box" class="box" > <view disable-scroll="true" wx:for="{{content}}" bindtouchmove="move" bindtouchstart=&

随机推荐