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

手把手教你繪制小程序海報

這篇具有很好參考價值的文章主要介紹了手把手教你繪制小程序海報。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

海報分享功能在許多應(yīng)用中應(yīng)該是很常見的,因為它作為一種常用的應(yīng)用推廣和拉新的方式。

接下來看個實際的案例,如下:
手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

把任務(wù)拆解下:

  • 如何繪制海報
  • 如何把繪制后的海報保存到相冊

繪制海報

canvas 來繪制海報。 這里需要了解基本的 canvas api,不熟悉可以先去了解下相關(guān) Canvas API

  • 定義 canvas 元素
<template>
  <view class="poster-container">
    <canvas class="poster" canvas-id="posterId"></canvas>
    <button class="btn" @click="onSave">保存至相冊</button>
  </view>
</template>
  • 獲取 canvas 上下文對象
const context = uni.createCanvasContext('posterId');
  • 繪制背景圖片

圖片支持遠程圖片本地圖片,網(wǎng)絡(luò)圖片要通過 getImageInfo / downloadFile 先下載。

context.drawImage('/static/poster.png', 0, 0, 320, 410); // 繪制背景圖片
  • 繪制頭像和昵稱
    手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript
const avatarLeft = 185;
const avatarTop = 18;
const avatarWidth = 16;
const avatarHeight = 16;
context.drawImage(
  '/static/avatar.png',
  avatarLeft,
  avatarTop,
  avatarWidth,
  avatarHeight
);

從設(shè)計上來看頭像和昵稱是對齊的。
手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

直接按照設(shè)計稿距離來設(shè)定看看效果

const nickName = '墻頭草中的頂尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.fillText(nickName, nameLeft, 21, 96);

實際效果如下:
手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

發(fā)現(xiàn)與預(yù)期效果對應(yīng)不上,思考下這是為什么? 文字設(shè)置距離偏移的參考基線不是文字的頂部。

怎么驗證我的說法呢?可以 x 值設(shè)置為 0。

const nickName = '墻頭草中的頂尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.fillText(nickName, nameLeft, 0, 96); // 修改為 0

再看看效果:
手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

發(fā)現(xiàn)參考點幾乎是文字的底部,這就驗證了上面的結(jié)論。

怎么解決這個問題呢?

  • 獲取文本行的高度
  • 更改偏移的參考點

通常知道文本行實際占用的高度,需要知道其 line-height,上面并不知道其 line-height 值。canvas 本身并不直接支持line-height屬性,顯然沒辦法獲得相對準確的行高。

只能采用第二種方式,從 canvas 提供 API 來看,可以更改文本相行對齊的點。

const nickName = '墻頭草中的頂尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.setTextBaseline('top'); // 更改基線對齊點
context.fillText(nickName, nameLeft, 21, 96);

再來看看效果如下:
手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

接下來實現(xiàn)二維碼區(qū)域,主要白色背景 + 二維碼 + 文案

  • 白色背景區(qū)域
const rectWidth = 300;
const rectHeight = 89;
const rectLeft = 10;
const rectTop = 311;
context.setFillStyle('#ffffff');
context.fillRect(rectLeft, rectTop, rectWidth, rectHeight);

效果如下:

手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

  • 繪制二維碼
const qrcodeLeft = 20;
const qrcodeTop = rectTop + 10;
const qrcodeWidth = 68;
const qrcodeHeight = 68;
context.drawImage(
  '/static/qrcode.png',
  qrcodeLeft,
  qrcodeTop,
  qrcodeWidth,
  qrcodeHeight
);

二維碼這里直接采用現(xiàn)成圖片。實際上前端可以通過 weapp.qrcode.esm.js 在前端生成二維碼,再把它繪制上去。

  • 繪制多行文本
