小程序canvas的API并沒(méi)有像其他的一樣支持小程序獨(dú)有的 rpx 自適應(yīng)尺寸單位,在繪制內(nèi)容時(shí)所應(yīng)用的單位仍然是 px,那么如何實(shí)現(xiàn)不同尺寸屏幕的自適應(yīng)呢?
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出原平免費(fèi)做網(wǎng)站回饋大家。
我們的在開(kāi)發(fā)中常用的參考屏幕尺寸(iPhone6)為:375*667;
那么想要適應(yīng)其他尺寸的屏幕時(shí)只需按照iPhone6的繪制大小按比例進(jìn)行換算即可:
獲取系統(tǒng)屏幕尺寸
先利用wx.getSystemInfo (獲取系統(tǒng)信息)的API獲取屏幕寬度,然后除iPhone6的屏幕寬度,即可得到相對(duì)單位
// 在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ù)乘以相對(duì)單位即可實(shí)現(xiàn)自適應(yīng)
這里的rpx是相對(duì)不同屏幕寬度的相對(duì)單位,測(cè)量出得實(shí)際寬度,就是實(shí)際測(cè)出的px像素值*rpx就可以了;之后無(wú)論實(shí)在iPhone5,iPhone6,iPhone7...都可以進(jìn)行自適應(yīng)。
這里的html也要?jiǎng)討B(tài)的設(shè)置寬和高
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是相對(duì)不同屏幕寬度的相對(duì)單位,實(shí)際的寬度測(cè)量,就是實(shí)際測(cè)出的px像素值*rpx就可以了;之后無(wú)論實(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)禮品再買(mǎi)車(chē)', 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('長(zhǎng)按掃描獲取更多優(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科技汽車(chē)銷(xiāo)售公司', 119 * rpx, 663 * rpx) ctx.fillStyle = "#666666" ctx.fillText('朝陽(yáng)區(qū)·望京xxx科技大廈', 109 * rpx, 689 * rpx) ctx.setFillStyle('#fff') ctx.draw() },
如果圖片是線上地址 ctx.drawImage()會(huì)出錯(cuò),不能畫(huà)出圖片
因?yàn)闀?huì)訪問(wèn)一個(gè)get請(qǐng)求,是一個(gè)異步操作,還沒(méi)等到get返回就執(zhí)行了tx.draw()繪制畫(huà)布。 解決方案 就只在 wx.downloadFile()中成功下載了圖片在進(jìn)行繪制畫(huà)布。
wx.downloadFile({ url: that.data.url, success(res) { if (res.statusCode === 200) { // 活動(dòng) ctx.drawImage(res.tempFilePath, 66 * rpx, 222 * rpx, 243 * rpx, 145 * rpx) // 二維碼 ctx.draw() } } })
保存到相冊(cè)
很簡(jiǎn)單就是在畫(huà)完圖片之后的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('畫(huà)完了') 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)保存相冊(cè)', 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)限失敗,將無(wú)法保存到相冊(cè)哦~', showCancel: false, }) } }, fail(failData) { console.log("failData",failData) }, complete(finishData) { console.log("finishData", finishData) } }) } }) } } });
至此就算完了,能幫到你就給點(diǎn)個(gè)贊吧!
代碼如下
https://gitee.com/jgl1210/lajifenlei
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。