支付寶小程序使用canvas畫布模擬頁面截屏並分享的實現


前邊已經寫過微信小程序使用canvas畫布實現當前頁面截屏並分享,有興趣的可以看下。

本文是從微信小程序中移植過來的,除了部分API調用不一樣,大部分代碼都是一樣的,具體代碼如下:

 1 const app = getApp()
 2 //尺寸比例計算(頁面寬度已750為准,即750*scale,所有尺寸乘以scale,即可兼容各種大小屏幕)
 3 let scale = ''
 4 my.getSystemInfo({
 5   success: (res) => {
 6     scale = res.windowWidth / 750
 7   }
 8 })
 9 Page({
10   data: {
11 
12   },
13   onLoad(e) {
14     my.getCurrentPageUrlWithArgs(e)
15     if (e.a) my.showToast({
16       content: "首頁參數測試" + e.a,
17     })
18   },
19   onReady: function () {
20     this.drawShareImage()
21   },
22   drawShareImage() {
23     //繪制canvas圖片
24     //創建一個canvas對象
25     const ctx = my.createCanvasContext('shareBox', this);
26     //商品主圖
27     var bgSize1 = 750 / 500
28     this.drawImage(ctx, "/imgs/demo.jpg", 20, 20, 710, 710 / bgSize1);
29     //繪制商品標題部分
30     var bgSize2 = 750 / 246
31     this.drawImage(ctx, "/imgs/detail-name-bg.jpg", 20, 490, 710, 710 / bgSize2);
32     //繪制分享標題
33     this.drawNormalText(ctx, "canvas生成的圖片", 50, 548, 30, '#ffffff', 'left', 'middle')
34     this.drawNormalText(ctx, "230.00元", 50, 660, 30, 'red', 'left', 'middle')
35     this.drawNormalText(ctx, "230.00元", 50 + 1, 660, 30, 'red', 'left', 'middle')
36     this.drawNormalText(ctx, "230.00元", 50, 660 + 1, 30, 'red', 'left', 'middle')
37     this.drawNormalText(ctx, "230.00元", 50 + 1, 660 + 1, 30, 'red', 'left', 'middle')
38     //繪制canvas標記(繪制圓形並加陰影)
39     ctx.arc(120 * scale, 120 * scale, 80 * scale, 0, 5 * Math.PI)
40     ctx.setFillStyle('#22aaff')
41     ctx.setShadow(0, 0, 20 * scale, "#aaaaaa")
42     ctx.fill()
43     this.drawNormalText(ctx, "Canvas", 118, 100, 30, 'white', 'center', 'middle')
44     this.drawNormalText(ctx, "合成", 118, 140, 30, 'white', 'center', 'middle')
45 
46     //繪制畫布,並在回調中獲取畫布文件的臨時路徑  
47     var self = this
48     ctx.draw(true, function () {
49       ctx.toTempFilePath({
50         success(res) {
51           let filePath = res.apFilePath
52           if (filePath) {
53             self.setData({
54               shareUrl: filePath
55             })
56             my.setStorageSync0("shareUrl", filePath)
57           }
58         }
59       })
60     });
61   },
62   //繪制圖片封裝
63   drawImage(ctx, url, x, y, w, h) {
64     ctx.drawImage(url, x * scale, y * scale, w * scale, h * scale);
65   },
66   // 繪制只有一行的文字
67   drawNormalText(ctx, str, x, y, font, style, align, baseLine) {
68     ctx.setFontSize(font * scale);
69     ctx.setFillStyle(style);
70     ctx.setTextAlign(align);
71     ctx.setTextBaseline(baseLine);
72     ctx.fillText(str, x * scale, y * scale);
73   },
74   /**
75    * 自定義分享配置
76    * bgImgUrl:采用canvas合成圖片
77    * path:使用封裝方法獲取當前頁面帶參數的完整path路徑
78    */
79   onShareAppMessage() {
80     return {
81       title: '頁面自定義分享',
82       desc: '使用canvas合成的圖片進行分享',
83       bgImgUrl: my.getStorageSync0("shareUrl"),
84       path: my.getStorageSync0("currentPageUrl")
85     }
86   }
87 })

注:

1.支付寶小程序分享默認是不帶參數的,所以使用了封裝函數獲取 getCurrentPageUrlWithArgs () 來獲取當前頁面帶參數的完整路徑;

2.支付寶小程序好些API用起來不怎么友好,所以進行了封裝擴展,上例中封裝的部分公用函數如下:

/**
 * 注冊全局常用方法
 * 1.方便調用
 * 2.與微信小程序一致,方便移植
 */
/**-----------------------全局API-------------------------- **/
//全局loading
my.loading = function (msg) {
  my.showLoading({
    content: msg || '加載中...'
  });
}
//全局toast
my.toast = function (msg, callback) {
  if (!msg) return;
  my.showToast({
    content: msg,
    type: 'none',
    success: () => {
      if (callback) callback()
    }
  })
}
/**-----------------------緩存-------------------------- **/
//封裝異步獲取緩存的方法
my.getStorage0 = function (key) {
  if (!key) return
  let res = my.getStorage({ key: key });
  return res.data
}

//封裝異步設置緩存的方法
my.setStorage0 = function (key, data) {
  if (!key) return
  my.setStorage({ key: key, data: data });
}
//封裝同步獲取緩存的方法
my.getStorageSync0 = function (key) {
  if (!key) return
  let res = my.getStorageSync({ key: key });
  return res.data
}

//封裝同步設置緩存的方法
my.setStorageSync0 = function (key, data) {
  if (!key) return
  my.setStorageSync({ key: key, data: data });
}

//將當前頁面路徑及參數保存到緩存中(登陸失效自動登陸后relaunch())
my.getCurrentPageUrlWithArgs = function (options) {
  const pages = getCurrentPages()//小程序API,可以直接調用
  const currentPage = pages[pages.length - 1]
  const url = currentPage.route
  let urlWithArgs = `/${url}?`
  for (let key in options) {
    const value = options[key]
    urlWithArgs += `${key}=${value}&`
  }
  urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1)
  my.setStorage0("currentPageUrl", urlWithArgs)
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM