摘要:注意如果用戶一開始沒有微信授權(quán),生成海報(bào)時(shí)又必須要用戶頭像不能使用默認(rèn)的話,那就只能老老實(shí)實(shí)走之前的流程了。組件名稱終端類型微信版本觸發(fā)方法關(guān)于的調(diào)用方法相冊權(quán)限需要你提供保存相冊權(quán)限獲取相冊權(quán)限成功,給出再次點(diǎn)擊圖片保存到相冊的提示。
海報(bào)生成示例
海報(bào)生成速度緩慢問題的優(yōu)化
微信頭像在app.js中預(yù)先加載緩存
多圖片異步加載
流程中斷處理
二次授權(quán)失敗的處理
請求或者下載圖片失敗處理
保存圖片可被壓縮
### [代碼片段]Canvas生成海報(bào)實(shí)戰(zhàn)demo
demo的微信路徑:https://developers.weixin.qq....
demo的ID:Q74OU3m57c9x
如果你裝了IDE工具,可以直接訪問上面的demo路徑
通過代碼片段將demo的ID輸入進(jìn)去也可添加:
海報(bào)生成速度緩慢問題的優(yōu)化原因分析:
主要的時(shí)間消耗在于getImageInfo網(wǎng)絡(luò)請求獲取頭像和下載圖片獲得臨時(shí)地址的過程,可以看到海報(bào)中有3張圖片(微信頭像、主圖、動態(tài)二維碼(對應(yīng)不同新聞的ID))需要下載,接下來主要就是對這3張圖的優(yōu)化
//app.js //可以在app.js中使用小程序默認(rèn)的全局變量,將頭像在加載的時(shí)候預(yù)先緩存 App({ onLaunch: function () { // 獲取用戶信息 wx.getSetting({ success: res => { if (res.authSetting["scope.userInfo"]) { // 已經(jīng)授權(quán),可以直接調(diào)用 getUserInfo 獲取頭像昵稱,不會彈框 wx.getUserInfo({ success: res => { this.globalData.userInfo = res.userInfo; //從返回值中獲取微信頭像地址 let WxHeader = res.userInfo.avatarUrl; wx.getImageInfo({ src: WxHeader,//下載微信頭像獲得臨時(shí)地址 success: res => { //將頭像緩存在全局變量里 this.globalData.avatarUrlTempPath = res.path; }, fail: res => { //失敗回調(diào) } }); } }) } } }) }, globalData: { userInfo: null, //如果用戶沒有授權(quán),無法在加載小程序的時(shí)候獲取頭像,就使用默認(rèn)頭像 avatarUrlTempPath: "./images/defaultHeader.jpg" } })
大致思路是: 加載App.js的時(shí)候
==> getSetting(判斷是否授權(quán))
==> getUserInfo(獲取頭像)
==> getImageInfo(生成臨時(shí)地址)
將需要的網(wǎng)絡(luò)請求在加載小程序的時(shí)候就異步完成,提前將臨時(shí)地址緩存在全局變量globalData中,這樣當(dāng)用戶進(jìn)入新聞頁面,點(diǎn)擊生成海報(bào)的時(shí)候就不需要在請求微信頭像,縮短了不少時(shí)間。
注意: 如果用戶一開始沒有微信授權(quán),生成海報(bào)時(shí)又必須要用戶頭像不能使用默認(rèn)的話,那就只能老老實(shí)實(shí)走之前的流程了。
let num = 0; //下載圖片計(jì)數(shù)器,假設(shè)一共三張圖片 //下載圖片1 wx.getImageInfo({ src: image_1, success: function (res) { //判斷是否是最后一張圖 if (num >= 2) { console.log("圖片全部下載完畢,可以繪制海報(bào)") } else { //如果不是最后一張圖則+1,繼續(xù) num++; } }, fail: function (res) { //失敗回調(diào) } }); //下載圖片2 wx.getImageInfo({ src: image_2, success: function (res) { //判斷是否是最后一張圖 if (num >= 2) { console.log("圖片全部下載完畢,可以繪制海報(bào)") } else { //如果不是最后一張圖則+1,繼續(xù) num++; } } }); ......
這里智庫君一開始是使用promise的同步辦法,但是發(fā)現(xiàn)3張圖片阻塞嚴(yán)重,如果一張圖片下載過慢,就會影響整個(gè)海報(bào)生成時(shí)間,所以可以改為添加計(jì)數(shù)器判斷的異步方法。
當(dāng)海報(bào)生成需要多張圖片的時(shí)候,完全可以異步的方式加載他們,通過計(jì)數(shù)器判斷是否是最后一張。
從圖中可以看出,整個(gè)海報(bào)生成過程有二次授權(quán):用戶信息授權(quán)獲取頭像和保存相冊授權(quán),非常可能因?yàn)橛脩舻恼`點(diǎn)或者拒絕而導(dǎo)致流程中斷。
主要分為二種情況:
需要的圖片沒有拿到,我們可以采取使用默認(rèn)圖片的方式替代。
保存相冊授權(quán)被拒絕,我們可以提示用戶“截圖保存”,由于當(dāng)前版本6.7.2+的wx.openSetting()被限制(無法直接被調(diào)用),如果必須要相冊權(quán)限,我們可以通過showModal觸發(fā)。
API/組件名稱 | 終端類型 | 微信版本 | 觸發(fā)方法 |
---|---|---|---|
openSetting | 6.7.2 | 2.3.0 | showModal |
// 關(guān)于 openSetting 的調(diào)用方法 wx.showModal({ title: "相冊權(quán)限", content: "需要你提供保存相冊權(quán)限", success: function (res) { if (res.confirm) { wx.openSetting({ success(settingdata) { console.log(settingdata) if (settingdata.authSetting["scope.writePhotosAlbum"]) { console.log("獲取 相冊 權(quán)限成功,給出再次點(diǎn)擊圖片保存到相冊的提示。"); } else { console.log("獲取 相冊 權(quán)限失敗,給出不給權(quán)限就無法正常使用的提示") } } }) } } }) //獲取相冊權(quán)限的流程處理 wx.saveImageToPhotosAlbum({ filePath: res.tempFilePath, //canvasToTempFilePath API生成的臨時(shí)地址 success: function (data) { console.log("提示圖片保存成功"); }, fail: function (err) { console.log(err); if (err.errMsg === "saveImageToPhotosAlbum:fail auth deny") { console.log("當(dāng)初用戶拒絕,再次發(fā)起授權(quán)") //調(diào)用上面說到的方法 wx.openSetting } else { console.log("提示:請截屏保存分享"); } }, complete(res) { console.log(res); } })保存圖片可被壓縮
小程序官方提供了一個(gè)API可以設(shè)置用戶保存圖片的質(zhì)量,僅針對JPG。
屬性 | 默認(rèn)值 | 說明 | 最低版本 |
---|---|---|---|
quality | 1.0 | 圖片的質(zhì)量,取值范圍為 (0, 1] | 1.7.0 |
wx.canvasToTempFilePath({ fileType: "jpg", canvasId: "canvasId", quality:0.8, //設(shè)置JPG保存質(zhì)量 80% success: res => { }, fail:res => { } }, this)
官方文檔地址:
https://developers.weixin.qq.com/miniprogram/dev/api/wx.canvasToTempFilePath.html?search-key=canvasToTempFilePath
如果有什么疑問或者糾錯(cuò)可以在下面給智酷君留言。
如果智酷君的分享能夠幫助到你,或者想持續(xù)獲得最新的全棧攻略
可以在segmentfault關(guān)注我,或在VX搜索“ Geek_Club ”或者“ 智酷方程式 ”
掃描關(guān)注公眾號
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104302.html
摘要:組件模板與組件數(shù)據(jù)結(jié)合后生成的節(jié)點(diǎn)樹,將被插入到組件的引用位置上。事件用于子組件向父組件傳遞數(shù)據(jù),可以傳遞任意數(shù)據(jù)。官方文檔往期回顧填坑手冊小程序生成海報(bào)一拆彈時(shí)刻小程序生成海報(bào)二 showImg(https://user-gold-cdn.xitu.io/2019/6/19/16b6e94bcde767a1?w=1069&h=652&f=jpeg&s=120912); 小程序目錄結(jié)構(gòu)...
摘要:往期回顧打怪升級小程序評論回復(fù)和發(fā)貼功能實(shí)戰(zhàn)二填坑手冊小程序生成海報(bào)一拆彈時(shí)刻小程序生成海報(bào)二填坑手冊小程序目錄結(jié)構(gòu)和組件使用心得 showImg(https://segmentfault.com/img/remote/1460000019733090?w=818&h=516); 在學(xué)習(xí)成長的過程中,常常會遇到一些自己從未接觸的事物,這就好比是打怪升級,每次打倒一只怪,都會獲得經(jīng)驗(yàn),讓...
摘要:發(fā)帖的功能只要理清思路,其實(shí)并不復(fù)雜,利用機(jī)器做內(nèi)容審查是關(guān)鍵,直接關(guān)系到小程序的整體安全。內(nèi)容檢查重點(diǎn)由于內(nèi)容安全對于小程序運(yùn)營至關(guān)重要,稍有不慎就容易導(dǎo)致小程序被封,所以在這塊的校驗(yàn)除了常規(guī)人工檢查外,我們還可以用到微信的內(nèi)容安全。 showImg(https://segmentfault.com/img/remote/1460000019955210?w=658&h=440); ...
摘要:解析進(jìn)到首頁其實(shí)關(guān)鍵字在本地就隨機(jī)取完了,在首頁中的方法中就通過緩存了要畫的元素,比如關(guān)鍵字這里是圖片關(guān)鍵字解析語也是圖片畢竟微信小程序的不支持字體等等。 一、Canvas應(yīng)用的背景(個(gè)人理解)及基礎(chǔ)語法 背景 從2012年開始,微信那個(gè)時(shí)候用戶的積累的量已經(jīng)非常大了,推出公眾號,當(dāng)然大屏智能手機(jī)在那個(gè)時(shí)候也流行,傳統(tǒng)的大眾媒體逐步消亡,像微信公眾號這樣的新媒體盛行。企業(yè)的廣告投入開始...
摘要:項(xiàng)目需求寫完有一段時(shí)間了,但是還是想回過來總結(jié)一下,一是對項(xiàng)目的回顧優(yōu)化等,二是對坑的地方做個(gè)記錄,避免以后遇到類似的問題。需求利用微信強(qiáng)大的社交能力通過小程序達(dá)到裂變的目的,拉取新用戶。摘要: 小程序開發(fā)必備技能啊... 原文:小程序如何生成海報(bào)分享朋友圈 作者:小白 Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 項(xiàng)目需求寫完有一段時(shí)間了,但是還是想回過來總結(jié)一下,一是對項(xiàng)目的回顧優(yōu)...
閱讀 1743·2023-04-25 19:37
閱讀 1316·2021-11-16 11:45
閱讀 2815·2021-10-18 13:30
閱讀 2776·2021-09-29 09:34
閱讀 1645·2019-08-30 15:55
閱讀 3121·2019-08-30 11:10
閱讀 1840·2019-08-29 16:52
閱讀 1006·2019-08-29 13:18