缘由分析:
主要的时间消耗在于getImageInfo网络请求获取头像和下载图片得到临时地址的过程,能够看到海报中有3张图片(微信头像、主图、动态二维码(对应不一样新闻的ID))须要下载,接下来主要就是对这3张图的优化html
//app.js
//能够在app.js中使用小程序默认的全局变量,将头像在加载的时候预先缓存
App({
onLaunch: function () {
// 获取用户信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已经受权,能够直接调用 getUserInfo 获取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
this.globalData.userInfo = res.userInfo;
//从返回值中获取微信头像地址
let WxHeader = res.userInfo.avatarUrl;
wx.getImageInfo({
src: WxHeader,//下载微信头像得到临时地址
success: res => {
//将头像缓存在全局变量里
this.globalData.avatarUrlTempPath = res.path;
},
fail: res => {
//失败回调
}
});
}
})
}
}
})
},
globalData: {
userInfo: null,
//若是用户没有受权,没法在加载小程序的时候获取头像,就使用默认头像
avatarUrlTempPath: "./images/defaultHeader.jpg"
}
})
复制代码
大体思路是: 加载App.js的时候 ==> getSetting(判断是否受权)
==> getUserInfo(获取头像)
==> getImageInfo(生成临时地址)
将须要的网络请求在加载小程序的时候就异步完成,提早将临时地址缓存在全局变量globalData中,这样当用户进入新闻页面,点击生成海报的时候就不须要在请求微信头像,缩短了很多时间。
注意: 若是用户一开始没有微信受权,生成海报时又必需要用户头像不能使用默认的话,那就只能老老实实走以前的流程了。canvas
let num = 0; //下载图片计数器,假设一共三张图片
//下载图片1
wx.getImageInfo({
src: image_1,
success: function (res) {
//判断是不是最后一张图
if (num >= 2) {
console.log("图片所有下载完毕,能够绘制海报")
} else {
//若是不是最后一张图则+1,继续
num++;
}
},
fail: function (res) {
//失败回调
}
});
//下载图片2
wx.getImageInfo({
src: image_2,
success: function (res) {
//判断是不是最后一张图
if (num >= 2) {
console.log("图片所有下载完毕,能够绘制海报")
} else {
//若是不是最后一张图则+1,继续
num++;
}
}
});
......
复制代码
这里智库君一开始是使用promise的同步办法,可是发现3张图片阻塞严重,若是一张图片下载过慢,就会影响整个海报生成时间,因此能够改成添加计数器判断的异步方法。
当海报生成须要多张图片的时候,彻底能够异步的方式加载他们,经过计数器判断是不是最后一张。小程序
从图中能够看出,整个海报生成过程有二次受权:用户信息受权获取头像和保存相册受权,很是可能由于用户的误点或者拒绝而致使流程中断。api
主要分为二种状况:promise
API/组件名称 | 终端类型 | 微信版本 | 触发方法 |
---|---|---|---|
openSetting | 6.7.2 | 2.3.0 | showModal |
// 关于 openSetting 的调用方法
wx.showModal({
title: '相册权限',
content: '须要你提供保存相册权限',
success: function (res) {
if (res.confirm) {
wx.openSetting({
success(settingdata) {
console.log(settingdata)
if (settingdata.authSetting['scope.writePhotosAlbum']) {
console.log('获取 相册 权限成功,给出再次点击图片保存到相册的提示。');
} else {
console.log('获取 相册 权限失败,给出不给权限就没法正常使用的提示')
}
}
})
}
}
})
//获取相册权限的流程处理
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath, //canvasToTempFilePath API生成的临时地址
success: function (data) {
console.log("提示图片保存成功");
},
fail: function (err) {
console.log(err);
if (err.errMsg === "saveImageToPhotosAlbum:fail auth deny") {
console.log("当初用户拒绝,再次发起受权")
//调用上面说到的方法 wx.openSetting
} else {
console.log("提示:请截屏保存分享");
}
},
complete(res) {
console.log(res);
}
})
复制代码
小程序官方提供了一个API能够设置用户保存图片的质量,仅针对JPG。缓存
属性 | 默认值 | 说明 | 最低版本 |
---|---|---|---|
quality | 1.0 | 图片的质量,取值范围为 (0, 1] | 1.7.0 |
wx.canvasToTempFilePath({
fileType: 'jpg',
canvasId: 'canvasId',
quality:0.8, //设置JPG保存质量 80%
success: res => {
},
fail:res => {
}
}, this)
复制代码
官方说明: developers.weixin.qq.com/miniprogram…bash
demo的微信路径:developers.weixin.qq.com/s/Q74OU3m57…微信
demo的ID:Q74OU3m57c9x网络
若是你装了IDE工具,能够直接访问上面的demo路径app
经过代码片断将demo的ID输入进去也可添加:
若是智酷君的分享可以帮助到你,或者想持续得到最新的全栈攻略
能够关注个人掘金号“ 智酷方程式 ”
也可在微信 搜索“ Geek_Club ”或者“ 智酷方程式 ”
扫描二维码关注公众号哟👇