国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

微信分享時自定義分享圖片

這篇具有很好參考價值的文章主要介紹了微信分享時自定義分享圖片。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

微信小程序頁面分享 自定義圖片,微信小程序,canvas,微信小程序,小程序微信小程序頁面分享 自定義圖片,微信小程序,canvas,微信小程序,小程序

? ? 在開發(fā)微信小程序時產品提出了一個需求,就是當用戶在閱讀一片文章想分享時:1.分享時的背景需要和當前頁面文章展示的背景一致(文章展示時背景是隨機的)。2:分享時分享的封面中的文案要和當前文章有關聯,就是分享時封面的標題需要和當前用戶看到的文章標題一致。3:當用戶點擊了分享的卡片,文章展示的背景要和分享時的封面背景一致。

需求解決方案分析:

? ?1 . 分享時使用文章的封面作為分享時的封面? ?? ? ?? ??

? ? ? ? ? 當時第一想到的解決方案就是使用文章的封面作為分享時的圖片,但是這樣會給文章的編寫帶來很大壓力,每一篇文章都設計一個封面 這個顯然是不現實的,當文章大量上架時估計UI該罵街了,而且還面臨一個問題就是 分享時的圖片要求的是5:4的比例 而我們文章封面是16:9 的封面顯示也不適合作為分享的封面使用,所以這張解決方案很快就被pass,就算上這樣實現了后期被推翻的可能性很大。? ? ? ? ??

? ? 2 . 使用canvas?繪制出分享時的封面

? ? ? 正當一籌莫展時看到 微信的api 中的?imageUrl 參數?

onShareAppMessage(Object object)

imageUrl   自定義圖片路徑,可以是本地文件路徑、代碼包文件路徑或者網絡圖片路徑。

那我們可不可以使用canvas?繪制出分享時的封面,再通過api 得到一個臨時的圖片地址imageUrl的參數呢?經過一番嘗試,發(fā)現是可以的。

index.wxml? ?

?定義一個5:4 的 canvas,這里要注意的時由于canvas 的層級很高,而我們繪制頁面時又不想讓用戶看到這個?canvas 這時我們可以給這個canvas 設置定位將位置設置到屏幕以外

<canvas type="2d" id="share" canvas-id="share" style="width: 750rpx;height: 600rpx;"></canvas>

?index.wxss

#share {
  position: absolute;
  top: -100000rpx;
}

index.js

    // 繪制分享的canvas
    _setShareImg() {
        let query = wx.createSelectorQuery()
        query.select('#share')
            .fields({
                node: true,
                size: true
            })
            .exec(async (res) => {
                // Canvas 對象
                const canvas = res[0].node
                // 渲染上下文
                const ctx = canvas.getContext('2d')
                // Canvas 畫布的實際繪制寬高
                const width = res[0].width
                const height = res[0].height
                canvas.width = width;
                canvas.height = height;
                console.log(canvas.width, canvas.height);
                // 將背景圖片繪制在canvas上
                await drawImageToCanvas.call(canvas, this.data.randomColor.bgUrl, 0, 0, width, height);
                // 繪制 健康百科 的圓角背景
                ctx.beginPath()
                ctx.fillStyle = '#2CBEAC'; // 設置填充顏色
                ctx.fillRect(getPositonX(70, width), getPositonY(50, height), getPositonX(150, width), getPositonY(50, height));
                // 封裝方法 繪制 健康百科
                fillText.call(ctx, "健康百科", "#fff", getPositonX(30, width), getPositonX(68 + 18, width), getPositonY(60, height))
                // 封裝方法 繪制 都是您想知道的 杏林藥安出品
                fillText.call(ctx, "都是您想知道的 ~ 杏林藥安出品", "#848484", getPositonX(34, width), getPositonX(70, width), getPositonY(122, height))
                // 限制標題最大的顯示字數 
                let title = this.data.title;
                if (title.length > 27) {
                    title = title.substr(0, 23) + '...'
                }
                // 封裝方法將文本分割成 固定數量  并返回集合數組
                const textArr = TextToArray(title, 9);
                const TextH = 206,
                    lineH = 100;
                textArr.forEach((item, index) => {
                    // 這里調用兩遍是為了實現字體加粗的效果 繪制時錯開了 0.5px 
                    fillText.call(ctx, item.join(""), "#333", getPositonX(70, width), getPositonX(70, width), getPositonY(TextH + lineH * index, height))
                    fillText.call(ctx, item.join(""), "#333", getPositonX(70, width), getPositonX(70 - 0.5, width), getPositonY(TextH + lineH * index - 0.5, height))
                })
                // 
                this.setData({
                    shareUrl: await canvasToTempFilePath(canvas)
                })
            })
    },

   onShareAppMessage() {
        return {
            title: '杏林藥安,專注藥學服務!',
            path: `/pages/plunge/index? 
            // randomIndex 當前隨機顏色的索引
            entityid=${this.data.entityid}&randomIndex=${this.data.randomIndex}`,
            imageUrl: this.data.shareUrl
        }
    },

