微信小程序使用canvas自適應(yīng)屏幕畫海報(bào)并保存圖片功能
小程序canvas的API并沒有像其他的一樣支持小程序獨(dú)有的 rpx 自適應(yīng)尺寸單位,在繪制內(nèi)容時(shí)所應(yīng)用的單位仍然是 px,那么如何實(shí)現(xiàn)不同尺寸屏幕的自適應(yīng)呢?
我們的在開發(fā)中常用的參考屏幕尺寸(iPhone6)為:375*667;
那么想要適應(yīng)其他尺寸的屏幕時(shí)只需按照iPhone6的繪制大小按比例進(jìn)行換算即可:
獲取系統(tǒng)屏幕尺寸
先利用wx.getSystemInfo (獲取系統(tǒng)信息)的API獲取屏幕寬度,然后除iPhone6的屏幕寬度,即可得到相對單位
// 在onLoad中調(diào)用
const that = this
wx.getSystemInfo({
success: function (res) {
console.log(res)
that.setData({
model: res.model,
screen_width: res.windowWidth/375,
screen_height: res.windowHeight
})
}
})
在繪制方法中將參數(shù)乘以相對單位即可實(shí)現(xiàn)自適應(yīng)
這里的rpx是相對不同屏幕寬度的相對單位,測量出得實(shí)際寬度,就是實(shí)際測出的px像素值*rpx就可以了;之后無論實(shí)在iPhone5,iPhone6,iPhone7...都可以進(jìn)行自適應(yīng)。
這里的html也要?jiǎng)討B(tài)的設(shè)置寬和高
<canvas canvas-id="PosterCanvas" style="width:{{screen_width*375+'px'}}; height:{{screen_height*1.21+'px'}}"></canvas>
drawPoster(){
let ctx = wx.createCanvasContext('PosterCanvas'),that=this.data;
console.log('手機(jī)型號(hào)' + that.model,'寬'+that.screen_width*375,'高'+ that.screen_height)
let rpx = that.screen_width
//這里的rpx是相對不同屏幕寬度的相對單位,實(shí)際的寬度測量,就是實(shí)際測出的px像素值*rpx就可以了;之后無論實(shí)在iPhone5,iPhone6,iPhone7...都可以進(jìn)行自適應(yīng)。
ctx.setFillStyle('#1A1A1A')
ctx.fillRect(0, 0, rpx * 375, that.screen_height * 1.21)
ctx.fillStyle = "#E8CDAA";
ctx.setFontSize(29*rpx)
ctx.font = 'normal 400 Source Han Sans CN';
ctx.fillText('Hi 朋友', 133*rpx,66*rpx)
ctx.fillText('先領(lǐng)禮品再買車', 84*rpx, 119*rpx)
ctx.drawImage('../../img/sell_index5.png', 26*rpx, 185*rpx, 324*rpx, 314*rpx)
ctx.drawImage('../../img/post_car2x.png', 66 * rpx, 222 * rpx, 243 * rpx, 145 * rpx)
ctx.setFontSize(16*rpx)
ctx.font = 'normal 400 Source Han Sans CN';
ctx.fillText('長按掃描獲取更多優(yōu)惠', 108*rpx, 545*rpx)
ctx.drawImage('../../img/code_icon2x.png', 68 * rpx, 575 * rpx, 79 * rpx, 79 * rpx)
ctx.drawImage('../../img/code2_icon2x.png', 229 * rpx, 575 * rpx, 79 * rpx, 79 * rpx)
ctx.setStrokeStyle('#666666')
ctx.setLineWidth(1*rpx)
ctx.lineTo(187*rpx,602*rpx)
ctx.lineTo(187*rpx, 630*rpx)
ctx.stroke()
ctx.fillStyle = "#fff"
ctx.setFontSize(13 * rpx)
ctx.fillText('xxx科技汽車銷售公司', 119 * rpx, 663 * rpx)
ctx.fillStyle = "#666666"
ctx.fillText('朝陽區(qū)·望京xxx科技大廈', 109 * rpx, 689 * rpx)
ctx.setFillStyle('#fff')
ctx.draw()
},
保存到相冊
很簡單就是在畫完圖片之后的draw回調(diào)函數(shù)里調(diào)用canvasToTempFilePath()生產(chǎn)一個(gè)零時(shí)內(nèi)存里的鏈接,然后在調(diào)用saveImageToPhotosAlbum()就可以了;其中牽扯到授權(quán),如果你第一次拒絕了授權(quán),你第二次進(jìn)入的時(shí)候在iphone手機(jī)上是不會(huì)再次提醒你授權(quán)的,這時(shí)就需要你手動(dòng)調(diào)用了;以下附上代碼!
ctx.draw(true, ()=>{
// console.log('畫完了')
wx.canvasToTempFilePath()({
x: 0,
y: 0,
width: rpx * 375,
height: that.screen_height * 1.21,
canvasId: 'PosterCanvas',
success: function (res) {
// console.log(res.tempFilePath);
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: (res) => {
console.log(res)
},
fail: (err) => { }
})
}
})
})
拒絕授權(quán)后再次提醒授權(quán)的代碼
mpvue.saveImageToPhotosAlbum({
filePath: __path,
success(res) {
mpvue.showToast({
title: '保存成功',
icon: 'success',
duration: 800,
mask:true
});
},
fail(res) {
if (res.errMsg === "saveImageToPhotosAlbum:fail:auth denied" || res.errMsg === "saveImageToPhotosAlbum:fail auth deny" || res.errMsg === "saveImageToPhotosAlbum:fail authorize no response") {
mpvue.showModal({
title: '提示',
content: '需要您授權(quán)保存相冊',
showCancel: false,
success:modalSuccess=>{
mpvue.openSetting({
success(settingdata) {
// console.log("settingdata", settingdata)
if (settingdata.authSetting['scope.writePhotosAlbum']) {
mpvue.showModal({
title: '提示',
content: '獲取權(quán)限成功,再次點(diǎn)擊圖片即可保存',
showCancel: false,
})
} else {
mpvue.showModal({
title: '提示',
content: '獲取權(quán)限失敗,將無法保存到相冊哦~',
showCancel: false,
})
}
},
fail(failData) {
console.log("failData",failData)
},
complete(finishData) {
console.log("finishData", finishData)
}
})
}
})
}
}
});
總結(jié)
以上所述是小編給大家介紹的微信小程序使用canvas自適應(yīng)屏幕畫海報(bào)并保存圖片功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
JavaScript實(shí)現(xiàn)點(diǎn)擊改變圖片形狀(transform應(yīng)用)
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)點(diǎn)擊改變圖片形狀,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
uploadify在Firefox下丟失session問題的解決方法
在用uploadify上傳插件時(shí)遇到了一個(gè)問題,在讀session時(shí)認(rèn)為沒有權(quán)限而被攔截了,后來在后臺(tái)打印登錄時(shí)產(chǎn)生session的id和上傳時(shí)讀取session的id,解決方法如下,感興趣的朋友可以了解下2013-08-08
JavaScript詳解使用Promise處理回調(diào)地獄與async?await修飾符
這篇文章主要介紹了JavaScript使用Promise處理回調(diào)地獄與async?await修飾符,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
關(guān)于JavaScript中異步/等待的用法與理解
這篇文章主要給大家介紹了關(guān)于JavaScript中異步/等待的用法與理解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
js學(xué)習(xí)總結(jié)之DOM2兼容處理this問題的解決方法
這篇文章主要為大家詳細(xì)介紹了js學(xué)習(xí)總結(jié)之DOM2兼容處理this問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
js實(shí)現(xiàn)右下角可關(guān)閉最小化div(可用于展示推薦內(nèi)容)
使用Javascript實(shí)現(xiàn)右下角可關(guān)閉最小化div,可以用于展示推薦內(nèi)容,完整源代碼如下,感興趣的各位可以參下哈,希望對大家有所幫助2013-06-06

