小程序的分享有自己的机制,在页面点击右上角,或者页面中的button 采用open-type=share方式也可以触发onShareAppMessage方法。

文档里面明确说明,分享的图片可以采用网络图片,那么我们自定义图片之后将其保存,得到微信的临时文件路径也是符合要求的。
废话不多说,直接贴代码。我将绘制分享图的功能封装了一下,如下:

// 考虑了有些文字是带有换行符的,安卓和iOS对于换行符的处理不一样,所以这里需要单独考虑
// canvas绘制文字自动换行
function fillTextToCanvas(cxt, text, beginWidth, beginHeight) {const lineLength = 24;// 行高let item = '';let count = 0;const stringLength = text.length;const newText = text.split('');const context = cxt;let beginHeightNew = beginHeight;context.textAlign = 'left';for (let i = 0; i <= stringLength; i++) {if (count === 15) { // count一行显示多少个字context.fillText(item, beginWidth, beginHeightNew);beginHeightNew += lineLength;item = '';count = 0;}if (i === stringLength) {context.fillText(item, beginWidth, beginHeightNew);item = '';count = 0;}item += newText[0];count += 1;newText.shift();}
}
//  canvas绘制文字自动换行
function drawLongText(longText, cxt, beginWidth, beginHeight) {const lines = longText.split('\n');const linesLen = lines.length;const lineLength = 24;// 行高if (linesLen >= 0) {for (let t = 0; t < linesLen; t++) {const beginHeightNew = beginHeight + lineLength * t;fillTextToCanvas(cxt, lines[t], beginWidth, beginHeightNew);}}
}// 绘制分享图片
function createSharePicUrl(self, avatar, nickname, college, content, callback) {const shareCtx = wx.createCanvasContext('shareCanvas', self);shareCtx.rect(0, 0, 250, 200);shareCtx.setFillStyle('white');// 画头部个人信息wx.downloadFile({url: avatar,success(res) {const avatarWidth = 40; // 绘制的头像宽度const avatarHeight = 40; // 绘制的头像高度const avatarX = 12; // 绘制的头像在画布上的位置const avatarY = 15; // 绘制的头像在画布上的位置shareCtx.save();shareCtx.beginPath(); // 开始绘制// 先画个圆   前两个参数确定了圆心 (x,y) 坐标  第三个参数是圆的半径  四参数是绘图方向  默认是false,即顺时针shareCtx.arc(avatarWidth / 2 + avatarX,avatarHeight / 2 + avatarY,avatarWidth / 2,0,Math.PI * 2,false);shareCtx.clip();shareCtx.drawImage(res.tempFilePath,avatarX, avatarY,avatarWidth,avatarHeight); // 推进去图片,必须是https图片shareCtx.restore(); // 恢复之前保存的绘图上下文 恢复之前保存的绘图上下午即状态 还可以继续绘制// 画中间帖子内容shareCtx.setTextAlign('left'); // 文字居中shareCtx.setFillStyle('#333333');shareCtx.setFontSize(15); // 文字字号:15pxshareCtx.fillText(nickname, 64, 31, 100);shareCtx.setFillStyle('#999999');shareCtx.setFontSize(12); // 文字字号:12pxshareCtx.fillText(college, 64, 52, 100);shareCtx.setFillStyle('#070707');shareCtx.setFontSize(15); // 文字字号:15pxdrawLongText(content, shareCtx, avatarX, 75 + 10);shareCtx.draw(false, setTimeout(callback, 200));},});
}
module.exports = {drawLongText,createSharePicUrl,
};

上面我将两个方法也都暴露出来了,可以在每个页面自由的调用。
调用方法:

// 在xx.js里面引入
const createSharePic = require('../../utils/createSharePic');

生成分享图之后,将图片保存,生成分享图,方便分享。

createSharePic.createSharePicUrl(this,item.avatar,item.nickname,item.collegeName,item.body, () => {wx.canvasToTempFilePath({canvasId: 'shareCanvas',x: 0,y: 0,width: 250,height: 200,success(res) {console.log(res.tempFilePath);that.setData({sharePicUrl: res.tempFilePath,});},}, that);});