utils.js文章來源地址http://www.zghlxwxcb.cn/news/detail-696665.html

/**
 * @deprecated 將一段字符串分割為 固定長度為一組的數組
 * @param {String} textString 
 * @param {Number} len 
 */
function TextToArray(textString, len) {
    var textArr = textString.split("");
    return textArr.reduce((pre, next, index, arr) => {
        return pre.concat([arr.splice(0, len)])
    }, []);
}
// canvas中繪制帶圓角的矩形
function drawRoundRectPath(cxt, width, height, radius) {
    cxt.beginPath(0);
    //從右下角順時針繪制,弧度從0到1/2PI  
    cxt.arc(width - radius, height - radius, radius, 0, Math.PI / 2);
    //矩形下邊線  
    cxt.lineTo(radius, height);
    //左下角圓弧,弧度從1/2PI到PI  
    cxt.arc(radius, height - radius, radius, Math.PI / 2, Math.PI);
    //矩形左邊線  
    cxt.lineTo(0, radius);
    //左上角圓弧,弧度從PI到3/2PI  
    cxt.arc(radius, radius, radius, Math.PI, Math.PI * 3 / 2);
    //上邊線  
    cxt.lineTo(width - radius, 0);
    //右上角圓弧  
    cxt.arc(width - radius, radius, radius, Math.PI * 3 / 2, Math.PI * 2);
    //右邊線  
    cxt.lineTo(width, height - radius);
    cxt.closePath();
}
/**
 * 
 * @param {String} text 文字
 * @param {String} color 字體顏色
 * @param {Number} fontSize  字號
 * @param {Number} pX X坐標
 * @param {Number} pY Y坐標
 * @param {Number} maxWidth 最大寬度 
 * @param {String} textBaseline 基線
 * @param {String} fontStyle 字體
 * 運行兩次fillText,x,y的值一次為 (x-0.5,y),一次為 (x,y-0.5),打出來的會變粗
 */
function fillText(text, color, fontSize, pX, pY, maxWidth = 690, textBaseline, fontStyle) {
    this.fillStyle = color;
    this.textBaseline = textBaseline ? textBaseline : "top" // 文本基線是 em 方框的頂端
    this.font = `${fontSize}px ${fontStyle?fontStyle:"PingFangSC-Semibold, PingFang SC"}`; //設置字體
    this.fillText(text, pX, pY, maxWidth ? maxWidth : 690); //填充文字
}
/**
 * 將canvas 轉成臨時圖片地址
 * @param {String} canvas id 
 */
function canvasToTempFilePath(canvas) {
    return new Promise((resolve, reject) => {
        wx.canvasToTempFilePath({
            canvas,
            fileType: "jpg",
            quality: 1,
            success(res) {
                resolve(res.tempFilePath)
            },
            fail() {
                reject(false)
            }
        })
    })
}

/**
 * 將圖片繪制在canvas
 * @param {String} url 圖片路徑
 * @param {Number} pX x 坐標
 * @param {Number} pY y 坐標 
 * @param {Number} width 寬度 
 * @param {Number} height 高度
 */
function drawImageToCanvas(url, pX, pY, width, height) {
    return new Promise((resolve, reject) => {
        const headerImg = this.createImage();
        headerImg.src = url; //微信請求返回頭像
        headerImg.onload = () => {
            this.getContext('2d').drawImage(headerImg, pX, pY, width, height);
            resolve()
        }
    })
}
module.exports = {
    TextToArray,
    drawRoundRectPath,
    fillText,
    canvasToTempFilePath,
    drawImageToCanvas
}

