微信小程序分享海報(bào)生成的實(shí)現(xiàn)方法
為了吸引更多的用戶,設(shè)計(jì)好一個(gè)分享海報(bào)還是很有必要的。而小程序要生成一個(gè)海報(bào)還是有點(diǎn)坑的,下面分享下我們打卡小程序的一些經(jīng)驗(yàn)。
分享海報(bào)的效果圖如下:
制作要求:
- 海報(bào)以彈窗形式展現(xiàn),各種手機(jī)型號(hào)都可以正常顯示
- 海報(bào)的內(nèi)容由背景圖、日期、隨機(jī)的名言警句、活動(dòng)的二維碼及用戶的參加活動(dòng)的信息
- 海報(bào)保存的圖片大小為 iphone 6 的兩倍圖(750 * 1334)
由于看到的彈窗圖片與保存的圖片是兩種大小,所以一開始看了些網(wǎng)上的其他教程,建議是搞兩個(gè) canvas 一個(gè)大的一個(gè)小的。實(shí)際過(guò)程中,采用了一個(gè)大的 canvas ,讓其偏離視窗顯示區(qū)域(不可見)并生成臨時(shí)文件,彈窗的圖片再使用 img 組件,引入臨時(shí)文件,設(shè)置其高度;而保存的時(shí)候則直接下載臨時(shí)文件。
雖然是實(shí)現(xiàn)了,但是后來(lái)在優(yōu)化的過(guò)程中,這個(gè)方案也重新設(shè)計(jì)了。下面具體介紹下優(yōu)化過(guò)的方案:
- 優(yōu)先使用一個(gè) canvas 繪制二維碼;
- 彈窗的圖片即為一個(gè) canvas;
- 分享的圖片為該 canvas 導(dǎo)出的大圖片;
- 為了達(dá)到最佳效果,名言警句的換行錄入時(shí)就處理好。
設(shè)計(jì)彈窗的圖片比例
由于最后海報(bào)的圖片大小為 iphone 6 的兩倍圖(750 * 1334),所以這里彈窗的圖片也即是 canvas 的大小,設(shè)計(jì)為對(duì)應(yīng)的尺寸的某個(gè)比例。
彈窗圖片的高度 = 視窗的高度 - 上下留白 - 按鈕的高度 - 圖片與按鈕的距離
imgHeight = 100vh - 40rpx * 2 - 50rpx - 15rpx彈窗圖片的寬度 / 彈窗圖片的高度 = 750 / 1334
彈窗圖片的寬度 = (750 / 1334) * 彈窗圖片的高度
由于像素只能是整數(shù),所以這樣繪制出來(lái)的圖片可能底部會(huì)有1px的空白,所以在設(shè)置高度的時(shí)候可以再減掉 1px,這不會(huì)影響視覺(jué)效果。
繪制背景圖
如果是網(wǎng)絡(luò)圖片,繪制背景圖之前一定要先下載該圖片,可通過(guò) wx.getImageInfo
或 wx. downloadFile
下載圖片,下載成功后將其塞進(jìn)臨時(shí)地址,然后使用 wx canvas 的 drawImage
繪制。注意圖片的格式不能是 gif。
繪制二維碼
繪制二維碼換了好幾個(gè)庫(kù),每個(gè)在安卓下面生成的二維碼都會(huì)頻現(xiàn)失敗。查了好些資料,說(shuō)是安卓繪制的時(shí)候要設(shè)置個(gè) setTimeout,于是最終選擇了weapp-qrcode,修改了其繪制的函數(shù),增加了setTimeout(還真別說(shuō),加上二維碼繪制就成功了)。
ctx.draw(false, function (e) { setTimeout(() => { // 修改增加的 options.callback && options.callback(e) }, 20); })
另:目前這些繪制小程序二維碼的庫(kù)都是在一個(gè)單獨(dú)的新 canvas 中完成的,只要對(duì)源碼稍作修改,就可以提供另一個(gè)接口,直接在一個(gè)現(xiàn)有的 canvas (表示 canvas 中一開始繪制了其他內(nèi)容) 中繪制。
如果二維碼掃不出來(lái),則表示二維碼繪制出了問(wèn)題。但安卓微信 6.7.2 版本本身有個(gè) bug,二維碼本身是沒(méi)有問(wèn)題,它卻不能識(shí)別。不過(guò)升級(jí)下微信版本就好了。
保存圖片
- 先要獲取用戶是否開啟用戶授權(quán)相冊(cè)
- 如果沒(méi)有權(quán)限,則彈窗提示開通權(quán)限,如果有權(quán)限直接調(diào)用
saveImageToPhotosAlbum
接口保存圖片 - 如果彈窗提示接受開通權(quán)限,則調(diào)用
saveImageToPhotosAlbum
接口保存圖片 - 如果彈窗提示拒絕則再次彈窗是否去設(shè)置開通權(quán)限,如果是則進(jìn)入設(shè)置權(quán)限
性能注意
經(jīng)實(shí)踐測(cè)試整個(gè)繪制過(guò)程其實(shí)還是很快的,但是如果有保存臨時(shí)文件操作( wx.canvasToTempFilePath
),那么這個(gè)操作一般得占一半時(shí)間左右。除此之外,有個(gè) measureText api,用來(lái)測(cè)量文字的長(zhǎng)度,這個(gè)在實(shí)現(xiàn)自動(dòng)換行的時(shí)候用得到,但是比較耗性能。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布者-訂閱者模式)
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布者-訂閱者模式),本文詳細(xì)的講解了JavaScript中的觀察者模式,需要的朋友可以參考下2014-09-09JavaScript正則替換HTML標(biāo)簽功能示例
這篇文章主要介紹了JavaScript正則替換HTML標(biāo)簽功能,結(jié)合完整實(shí)例形式詳細(xì)分析了javascript正則替換字符串操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03科訊商業(yè)版中用到的ajax空間與分頁(yè)函數(shù)
科訊商業(yè)版中用到的ajax空間與分頁(yè)函數(shù)...2007-09-09單行 JS 實(shí)現(xiàn)移動(dòng)端金錢格式的輸入規(guī)則
這篇文章主要介紹了單行 JS 實(shí)現(xiàn)移動(dòng)端金錢格式的輸入規(guī)則,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05