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