const startX = qrcodeLeft + qrcodeWidth + 15;
const text1 = '與志同道合的,他們一起成長';
context.setFillStyle('#161413');
context.setFontSize(14);
context.setTextBaseline('top');
context.fillText(text1, startX, rectTop + 29);
const text2 = '掃碼即可進入“Get一下”社區(qū)';
context.font = 'bold 14px Arial';
context.fillText(text2, startX, rectTop + 51);

看看最后的效果:

手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

左上角的部分沒有繪制,思路同頭像和昵稱一樣。 接下來只要把圖片保存到相冊即可。

保存到相冊

在小程序中,提供方法支持如下:

const onSave = () => {
  // 轉(zhuǎn)換為臨時路徑
  uni.canvasToTempFilePath({
    canvasId: 'posterId',
    success: (res) => {
      // 保存圖片到相冊
      uni.saveImageToPhotosAlbum({
        filePath: res.tempFilePath,
        success: () => {
          uni.showToast({
            title: '保存成功',
            icon: 'none',
          });
        },
        fail: () => {
          uni.showToast({
            title: '保存失敗',
            icon: 'none',
          });
        },
      });
    },
  });
};

這里基本上把一個海報繪制

擴展

  • 在繪制名稱時,用戶名稱長短不一至,如果名字過長時會出現(xiàn)什么效果呢
const nickName = '墻頭草中的頂尖的墻頭草中的頂尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.fillText(nickName, nameLeft, 21, 96);

手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

從效果來看,發(fā)現(xiàn)文字直接重疊。如果希望超出的部分能夠通過省略號來省略,是可以的

const nickName = '墻頭草中的頂尖的墻頭草中的頂尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.fillText(nickName, nameLeft, 21, 96);

let text = '';
const textArr = nickName.split('');
const ellipsisWidth = context.measureText('...').width; // 省略號的寬度
for (let i = 0; i < textArr.length; i++) {
  const temp = text + textArr[i];
  const metrics = context.measureText(temp);
  if (metrics.width + ellipsisWidth > 96) {
    text = text + '...';
    break;
  }
  text = temp;
}
context.fillText(text, nameLeft, 21, 96);

上面主要是通過 measureText 方法獲得文字對應(yīng)寬度,針對超出的部分采用省略號替代。當然,如果希望完整地顯示名字,也可以使用換行的方式。具體的實現(xiàn)方式,就留給大家自己思考和實現(xiàn)了。

處理后效果如下:
手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

  • 頭像實現(xiàn)圓角

默認采用圓角頭像,如果用戶上傳的頭像沒有進行裁剪處理,導致圖片出現(xiàn)非圓角情況,那么在海報上呈現(xiàn)的效果可能會有所差異。

先使用一個非圓角的圖片,代碼修改如下:

const avatarLeft = 185;
const avatarTop = 18;
const avatarWidth = 16;
const avatarHeight = 16;
context.drawImage(
  '/static/avatar-rect.png',
  avatarLeft,
  avatarTop,
  avatarWidth,
  avatarHeight
);

效果如下:
手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

現(xiàn)在對圖片處理一下:

const avatarLeft = 185;
const avatarTop = 18;
const avatarWidth = 16;
const avatarHeight = 16;
context.beginPath();
context.arc(
  avatarLeft + avatarWidth / 2,
  avatarTop + avatarHeight / 2,
  avatarWidth / 2,
  0,
  2 * Math.PI
);
context.closePath();
context.clip();
// 繪制圓形頭像
context.drawImage(
  '/static/avatar-rect.png',
  avatarLeft,
  avatarTop,
  avatarWidth,
  avatarHeight
);

效果如下:
手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

圓角是實現(xiàn)了,發(fā)現(xiàn)其他區(qū)域內(nèi)容都被裁剪了。 這是為什么? clip()改變了繪畫環(huán)境。ctx()調(diào)用后,所裁剪的區(qū)域就是 clip ()后的繪制環(huán)境,clip()之后的繪畫只能在裁剪區(qū)域中渲染,不能訪問畫布上的其他區(qū)域。