下面简述了一下我本次开发遇到的问题,有兴趣的可以看下,也许你也出现了同样的问题,这样我们也算同病相怜,哈哈哈~

遇到的问题:

  • 问题1:canvas层级问题
    canvas是原生组件,在所有的组件的上面,除非你用cover-view组件,但是那个更坑爹,看到下面bug&tip那么多,我瞬间觉得难用,用了之后发现果然难用,所以我直接放弃了这个组件。

    那到底怎么解决这个层级的问题呢?
  1. 必要的时候再显示,不必要的时候隐藏
    wx:if可以控制一个组件的显示和隐藏,这个方法可以参考下。比如我之前的场景:某个页面有多个弹框,弹框出现的时候,绘制的canvas的图会显示在最上面,弹框盖不住那个图,这个时候,我发现将canvas图隐藏起来,弹框能正常显示,那就隐藏呗。哈哈哈,因为我的弹框很大,canvas图片隐藏之后用户也是感知不大的,弹框消失的时候再显示,完美~哈哈哈

  2. 移到窗口看不到的地方
    这是我这次采用的方法。position:fixed; right:-100%; css里面添加两个属性,这样canvas就在窗口外面啦,可能此时canvas就会说:小伙砸,看不到我,看不到我,我就在这里,来抓我呀~~哈哈哈

  • 问题2:创建分享图的时机
    创建分享图是这次功能实现花时比较多的点,我的场景是这样的:页面里面有一个列表,列表里面的每一项都可以分享,也可以删除,这里的分享需要走原生onShareMessage方法,分享图里面需要多个元素,也就是分享的内容需要自定义。
    (1)原来我的想法是:点击买个item的时候我再去绘制图片,等到分享图绘制好了之后我再显示分享卡片,但是我发现每次分享的卡片显示了之后,我的图还没绘制好,捶你的小胸口~~我要哭会。
    (2)看来这个思路不行啊,容我开动下脑筋,想个新方法。那就先将每个item对应的分享图绘制好,然后点击item的时候将对应的分享图保存下面给分享卡片,这么一测试,我发现,哎,好像可以啦。但是当我测试了删除和新增功能之后,我就又蛋疼了,因为新增的没有生成新的对应的canvas,删除之后呢,canvas也没有相应的删除,导致分享卡片跟内容不对应的问题,我勒个去的,捶你的小胸口,我再哭会~。
    (3)上面两个方法都不行,我觉得我需要苦思冥想一下,于是我出去上个了厕所…嗯,想出来了,那就保证永远都是一个canvas,每次在这个画布上面重新绘制分享图。为了防止又出现之前分享图来不及绘制的问题,这次实现思路是这样的:点击每个item的时候我就开始绘制,并将生成的图片保存起来,然后再让分享按钮显示,分享按钮是下面这样的:

    点击分享的时候,去拿刚刚生成的分享图的临时链接,你会发现成啦。生成的分享卡片内容是一致的,而且新增,删除之后也不会错乱,啊哈哈哈,让小姐姐我长舒一口气。

    (4)有的图片不显示
    这次我需要显示的头像,或者你需要一些其他的图片,这些图片你需要先下载下来,不然就会不显示。
    顺便赘述下:因为小程序的分享卡片图片是5:4比例,所以这里我直接写死了在方法里面,各位如果有其他的需要可以自行更改,每个元素的位置也是可以自己调哒,么么哒,分享给你们,希望对大家有用。

