/**
* 业务场景:
* 微信小程序利用canvas生成海报分享图片
* 唯一一个不同点在于,要根据返回list算canvas的高度(也就是高度是不确定的,图片可以无限长)
* */
// 页面结构
<block>
<view class="dire-content" wx:if="{{postersShow}}" catchtouchmove="donMove">
<scroll-view scroll-y class="dire-scroll">
<canvas class="inviteCanvas" canvas-id="inviteCanvas" style="width:{{canvasWidth}}rpx;height:{{canvasHeight}}rpx;"> </canvas>
<image class="canvasimg" src="{{canvasImg}}" style="width:630rpx;height:{{canvasHeight}}rpx"></image>
</scroll-view>
</view>
<view class="create-poster-wbtn" bindtap="saveInviteCard" wx:if="{{postersShow}}">保存到手机</view>
</block>
const app = getApp();
var that;
var articleApps = require('../../banyan/logics/articleApps');
var promise = require("../../vendor/lib/promise.min.js");
Page({
data: {
resultList: [],
img: "",
showModal: false, // 遮罩层
showWeekly: false, // 分享
postersShow: false, // 生成海报
canWidth: Number,
canHeight: Number
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
that = this;
let wkid = options.wkid;
// let wkid = 8;
// let title = "生命周期函数--监听页面加载生命周期函数--监听页面加载"
that.setData({
wkid: wkid,
title: options.title
// title: title
})
that.getWeeklyList(wkid);
// 扫码场景处理
var scene = options.scene ? decodeURIComponent(options.scene) : false;
console.log(options);
if (scene) {
let param = scene.split(',');
let wkidKey = param[0];
// let wkidValue = param[1];
if (param.length > 1 && wkidValue !== null) {
that.getWeeklyList(wkidKey);
} else {
wx.switchTab({
url: '/pages/index/index',
});
}
}
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
that.setData({
resultList: [],
img: "",
showModal: false,
showWeekly: false,
postersShow: false,
})
if (!app.globalData.userInfo) {
app.getCurrentUser(res => {
that.getWeeklyList(that.data.wkid)
}, 2);
} else {
that.getWeeklyList(that.data.wkid)
}
},
// 加载页面数据
getWeeklyList(id) {
let reqData = {
wkid: id
}
articleApps.weeklyList({
data: reqData
}, that, data => {
that.setData({
resultList: data.list,
img: data.qrcode
})
that.dowloadImgFiles(that.data.img);
});
},
// 显示分享弹框
share() {
that.setData({
showModal: true,
showWeekly: true
})
},
// 显示canvas海报
posters() {
that.setData({
showModal: true,
showWeekly: false,
postersShow: true,
})
that.getCanvasSize();
that.drawInviteCard();
},
// 关闭分享弹框
unShow() {
that.setData({
showModal: false,
showWeekly: false,
postersShow: false
})
},
// 下载图片
downloadImage: function (url) {
var ulpromise = new promise(function (resolve, reject) {
wx.downloadFile({
url: url,
success: function (res) {
resolve(res);
},
fail: function (e) {
reject(e);
console.log('download image failed');
}
});
});
return ulpromise;
},
// 下载图片到缓存
dowloadImgFiles(img) {
try {
var imgArr = [];
that.downloadImage(img).then(function (res) {
imgArr.push(res.tempFilePath);
that.data.imgArr = imgArr;
return that.downloadImage(img);
}.bind(this)).then(function (res) {
that.getCanvasSize();
that.drawInviteCard();
});
} catch (err) {
console.log(err)
that.setData({
loaded: true,
});
app.ulToast('加载失败', 0);
}
},
// 获取画布宽高
getCanvasSize() {
wx.getSystemInfo({
success(res) {
that.setData({
canWidth: res.windowWidth,
canHeight: res.windowHeight
})
}
});
},
// 绘制邀请卡画布
drawInviteCard(callback) {
let imgArr = that.data.imgArr;
let con = that.data.resultList;
// 文本list添加序号
for (let j = 0; j < con.length; j++) {
con[j].index = j;
}
let ctx = wx.createCanvasContext('inviteCanvas');
// 设置单个主体内容高度
let _height = 190;
// 绘制白色背景
ctx.setFillStyle('#fff');
ctx.fillRect(0, 0, that.changeRpx(630), (that.changeRpx(_height) * con.length + that.changeRpx(600)));
// ctx.clip(); //剪切矩形后 开始画画
ctx.fill();
that.setData({
canvasWidth: that.changeRpx(630) * 2,
// canvasHeight: Math.round((that.changeRpx(_height) * con.length + that.changeRpx(680)) * 2)
canvasHeight: (95 * con.length + 300) * 2
})
// 文本标题
// let title = "本周报告更新目录";
let title = that.data.title;
ctx.beginPath();
ctx.setFillStyle('#000');
ctx.font = "bold 16px Arial";
// ctx.fillText(title, that.changeRpx(60), that.changeRpx(104));
that.drawText(ctx, title, that.changeRpx(60), that.changeRpx(104), that.changeRpx(530), that.changeRpx(32), 1);
// 以下为研究中心本期更新内容
let title_two = "以下为研究中心本期更新内容";
ctx.beginPath();
ctx.setFontSize(that.changeRpx(28));
ctx.setFillStyle('#747474');
ctx.font = "nobold 14px Arial";
ctx.fillText(title_two, that.changeRpx(60), that.changeRpx(150));
// canvas主体内容
for (let i = 0; i < con.length; i++) {
// 标题
let con_title = con[i].index + 1 + '.' + con[i].Title;
ctx.beginPath();
ctx.setFillStyle('#000');
ctx.font = "bold 16px Arial";
that.drawText(ctx, con_title, that.changeRpx(60), that.changeRpx(_height) * i + that.changeRpx(260), that.changeRpx(530), that.changeRpx(40), 2);
// 内容
let con_content = con[i].Summary;
ctx.beginPath();
ctx.setFillStyle('#747474');
ctx.font = "nobold 14px Arial";
// 判断10的用意是因为第二行是摘要,要缩略与标题保持一致
if (i < 10) {
that.drawText(ctx, con_content, that.changeRpx(90), that.changeRpx(_height) * i + that.changeRpx(340), that.changeRpx(470), that.changeRpx(32), 3);
} else {
that.drawText(ctx, con_content, that.changeRpx(110), that.changeRpx(_height) * i + that.changeRpx(340), that.changeRpx(470), that.changeRpx(32), 3);
}
// // 设置文本之间距离
// let distance = that.changeRpx(160);
// // 线框
// ctx.moveTo(that.changeRpx(40), that.changeRpx(200) + i * distance);
// ctx.lineTo(that.changeRpx(600), that.changeRpx(200) + i * distance);
// ctx.lineTo(that.changeRpx(600), that.changeRpx(340) + i * distance);
// ctx.lineTo(that.changeRpx(40), that.changeRpx(340) + i * distance);
// ctx.lineTo(that.changeRpx(40), that.changeRpx(340) + i * distance);
// ctx.closePath(); //闭合路径
// ctx.lineWidth = 1;
// ctx.strokeStyle = '#F6F6F6';
// ctx.stroke();
}
// 小程序二维码
ctx.beginPath();
ctx.drawImage(imgArr[0], that.changeRpx(230), ((that.changeRpx(_height) * con.length) + that.changeRpx(260)), that.changeRpx(172), that.changeRpx(172));
ctx.draw();
setTimeout(() => {
that.downloadCanvasImg(0, 0, that.changeRpx(630), (that.changeRpx(_height) * con.length + that.changeRpx(600)), (that.changeRpx(630) * 2), ((that.changeRpx(_height) * con.length + that.changeRpx(630)) * 2));
}, 500);
},
/**
*
* @method downloadCanvasImg 把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径
* @param { Number } x 画布区域的左上角横坐标
* @param { Number } y 画布区域的左上角纵坐标
* @param { Number } width 画布区域的宽度
* @param { Number } height 画布区域的高度
* @param { Number } destWidth 图片的宽度
* @param { Number } destHeight 图片的高度
*/
downloadCanvasImg(x, y, width, height, destWidth, destHeight) {
wx.canvasToTempFilePath({
x: x,
y: y,
width: width,
height: height,
destWidth: destWidth,
destHeight: destHeight,
canvasId: 'inviteCanvas',
fileType: 'jpg',
quality: 2,
success(res) {
console.log(res)
let filePath = res.tempFilePath;
that.setData({
canvasImg: filePath
})
},
fail(err) {
console.log(err);
}
});
},
/**
*
* @method centerText canvas文本居中
* @param {*} ctx canvas对象
* @param {*} text 文字
* @param {*} fontSzie 字体
* @param {*} color 颜色
* @param {*} height 绘制高度
*/
centerText(ctx, text, fontSzie, color, height) {
ctx.font = fontSzie;
ctx.fillStyle = color;
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillText(text, ctx.width / 2, height);
},
/**
*
* @method drawText canvas文本超过隐藏
* @param {*} ctx canvas对象
* @param {*} text 文字
* @param {*} x X轴
* @param {*} y Y轴
* @param {*} maxWidth 文本宽度
* @param {*} lineHeight 行高
* @param {*} maxLine 显示行数
*/
drawText(ctx, text, x, y, maxWidth, lineHeight, maxLine) {
let arrText = text.split('');
let line = '';
let num = 1;
for (let n = 0; n < arrText.length; n++) {
let testLine = line + arrText[n];
let metrics = ctx.measureText(testLine);
let testWidth = metrics.width;
if (testWidth > maxWidth && n > 0) {
if (maxLine != undefined && num >= maxLine) {
ctx.fillText(line.substr(0, line.length - 1) + '...', x, y);
return num;
}
num++;
ctx.fillText(line, x, y);
line = arrText[n];
y += lineHeight;
} else {
line = testLine;
}
}
ctx.fillText(line, x, y);
return num;
},
// canvas圆角
// drawRoundRect()
drawRoundRect(ctx, x, y, width, height, radius) {
ctx.beginPath();
ctx.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 3 / 2);
ctx.lineTo(width - radius + x, y);
ctx.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
ctx.lineTo(width + x, height + y - radius);
ctx.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
ctx.lineTo(radius + x, height + y);
ctx.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
ctx.closePath();
},
// 转换rpx单位为px
changeRpx(rpx) {
return rpx * that.data.canWidth / 750;
},
// 保存图片
saveInviteCard(e) {
app.saveCanvasToAlbum(e, that, res => {
app.ulToast('保存成功', 1);
that.setData({
showModal: false,
showWeekly: false,
postersShow: false
});
});
},
})
//