怎么處理這個問題呢 ? 通過 save()restore().

context.save(); // 暫存
context.beginPath();
context.arc(
  avatarLeft + avatarWidth / 2,
  avatarTop + avatarHeight / 2,
  avatarWidth / 2,
  0,
  2 * Math.PI
);
context.closePath();
context.clip();
// 繪制圓形頭像
context.drawImage(
  '/static/avatar-rect.png',
  avatarLeft,
  avatarTop,
  avatarWidth,
  avatarHeight
);
context.restore(); // 恢復(fù)

效果如下:
手把手教你繪制小程序海報,小程序,JavaScript,Vue,小程序,uni-app,javascript

總結(jié)

  • 通過 canvas + 小程序提供 API 實現(xiàn)海報繪制、保存海報到相冊
  • 優(yōu)化特殊情況下名稱和頭像的展示方式。

如果您有任何疑問,請隨時在評論區(qū)留言。文章來源地址http://www.zghlxwxcb.cn/news/detail-759633.html

到了這里,關(guān)于手把手教你繪制小程序海報的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 手把手教你寫出第一個C語言程序

    手把手教你寫出第一個C語言程序

    大家好,我是努力學習游泳的魚。這篇文章將手把手帶你寫出人生中第一個C語言程序, Hello, World 。在閱讀本文之前,建議先百度 visual studio ,在微軟官網(wǎng)下載并安裝VS的最新版本,安裝時記得勾選“C++桌面開發(fā)”選項。 2.1 環(huán)境 工欲善其事必先利其器,我們需要寫C語言代碼

    2024年02月10日
    瀏覽(23)
  • 手把手教你在ARM板上寫一個驅(qū)動程序!

    手把手教你在ARM板上寫一個驅(qū)動程序!

    摘要:搞嵌入式有兩個方向,一個是嵌入式軟件開發(fā)(MCU方向),另一個是嵌入式軟件開發(fā)(Linux方向)。其中MCU方向基本是裸機開發(fā)和RTOS開發(fā)。而Linux開發(fā)方向又分為驅(qū)動開發(fā)和應(yīng)用開發(fā)。其中應(yīng)用開發(fā)相比于驅(qū)動開發(fā)來說簡單一些,因為搞驅(qū)動你要和Linux內(nèi)核打交道。而我們普

    2024年02月01日
    瀏覽(32)
  • web分析-手把手教你怎么寫小程序事件分析

    web分析-手把手教你怎么寫小程序事件分析

    概述 小程序提供了自定義埋點方法,需要在業(yè)務(wù)代碼中新增對應(yīng)的代碼。 區(qū)別于小程序已有的頁面、用戶等埋點,web分析中的自定義的方法往往與業(yè)務(wù)場景相關(guān)。 本文會按步驟詳細介紹小程序的事件、事件分析、漏斗分析的創(chuàng)建流程。 該事件主要用于記錄用戶進入首頁之后

    2024年02月10日
    瀏覽(26)
  • 手把手教你如何在Linux下寫進度條小程序(附源碼)

    手把手教你如何在Linux下寫進度條小程序(附源碼)

    錄屏2023 進入ProgressBar這個目錄之后,使用ls命令查看是否創(chuàng)建成功 編寫makefile文件是為了,使用make命令構(gòu)建我們的.c文件,生成可執(zhí)行程序 把源碼復(fù)制粘貼到我們對應(yīng)的文件中 使用vim指令先打開頭文件 按小寫i,進入插入模式(Insert),直接拷貝上去 再按esc,直接輸入:wq(

    2024年02月04日
    瀏覽(27)
  • 【Golang項目實戰(zhàn)】手把手教你寫一個備忘錄程序|附源碼——建議收藏

    【Golang項目實戰(zhàn)】手把手教你寫一個備忘錄程序|附源碼——建議收藏

    博主簡介: 努力學習的大一在校計算機專業(yè)學生,熱愛學習和創(chuàng)作。目前在學習和分享:數(shù)據(jù)結(jié)構(gòu)、Go,Java等相關(guān)知識。 博主主頁: @是瑤瑤子啦 所屬專欄: Go語言核心編程 近期目標: 寫好專欄的每一篇文章 前幾天瑤瑤子學習了Go語言的基礎(chǔ)語法知識,那么今天我們就寫個

    2024年02月06日
    瀏覽(28)
  • 手把手教你打造自己的AI聊天機器人程序(訊飛星火API)

    手把手教你打造自己的AI聊天機器人程序(訊飛星火API)

    案例背景 最近發(fā)現(xiàn)科大的訊飛星火大模型可以申請API試用了,我一直想用chatgpt的API,一是因為收費買不起,二是因為網(wǎng)絡(luò)不方便..... 現(xiàn)在有了科大訊飛這個國內(nèi)免費的,當然要試試。 目前訊飛星火可以申請試用他們的模型API,但是只有200w的token上限(一下就能花光),而且

    2024年02月08日
    瀏覽(100)
  • 手把手教你實現(xiàn)微信小程序向特定用戶推送一次性訂閱消息

    手把手教你實現(xiàn)微信小程序向特定用戶推送一次性訂閱消息

    目前有一個已 微信認證 的 訂閱號 類型公眾號,一個 微信認證 小程序,小程序和公眾號互相關(guān)聯(lián)。尚不清楚是否必須微信認證或特定類型,因為目前沒遇到類型不匹配或相關(guān)的問題,發(fā)送微信小程序一次性訂閱消息的相關(guān)限制較少 1、功能介紹 訂閱消息推送位置:服務(wù)通知

    2024年02月08日
    瀏覽(28)
  • 手把手教你學習PyQT5:打造精美、功能強大的桌面應(yīng)用程序(更新中。。)

    手把手教你學習PyQT5:打造精美、功能強大的桌面應(yīng)用程序(更新中。。)

    PyQt5是一個用于創(chuàng)建圖形用戶界面(GUI)的Python庫。它是基于Qt庫的,Qt是一個用于創(chuàng)建跨平臺應(yīng)用程序的C++庫。PyQt5允許開發(fā)人員使用Python語言創(chuàng)建功能強大的應(yīng)用程序 PyQt5是一個用于創(chuàng)建圖形用戶界面(GUI)的Python庫。它是基于Qt庫的,Qt是一個用于創(chuàng)建跨平臺應(yīng)用程序的

    2024年02月08日
    瀏覽(24)
  • 前端小程序,手把手教你從零開始做一個酷炫的扭蛋機十連抽動畫效果

    前端小程序,手把手教你從零開始做一個酷炫的扭蛋機十連抽動畫效果

    其實沒有做多復(fù)雜的效果,連 canvas 都沒用上,都是一些簡單的平面變換,不過一段看似復(fù)雜的動畫往往都是幾個簡單的變換拼接而成,所以我們逐步拆解,很簡單的就能得到一個扭蛋機十連抽效果。 語言環(huán)境 我這邊使用的是?tailwindcss 和 ts,在 uniapp? + vue3 的情況下寫的小

    2024年04月13日
    瀏覽(107)
  • C#系列-手把手教你安裝 Visual Studio配置C#開發(fā)環(huán)境,創(chuàng)建第一個C#程序

    C#系列-手把手教你安裝 Visual Studio配置C#開發(fā)環(huán)境,創(chuàng)建第一個C#程序

    下載軟件 點擊此處開始下載 安裝依賴 選擇.NET desktop development 安裝完成,重啟電腦 解決方案1 找到這個目錄C:ProgramDataMicrosoftVisualStudioPackages 直接搜索VC_redist 找到這個VC_redist.x64.exe文件,一般會有兩個,直接全部雙擊安裝 返回VS installer 界面點擊:更多—修復(fù) 解決方

    2024年04月26日
    瀏覽(33)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包