小程序canvas绘制自定义分享图片并分享给好友相关推荐

  1. 小程序canvas绘制商品海报实现分享朋友圈

    小程序canvas绘制商品海报实现分享朋友圈 效果图: 实现步骤就是点击生成图片 在canvas画布中画出一张海报 然后保存在本地 在imags标签中展示,此处尽可能的把canvas组件隐藏 但是不能 ...

  2. 微信小程序-canvas绘制文字实现自动换行

    微信小程序-canvas绘制文字实现自动换行 在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生 ...

  3. 微信 html 字体 自动换行,详解微信小程序-canvas绘制文字实现自动换行

    在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvascontext.filltext参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者 ...

  4. 小程序Canvas绘制图片太大,自动闪退,安卓会有crash问题

    2019独角兽企业重金招聘Python工程师标准>>> 问题说明: 目前小程序Canvas版本还有不少bug,性能较低. 对于图片太大使用ctx.drawImage(imgpath, ...

  5. 小程序canvas绘制微信头像

    微信小程序canvas是不支持绘制网络图片的,所以逻辑就是先下载到本地,使用本地临时路径去绘制: // 查看是否授权wx.getSetting({success(res) {if (res.authS ...

  6. 小程序 canvas 绘制图片

    canvas绘制图片 绘制图片的问题 html 绘制图片的问题 1.canvas不能绘制网络图片需要转换成本地图片进行使用 2.多张图片绘制需要调用 img.onload,进行嵌套绘制 html &l ...

  7. 微信小程序使用html2canvas,微信小程序canvas 2d 引入本地图片并生成分享图

    在小程序基础库 v2.9.0 正式开放一套全新的 Canvas 接口.该接口符合 HTML Canvas 2D 的标准,实现上采用 GPU 硬件加速,渲染性能相比于现有的 Canvas 接口有一倍左右 ...

  8. 微信小程序canvas绘制图片的注意事项---不能是网络图片

    上周五做了个需求,用canvas画图并保存到本地,没在手机上测试,今天看的时候突然发现: drawImage(imageResource, dx, dy, dWidth, dHeight) 其中ima ...

  9. 微信小程序canvas绘制图片真机不显示问题

    用canvas绘制图片的时候,模拟器上正常显示,真机上不显示 const ctx = wx.createCanvasContext('canvasImg'); var imgUrl = 'https: ...

最新文章

  1. JS可以写操作系统?Windows 95被装进Electron App
  2. RTX 30系游戏本来了!1月26日开售,售价999美元起
  3. silverlight ListBox 多列图片效果
  4. 深度学习:卷积神经网络(convolution neural network)
  5. 复制文本朗读_原创:昭明文选配乐朗读 卷第五十一 论一 东方曼倩 非有先生论 王子渊 四子讲德论 并序...
  6. jpa 连接多个mysql 数据库_SpringBoot 连接多个数据库
  7. C#------引用System.Data.Entity后DbContext依然无法继承解决方法
  8. Maven中DependencyManagement和Dependencies区别
  9. 动态生成 fastCall(易语言 调用WKE浏览器)
  10. JAVA-幂等性(一):http幂等性
  11. 判断质数和合数python代码_【奇技淫巧】利用正则进行需要整除操作的判断,如:奇偶性,质数合数...
  12. ElasticSearch Groovy 沙盒绕过 代码执行漏洞 CVE-2015-1427 漏洞复现
  13. Oblivious Data Structures学习笔记
  14. 《数据结构与算法实战-周强-2.2》——大炮打蚊子
  15. 思想一年一年进步才好
  16. 外卖点餐平台系统源码
  17. ThinkPad.E440_安装固态硬盘
  18. Android清理内存
  19. 直升机航模飞行前检查(通电检查)(电)
  20. 序列比对算法-计算生物学

热门文章

  1. 上市公司发行股票的基本要求是怎样的
  2. 【QT】资源文件导入
  3. Android鬼点子-通过Google官方示例学NDK(4)
  4. Taylor Series(泰勒级数)
  5. 固高控制卡学习5 --数字 IO
  6. Win11/10家庭版禁用Edge的inprivate浏览功能
  7. 需求管理计划和范围管理计划的区别
  8. Android gradle implementation与api的区别及引用传递
  9. C编程规范的心得分享
  10. 祝贺 弓叶科技荣获中国节能环保产品、绿色环保推广产品认证