微信小程序使用canvas畫布實現當前頁面截屏并分享 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

微信小程序使用canvas畫布實現當前頁面截屏并分享

發表時(shí)間:2021-1-5

發布人(rén):融晨科技

浏覽次數:258

有些時(shí)候需要(yào / yāo)再小程序中分享一些動态生成的(de)圖片,比如頁面截屏、商品卡片,虛拟卡券等等。但是(shì)小程序都沒有開放頁面截屏接口的(de),最多也(yě)就(jiù)是(shì)提供設備截屏事件監測的(de)API。

要(yào / yāo)解決這(zhè)個(gè)問題,目前除了(le/liǎo)canvas畫布合成,沒有其他(tā)什麽比較好的(de)解決方法。這(zhè)裏就(jiù)介紹下微信小程序中使用canvas來(lái)模拟頁面截屏并分享的(de)功能。具體代碼如下:

index.wxml

複制代碼
 1 <!--動态合成圖片的(de)畫布-->
 2 <canvas canvas-id="shareBox"></canvas>
 3 <!--動态合成圖片的(de)畫布end-->
 4 <!--頁面展示部分-->
 5 <view id="content">
 6   <view class="f0"><image class="goodsImg" src="/imgs/demo.jpg"></image></view>
 7   <view class="goodsTitle">
 8     <view class="goodsName">哈根達斯 298元冰淇淋蛋糕</view>
 9     <view class="goodsPrice">298.00元</view>
10   </view>
11 </view>
12 <!--頁面展示部分end-->
複制代碼

index.js

複制代碼
 1 const app = getApp()
 2 //尺寸比例計算(頁面寬度已750爲(wéi / wèi)準,即750*scale,所有尺寸乘以(yǐ)scale,即可兼容各種大(dà)小屏幕)
 3 const scale = wx.getSystemInfoSync().windowWidth / 750
 4 Page({
 5   data: {
 6     shareUrl: ""
 7   },
 8   onLoad(e) {
 9   },
10   onReady: function() {
11     this.drawShareImage()
12   },
13   drawShareImage() {
14     //繪制canvas圖片
15     //創建一個(gè)canvas對象
16     const ctx = wx.createCanvasContext('shareBox', this);
17     // this.drawNormalText(ctx, "canvas生成的(de)圖片", 0, 0, 30, '#ffffff', 'left', 'middle')
18     //商品主圖
19     var bgSize1 = 750 / 500
20     this.drawImage(ctx, "/imgs/demo.jpg", 20, 20, 710, 710 / bgSize1);
21     //繪制商品标題部分
22     var bgSize2 = 750 / 246
23     this.drawImage(ctx, "/imgs/detail-name-bg.jpg", 20, 490, 710, 710 / bgSize2);
24     //繪制分享标題
25     this.drawNormalText(ctx, "canvas生成的(de)圖片", 50, 548, 30, '#ffffff', 'left', 'middle')
26     this.drawNormalText(ctx, "230.00元", 50, 660, 30, 'red', 'left', 'middle')
27     this.drawNormalText(ctx, "230.00元", 50 + 1, 660, 30, 'red', 'left', 'middle')
28     this.drawNormalText(ctx, "230.00元", 50, 660 + 1, 30, 'red', 'left', 'middle')
29     this.drawNormalText(ctx, "230.00元", 50 + 1, 660 + 1, 30, 'red', 'left', 'middle')
30     //繪制canvas标記(繪制圓形并加陰影)
31     ctx.arc(120 * scale, 120 * scale, 80 * scale, 0, 5 * scale * Math.PI)
32     ctx.setFillStyle('#22aaff')
33     ctx.setShadow(0, 0, 20 * scale, "#aaaaaa")
34     ctx.fill()
35     this.drawNormalText(ctx, "Canvas", 118, 100, 30, 'white', 'center', 'middle')
36     this.drawNormalText(ctx, "合成", 118, 140, 30, 'white', 'center', 'middle')
37 
38     //繪制畫布,并在(zài)回調中獲取畫布文件的(de)臨時(shí)路徑  
39     var self = this
40     ctx.draw(true, function() {
41       wx.canvasToTempFilePath({
42         canvasId: 'shareBox',
43         success(res) {
44           console.log(res)
45           if (res.tempFilePath) {
46             self.setData({
47               shareUrl: res.tempFilePath
48             })
49             wx.setStorageSync("shareUrl", res.tempFilePath)
50           }
51         }
52       })
53     });
54   },
55   //繪制圖片封裝
56   drawImage(ctx, url, x, y, w, h) {
57     ctx.drawImage(url, x * scale, y * scale, w * scale, h * scale);
58   },
59   // 繪制隻有一行的(de)文字
60   drawNormalText(ctx, str, x, y, font, style, align, baseLine) {
61     ctx.setFontSize(font * scale);
62     ctx.setFillStyle(style);
63     ctx.setTextAlign(align);
64     ctx.setTextBaseline(baseLine);
65     ctx.fillText(str, x * scale, y * scale);
66   },
67   //onShareAppMessage(res) {}
68 })
複制代碼

注意事項:

1.canvas中并沒有類似rpx之(zhī)類的(de)自适應單位,所以(yǐ)需要(yào / yāo)提前定義好頁面尺寸比例,有利于(yú)實現不(bù)同屏幕兼容性。具體代碼如下:

const scale = wx.getSystemInfoSync().windowWidth / 750

2.canvas中的(de)所有尺寸以(yǐ)750爲(wéi / wèi)标準,即一般設計稿的(de)尺寸即可,實際繪制中所有尺寸乘以(yǐ)尺寸标準就(jiù)可以(yǐ)适應所有尺寸屏幕了(le/liǎo)。如有需要(yào / yāo),可以(yǐ)對某些繪制邏輯進行函數封裝,如文本、圖片。

複制代碼
 1   //繪制圖片封裝
 2   drawImage(ctx, url, x, y, w, h) {
 3     ctx.drawImage(url, x * scale, y * scale, w * scale, h * scale);
 4   },
 5   // 繪制隻有一行的(de)文字
 6   drawNormalText(ctx, str, x, y, font, style, align, baseLine) {
 7     ctx.setFontSize(font * scale);
 8     ctx.setFillStyle(style);
 9     ctx.setTextAlign(align);
10     ctx.setTextBaseline(baseLine);
11     ctx.fillText(str, x * scale, y * scale);
12   },

相關案例查看更多