小程序的分享有自己的机制,在页面点击右上角,或者页面中的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); // 文字字号:15px
shareCtx.fillText(nickname, 64, 31, 100);
shareCtx.setFillStyle('#999999');
shareCtx.setFontSize(12); // 文字字号:12px
shareCtx.fillText(college, 64, 52, 100);
shareCtx.setFillStyle('#070707');
shareCtx.setFontSize(15); // 文字字号:15px
drawLongText(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);
});
下面简述了一下我本次开发遇到的问题,有兴趣的可以看下,也许你也出现了同样的问题,这样我们也算同病相怜,哈哈哈~
必要的时候再显示,不必要的时候隐藏
wx:if可以控制一个组件的显示和隐藏,这个方法可以参考下。比如我之前的场景:某个页面有多个弹框,弹框出现的时候,绘制的canvas的图会显示在最上面,弹框盖不住那个图,这个时候,我发现将canvas图隐藏起来,弹框能正常显示,那就隐藏呗。哈哈哈,因为我的弹框很大,canvas图片隐藏之后用户也是感知不大的,弹框消失的时候再显示,完美~哈哈哈
移到窗口看不到的地方
这是我这次采用的方法。position:fixed; right:-100%; css里面添加两个属性,这样canvas就在窗口外面啦,可能此时canvas就会说:小伙砸,看不到我,看不到我,我就在这里,来抓我呀~~哈哈哈