到了這里,關于微信分享時自定義分享圖片的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 微信小程序使用canvas畫布生成二維碼海報分享圖片(完整示例代碼)

    微信小程序使用canvas畫布生成二維碼海報分享圖片(完整示例代碼)

    canvas.js //獲取應用實例 const app = getApp() Page({ /** 頁面的初始數據 */ data: { // canvas _width: 0, //手機屏寬 _heigth: 0,//手機屏高 swiperHeight: 300,//主圖圖片高度 canvasType: false,//canvas是否顯示 loadImagePath: ‘’,//下載的圖片 imageUrl: ‘https://cos.myfaka.com/car/service/1.jpg’, //主圖網絡路徑 codeU

    2024年04月12日
    瀏覽(103)
  • 微信小程序canvas畫布圖片保存到相冊官方授權、自定義授權、保存

    目錄 關鍵步驟介紹 Component實現自定義授權彈框 wx.getSetting可以獲取授權信息。 wx.authorize首次授權時會打開彈框讓用戶授權,若用戶已選擇同意或拒絕,后續(xù)不會再顯示授權彈框。 如果授權信息顯示未進行相冊授權,則打開自定義彈框(show_auth: true)讓用戶選擇是否自行配置

    2024年01月16日
    瀏覽(30)
  • uniapp微信小程序全局分享和自定義頁面分享

    uniapp?實現微信小程序的全局 轉發(fā)給好友/分享到朋友圈 的功能。主要使用?Vue.js 的 全局混入?概念。 1.在項目根目錄創(chuàng)建mixins文件夾,然后創(chuàng)建全局分享的 js 文件。mixins/share.js? 2.在項目的?main.js?文件中引入該 share.js 文件并使用?Vue.mixin()?方法將之全局混入: 3.自定義頁

    2024年02月13日
    瀏覽(96)
  • 微信小程序如何自定義分享卡片文案和圖片

    微信小程序提供了onShareAppMessage方法,專門用來監(jiān)聽用戶點擊頁面內轉發(fā)按鈕(button 組件 open-type=\\\"share\\\")或右上角菜單“轉發(fā)”按鈕的行為,并自定義轉發(fā)內容。 注意:只有定義了此事件處理函數,右上角菜單才會顯示“轉發(fā)”按鈕 參數 類型 說明 最低版本 from String 轉發(fā)事

    2024年02月13日
    瀏覽(20)
  • 微信小程序獲取頁面節(jié)點方法簡介。canvas 滑動驗證碼 (前段,微信小程序,canvas2D)

    目錄 一.wx.createSelectorQuery():返回一個 SelectorQuery 對象實例。在自定義組件或包含自定義組件的頁面中,應使用?this.createSelectorQuery()?來代替 二.SelectorQuery.select(string selector)? 返回值是NodesRef 三.NodesRef? 四:執(zhí)行所有請求?NodesRef SelectorQuery.exec 五: canvas 滑動驗證碼(使用wx

    2024年02月09日
    瀏覽(28)
  • 微信小程序使用canvas繪制網絡圖片,使用canvas將圖片變成圓形

    微信小程序使用canvas繪制網絡圖片,使用canvas將圖片變成圓形

    以上的寫法 會造成某些圖標無法繪制上去, 解決方法是在網絡圖片中不斷嵌套,先繪制大圖片,再繪制小圖片的順序 網上說使用先下載到本地,再使用img.src加載,我嘗試過還是不行 長用在海報,需要將用戶的頭像畫到canvas圖片上,如: 其原理就是在圖片上面放一個圓

    2024年02月13日
    瀏覽(33)
  • 微信小程序canvas繪制自適應圖片,UniApp canvas繪制自適應圖片

    ?需求:畫布寬高為686 * 686 的正方形(可以進行調整根據自身需要來) ? ? ? ? ? ? 當圖片寬度大于高度時,對圖片寬度進行裁剪 ? ? ? ? ? ? ?當圖片高度大于寬度時,對圖片高度進行裁剪 ? ? ? ? ? ? ?我是用uniApp進行開發(fā)的,如果是小程序原生,直接把“uni” 改為 “

    2024年02月09日
    瀏覽(107)
  • 【小程序圖片水印】微信小程序圖片加水印功能 canvas繪圖

    【小程序圖片水印】微信小程序圖片加水印功能 canvas繪圖

    感覺有用的話,可以打賞一把么?一毛不嫌少,十塊不嫌多 更多詳細代碼請關注公眾號索?。▊渥ⅲ汗娞枺?/p>

    2024年04月29日
    瀏覽(35)
  • 微信小程序canvas生成圖片并保存

    微信小程序canvas生成圖片并保存

    需求: 做一個類似下圖的功能。圖片內容是動態(tài)的,用canvas畫出來,生成臨時圖片,再保存。 實現: ?其他使用,查看微信開發(fā)文檔 ?

    2024年02月13日
    瀏覽(23)
  • 微信小程序 新版canvas繪制圖片方法

    截至2022.12.23 修改日 微信小程序開發(fā)文檔介紹不全,導致很多用戶繪制圖片不顯示或失敗,因此寫下截至目前的可行方案 如果新手不熟悉canvas,先看下小程序官方文檔 可運行案例: wxml: js:

    2024年02月12日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包